九C语法的外围基础.docx
- 文档编号:1137770
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:14
- 大小:36.20KB
九C语法的外围基础.docx
《九C语法的外围基础.docx》由会员分享,可在线阅读,更多相关《九C语法的外围基础.docx(14页珍藏版)》请在冰点文库上搜索。
九C语法的外围基础
九.C++语法的外围基础
⒈新的语法规定与新算符
1文件扩展名等的规定
目前使用的C++标准为ISO-14882:
1998。
该标准规定的C++源程序文件扩展名为.CPP,头文件没有扩展名,为兼容前一代标准,编译系统仍支持扩展名为.H或.HPP的头文件,但若使用旧标准,则不能得到命名空间的支持。
在不同的C++编译系统中都支持本标准。
但因在不同的操作系统环境下运行,(标准)输入/输出要依赖相应系统的支持,所以会要求一些特别的编译(连接)设置(如在VC中最接近标准C++的编译设置就是空的Win32控制台应用程序类型,而不推荐选择.Net控制台应用程序类型)。
C#语言源代码文件的扩展名为.CS。
C#语言的语法和符号体系与JAVA语言非常接近,一个C#程序内不能没有类的声明。
C#语言的另外一个特点是数据类型要求严格匹配(如取消了将数组与指针等价的概念);关键字的大小写要求比C++语言的语法还要严厉。
总之,C#语言的灵活性要小于C++语言。
2命名空间(Namespace)
命名空间是独立确定数据作用域的存储空间。
无论何种结构的数据都要归属于某个命名空间所划定的存储空间内。
这在与程序等价的概念上是一个完美的补充。
在一个命名空间内可以声明任何类型的数据、类和类对象。
不同的命名空间语句可以嵌套(但不能将命名空间嵌套在其成员中,如将命名空间定义在类中等),相同命名空间内的不同成员定义语句可以间断排列。
若没有使用指定的命名空间,则所定义的数据、类和类对象都属于全局命名空间。
全局命名空间无须指明。
C++语法:
namespace名称{数据与类声明};
C#语法:
namespace名称{类声明};
例1:
在C++语言内不同命名空间内的同名数据
namespacea
{
inti;
namespacec{inti;};
};
namespaceb{inti;};
namespacea{intk;};
voidmain()
{
a:
:
i=0;/*本行内的:
:
为C++的域连接算符*/
a:
:
c:
:
i=0;
a:
:
k=0;
}
C++编译系统所使用的数据被安排在诸如std、system等系统命名空间内。
与此相对应的C#语言编译系统所使用系统命名空间是System。
在使用C++编码中使用最广泛的系统命名空间当属std,该命名空间中声明了标准的系统输入和输出的全部数据和类对象。
由于标准的系统输入和输出的数据会被频繁引用,为了减少反复出现的域连接算符,可以在恰当的位置使用usingnamespace语句指定默认的系统命名空间(见例3)。
相比较之下,C#语言中的命名空间的约束要多一些。
一个C#程序的启动入口函数必须被置于某个命名空间之内。
例2:
namespaceNS1
{
classA
{
inti;
staticvoidMain()
{inti;}
};
namespaceNS2
{
classB
{
inti;
};
}
}
3标准输入和输出符号
在目前的标准中,标准输入和输出操作是通过声明在std命名空间内系统保留数据名来实现的。
C++语法规定:
标准输入算符:
std:
:
cin>>“输入内容”>>…>>变量;
标准输出算符:
std:
:
cout<<“输出内容”<<…<<变量;
C#语法规定:
System.Console.Write(变量);
System.Console.Read();//按字符类型从键盘获取数据
由于程序中对此类的系统标准输入和输出操作频繁引用,为了减少编码的重复量,在C++语言中可以使用usingnamespace语句指定std为默认的系统命名空间;在C#语言中可以使用usingSystem语句指定System为默认的系统命名空间。
例3:
#include
usingnamespacestd;classA
voidmain(){
{staticvoidMain()
cout<<"$$$$$"< cout<<"*****"< }i=(char)Console.Read(); Console.Write(i); }//若要输入纯数值该当如何? }; 在此前的标准内,C++语言是将cin>>和cout<<当作一种系统标准流输入输出函数来安排的,由iostream头文件予以声明的。 但此种早期标准的头文件声明不能与新标准的头文件声明混用。 C#语言没有头文件声明,但仍有预处理语句,语法与C++相同。 4动态内存分配算符 由于使用面向对象方法的程序设计语言对内存空间的动态分配的频繁程度要求简化语言的相关语法的格式。 C++语法规定new算符等效于C语言中mal1oc一类的函数功能;free算符等效于C语言中free一类的函数功能。 其格式为: 指向对应类型的指针=new类型描述符; delete[]指向对应类型的指针;/*其中的[]可以省略*/ 例4: 仅占一个单元空间: int*p; p=newint;/*意即占一个字长*/ 例5: 仅占一个单元空间且赋初值: int*p; p=newint(20);/*意即占一个字长且赋予初值20*/ 例6: 占用多个单元可按数组或指针使用: int*p; p=newint[20];/*意即占20个字长单元*/ delete[]p; C#语言类似于Java语言,不提倡程序员使用动态内存分配技术来编写C#语言代码,但也又不象Java语言那样完全禁止使用此类技术。 凡要使用动态内存分配技术时,一定要在对应的成员函数声明上注明unsafe关键字。 此外,C#语言中的指针只能获取固定语句初始值设定项内的未固定表达式的地址。 例7: classA { staticunsafevoidMain() { inti=0; int*p=&i; *p+=1; Console.Write(*p); } }; 5引用类型(References) 在一个程序中用不同的变量名(内部以指针方式操作)可以访问另一个变量内容的数据类型描述称为引用。 这里的引用数据类型名又称为别名。 C++的语法格式是: 类型名&引用型函数名或变量名[=前已定义的(常)变量名]; C#语言中的引用类型实际上就是C++语言中的指针,只是没有特别指明而已。 例8: #include usingnamespacestd;{ voidmain()staticvoidMain() {{ inti;Strings1="Hello.\n"; int&j=i;/*j是i的别名*/Strings2=s1+“Microsoft.\n”; j=1;Console.Write(s1); i++;Console.Write(s2); cout< 2*/} }} 引用类型的最大好处是不单独占用额外内存,在实现上是用指针构造的。 C++语言中,当在两个函数相互利用参数访问时,可以利用引用类型大量减少的必须经由堆栈实现的数据交换的不足,同时也可以支持双向的内存写操作。 但在C#语言中要实现上述效果则需要在传递的每个参数前前缀ref关键字。 例10: #include usingnamespacestd;classA voidt(int&);{ voidmain()staticvoidrefp(refintip) {inti=0;{Console.Write(ip);ip++;} t(i);staticvoidMain() cout<<"i="< }inti=0; voidt(int&ip)refp(refi); {cout< } } 推论的引出: 引用类型的内部机制既然是指针,应能够用做函数的返回类型。 但C#语言不支持这个推论,因为其编译器不允许ref关键字出现在函数的返回类型之前。 试说出下例的输出结果: 例11: #include usingnamespacestd; int&t(int&); voidmain() { inti=0; cout<<++t(i);/*显示: ? */ } int&t(int&x) { return++x; } 6声明语法与行注释 C++和C#语法规定声明语句的位置可以很灵活,即需即用。 例12: inti=0; i++; for(intj=0;j<10;j++){…}//j的作用域与for语句相同 j=0; 行注释故名思意仅对一行做注释,符号为: // 7常量 与C语法不同的是常量可以用于变量的声明语句。 例: constinti=10;constinti=10; chart[i];char[]c=newchar[i]; ⒉函数的新变化 1声明的变化 C++语言中的一个函数要经过先声明(函数的主要特征—往返传送的数据类型的数量和类型)、再定义(函数的具体过程编写)和函数调用(FunctionCall)三个步骤。 但在C#语言中将(成员)函数的声明和定义合并在一个类中完成。 而且这两种语言中都不支持缺省返回类型。 此外,C++语言中的函数还出现了下述新变化: ⑴内联函数(Inlinefunction) 在函数的声明之前插入“inline”关键字后,该函数便称为内联函数。 相对应地处理是C++编译器将编译后得到的内联函数的全部二进制代码全部插入到主程序中的函数调用处,以提高调用速度。 C#语言没有内联函数技术。 例13: #include usingnamespacestd; inlineintadd(int,int); voidmain() { cout<<"2+2="< cout<<"100+50="< } inlineintadd(intx,inty){return(x+y);} ⑵缺省参数(Defaultparameter) 在C++程序中的两个函数发生相互调用时,实际传递的实参数量可以少于形参数量,而缺少的形参值用函数声明时定义的缺省值取代。 此种函数的参数声明便称为缺省参数。 C++语法规定缺省参数的声明必须自右向左排列。 C#语言的(成员)函数不允许使用缺省参数技术。 例14: #include usingnamespacestd; intsub(intx=1,inty=1) {returnx-y;} voidmain() {cout< ⑶重载(Overload) 在同一命名空间或作用域中,将含有不同的数量或类型的参数的一系列同名函数称为重载函数。 重载函数是软件重用的一种具体实现手段。 例15: #include usingnamespacestd; voiddsp(inti){cout<<”Valueis“< chardsp(charc){cout<<”Characteris”< voiddsp(…){……;} 例16: usingSystem; classA { staticStringrefp(refStrings) {returns=s+"Hello.";} staticintrefp(intx){returnx;} staticvoidrefp(){} staticvoidMain(){} }; 在C++语言中当重载函数与缺省参数联合使用时要特别注意发生技术奇异混淆的问题。 试指出下例存在的问题: #include usingnamespacestd; intfun(int=0); voidfun(); voidmain() { inti=10; cout< } ⑷函数模板(FunctionTemplate) C++语言将函数内部的参数、返回值以及内部数据类型声明为浮动的类型所得到的函数称为函数模板。 函数模板声明的语法格式为: template 上述格式中<…>内的内容称为模板参数表,其中的“class”是关键字。 替代类型标识符通常使用大写字母串,如: “template 由于不同的数据类型的带入,则经过编译,形成了事实上(不同数据类型)的重载函数。 如有两个以上的模板参数时,使用逗号分隔,如: “template 函数模板是计算机虚拟现实技术的一个具体应用。 C#语言不支持函数摸板技术 例17: #include usingnamespacestd; #definePI3.1415926535 template doubleCircle_Square(T); voidmain() { intr1=1; doubler2=2.0; cout<<"Thefirstcirclesquareis"< <<"Thesecondcirclesquareis"< } template doubleCircle_Square(TXx) { returnx*x*PI; } 2异常处理 程序在执行时经常会出现一些违反设计期望的异常情况(如除零),过去的解决方法多是由操作系统利用中断代为处理。 由于这种解决方法强行中止了应用程序的运行,一些大型的应用系统的开发商便提出在可以允许的范围内由应用程序自身来处理一般性的软件运行异常和错误。 因此C++语言便从PL/I语言中移植了异常处理的功能。 异常处理有三个部分构成。 异常检测的触发、异常检测的捕获和异常检测的处理。 它们分别对应了“try”、“throw”和“catch”三个关键字。 这三者的流程关系可用下图表示: 例18: #include usingnamespacestd; doubledivide(double,double); voidmain() { doublef1=0.0,f2=0.0; try { cout<<"f1/f2="< } catch(doubleerr) { cout<<"Adividednumberwasfound.Thenumberis"< } } doubledivide(doublex,doubley) { if(y==0.)throw1.0E-323;1.0E-323;//在Pentium芯片的计算机上实测的最小正值为: 1.0E-323 returnx/y; } 例19: usingSystem; classA { staticdoubledivide(doublex,doubley) { if(y==0.0) { System.Exceptionerr=newSystem.Exception(); throwerr; } returnx/y; } staticvoidMain() { doublef1=0.0,f2=0.0; try {Console.Write(divide(f1,f2));} catch(System.Exceptionerr) {Console.Write("Adividednumberwaszero.");} } }; 被throw语句扔出的数据实际上被压入了相应层的catch语句所对应的堆栈内,最后才被catch语句捕获到的。 当try语句出现嵌套时,情况可能会复杂了。 试讨论下例用C++语言编写的程序执行后的结果: 例20: #include usingnamespacestd; voidf(){throw"Isthatyoufred? \n";} voidg(){throw-1;} voidh() { try{f();g();} catch(char*ps){cout<<"***"< throw"yes,it'smeFred.\n"; } voidmain() { try{h();} catch(char*c){cout< catch(inti){cout< cout<<"finished! "; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 九C 语法的外围基础 语法 外围 基础