符号常量.docx
- 文档编号:14941865
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:42
- 大小:418.36KB
符号常量.docx
《符号常量.docx》由会员分享,可在线阅读,更多相关《符号常量.docx(42页珍藏版)》请在冰点文库上搜索。
符号常量
符号常量
●使用修饰符const
●使用enum关键词定义一组整数常量
如果只使用const修饰符,变量将自动转为int整型。
比如:
constsize=10;
意为
constintsize=10;
除了不可改变值外,命名后的常量和变量一样。
C++中,变量必须初始化。
而在标准C中,常量不必初始化,如没有初始化,常量默认为0;
C和C++中,const变量的作用域也不同。
C++中,常量默认为内部链接,所以在其声明的文件内可见。
在标准C中,常量就是全局变量。
它们在声明文件之外都可见。
不过,加上static声明后,标准C中的常量也可变成局部可见。
而在C++中,为了使某个常量链接到外部,以便能被另外的文件访问,我们需要显示地在常量定义前面加extern关键词。
如下:
externconsttotal=100;
另一个命名整数常量的方法是使用枚举类型,如下所示:
enum{X,Y,Z};
此句定义了X、Y和Z三个整型变量,值分别为0,1,2。
该语句等价于下列语句:
constX=0;
constY=0;
constZ=0;
我们也可显式地赋值X,Y,Z,如下:
enum{X=100,Y=50,Z=200};
可赋予任何整数值。
常量指针与指针常量
C++中添加了指针常量和常量指针。
char*constptr1=“GooD”;//指针常量
我们不能修改ptr1指向的地址。
intconst*ptr2=&m;//常量指针
ptr2声明为常量指针,它可以指向任何正确类型的变量,但指向的值不可改变。
我们也可以同时将指针和变量声明为常量,如下所示:
constchar*constcp=“xyz”;
该语句声明cp为指针常量,并指向一个声明为常量的字符串。
这种情况下,赋予指针cp的地址和指针指向的值都不能更改。
成员指针
我们可以取类成员的地址,并将其赋值给同一个指针。
对于一个完全修饰的类成员名,我们可对其应用操作符&,来获得成员的地址。
声明一个类成员指针时,可使用类名和操作符:
:
*。
比如,给定下列类
classA
{
private:
intm;
public:
voidshow();
};
我们可以如下定义成员m的指针:
intA:
:
*ip=&A:
:
m;
指针ip被创建后,就如同类的成员一样,必须使用类对象才能调用。
在上述语句中,A:
:
*意为“指向类A的成员的指针”,而&A:
:
m意为“类A的成员的地址”。
记住,下列的用法是不合法的。
int*ip=&m;//不合法
这是因为m不是一个简单的整型数。
只有和属于的类相关时,它才有意义。
所以对于这种指针和和成员,必须使用作用域操作符。
在成员函数内(或者友元函数内),指针ip可用于访问成员m。
假定a是在成员函数内声明的A类对象,我们可按如下方法,用指针ip访问m。
cout< cout< 现在,看一下下面的代码 ap=&a;//ap是对象a的指针 cout< cout< 当使用对象和成员的指针时,我们用取值符->*来访问成员。 当在对象中使用了成员指针时,则用取值符.*。 注意到*ip的用法形同成员名。 我们也可以设计成员函数的指针,在main()函数中,可用取值符调用指针指向的函数,如下所以: (object-name.*pointer-to-memberfunction)(10); (pointer-to-object->*pointer-to-memberfunction)(10); ()的优先级要高于.*和->*,所以括号是必要的。 程序案例: #include usingnamespacestd; classM { private: intx; inty; public: voidsetValue(inta,intb) { x=a; y=b; } friendintsum(Mm); }; intsum(Mm) { intM: : *px=&M: : x;//格式1 intM: : *py=&M: : y; M*pm=&m; intS=m.*px+pm->*py;//格式2 returnS; } intmain(intargc,char*argv[]) { Mn; void(M: : *pf)(int,int)=&M: : setValue;//格式3 (n.*pf)(10,20); cout<<"sum="< M*op=&n; (op->*pf)(30,40); cout<<"sum="< system("pause"); return0; } 带参构造函数 #include usingnamespacestd; classInteger { private: intm,n; public: Integer(intx,inty); voiddisplay(void); }; Integer: : Integer(intx,inty) { m=x; n=y; } voidInteger: : display(void) { cout<<"m="< cout<<"n="< } intmain(intargc,char*argv[]) { //Integerintg1;//不存在构造函数,所以不能使用 Integerintg2=Integer(25,75); Integerintg3(0,100); cout<<"\nOBJECT2"< intg2.display(); cout<<"\nOBJECT3"< intg3.display(); system("pause"); return0; } 构建二维数组 我们可以使用类变量,来构建矩阵变量。 案例程序: #include usingnamespacestd; classMatrix { private: int**p;//矩阵的指针 intd1,d2;//维度 public: Matrix(intx,inty); ~Matrix();//析构函数 voidgetElement(inti,intj,intvalue) { p[i][j]=value; } int&putElement(inti,intj) { returnp[i][j]; } }; Matrix: : Matrix(intx,inty) { d1=x; d2=y; p=newint*[d1];//创建指针数组 for(inti=0;i { p[i]=newint[d2];//为每一行分配内存 } } Matrix: : ~Matrix() { for(inti=0;i { deletep[i]; deletep; } } intmain() { intm,n; cout<<"Entersizeofmatrix: "; cin>>m>>n; MatrixA(m,n);//创建矩阵对象A cout<<"Entermatrixelementrowbyrow."< inti,j,value; for(i=0;i { for(j=0;j { cin>>value; A.getElement(i,j,value); } } cout< cout< system("pause"); return0; } 常量对象 我们也可以创建和使用常量对象,只要在对象声明前加上const关键词。 比如,在下面的声明中,我们创建了Matrix类的一个常量对象: constMatrixX(m,n);//对象X是常量 任何修改m和n值的企图都会造成编译错误。 另外,常量对象只能调用其常量成员函数。 正如我们已知道的,常量成员是一种函数原型或函数定义,其中关键词const出现在函数的签名中。 当常量对象试图调用非常量成员函数时,也会产生编译错误。 类到基本类型的转换 C++允许我们重载类型转换符,它可用于将类变量转换成基本类型。 重载类型转换符函数(通常指转换函数)的一般形式如下: operatortypename() { ..... .....(函数语句) ..... ..... } 比如下面的转换函数: vector: : operatordouble() { doublesum=0; for(inti=0;i sum=sum+v[i]*v[i]; returnsqrt(sum); } doublelength=double(V1); doublelength=V1;//V1是vector类型的对象 转换符函数应符合下列条件: ●必须有类名 ●必须不指定返回类型 ●必须没有任何参数 数据类型转换类型的例子 案例: #include usingnamespacestd; classInvent1 { private: intcode; intitems; floatprice; public: Invent1(inta,intb,floatc) { code=a; items=b; price=c; } voidgetData(void) { cout<<"Code="< cout<<"Items="< cout<<"Value="< } intgetCode() { returncode; } intgetItems() { returnitems; } floatgetPrice() { returnprice; } operatorfloat()//类Invent1向float类型的转换 { return(items*price); } }; classInvent2 { private: intcode; floatvalue; public: Invent2() { code=0; value=0; } Invent2(intx,inty) { code=x; value=float(y); } voidgetData() { cout<<"Code="< cout<<"Value="< } /*类Invent1到类Invent2*/ Invent2(Invent1p) { code=p.getCode(); value=p.getItems()*p.getPrice(); } }; intmain() { Invent1s1=Invent1(100,5,140.0); Invent2d1; floattotalValue; /*类Invent1到float类型*/ totalValue=s1; /*类Invent1到类Invent2*/ d1=s1; cout<<"Productdetails-Invent1type"< s1.getData(); cout< cout<<"Value="< cout<<"Productdetails-Invent2type"< d1.getData(); system("pause"); return0; } 派生类成员的访问属性 基类成员在派生类中的访问属性(综合) 基类中的成员 在公用派生类中的访问属性 在私有派生类中的访问属性 在保护派生类中的访问属性 私有成员 不可访问 不可访问 不可访问 公用成员 公用 私有 保护 保护成员 保护 私有 保护 解决继承中的歧义 多继承: #include usingnamespacestd; classM { public: voiddisplay(void) { cout<<"ClassM"< } }; classN { public: voiddisplay(void) { cout<<"ClassN"< } }; classP: publicM,publicN { public: voiddisplay(void) { M: : display();//解决方案 } }; 单继承: #include usingnamespacestd; classA { public: voiddisplay() { cout<<"A"< } }; classB: publicA { public: voiddisplay() { cout<<"B"< } }; intmain() { Bb; b.display();//重点在这里 b.A: : display();//加上: : b.B: : display();//加上: : return0; } 混合继承 案例: //ClassInfo.h classStudent { protected: introllNumber; public: voidgetNumber(inta); voidputNumber(void); }; classtest: publicStudent { protected: floatpart1; floatpart2; public: voidgetMarks(floatx,floaty); voidputMarks(void); }; classSports { protected: floatscore; public: voidgetScore(floata); voidputScore(void); }; classresult: publictest,publicSports { private: floattotal; public: voiddisplay(void); }; //ClassInfo.cpp #include #include"ClassInfo.h" usingnamespacestd; voidStudent: : getNumber(inta) { rollNumber=a; } voidStudent: : putNumber(void) { cout<<"RollNo: "< } voidtest: : getMarks(floatx,floaty) { part1=x; part2=y; } voidtest: : putMarks(void) { cout<<"Marksobtained: "< cout<<"part1="< cout<<"part2="< } voidSports: : getScore(floata) { score=a; } voidSports: : putScore(void) { cout<<"Sportswt: "< } voidresult: : display(void) { total=part1+part2+score; putNumber(); putMarks(); putScore(); cout<<"Totalscore: "< } #include"ClassInfo.h" #include usingnamespacestd; intmain() { resultstu; stu.getNumber(1234); stu.getMarks(27.5,33.0); stu.getScore(6.0); stu.display(); system("pause"); return0; } 虚基类 在声明直接或间接基类时,通过将通用基类(祖先类)设为虚基类,就可以避免多路继承引起的成员重复。 当某类被设为虚基类时,不管在虚基类和派生类间有多少继承路径存在,C++都会确保只有一份该类的成员被继承。 //ClassInfo.h classStudent { protected: introllNumber; public: voidgetNumber(inta); voidputNumber(void); }; classtest: virtualpublicStudent//虚基类 { protected: floatpart1; floatpart2; public: voidgetMarks(floatx,floaty); voidputMarks(void); }; classSports: publicvirtualStudent//虚基类 { protected: floatscore; public: voidgetScore(floata); voidputScore(void); }; classresult: publictest,publicSports { private: floattotal; public: voiddisplay(void); }; //ClassInfo.cpp #include #include"ClassInfo.h" usingnamespacestd; voidStudent: : getNumber(inta) { rollNumber=a; } voidStudent: : putNumber(void) { cout<<"RollNo: "< } voidtest: : getMarks(floatx,floaty) { part1=x; part2=y; } voidtest: : putMarks(void) { cout<<"Marksobtained: "< cout<<"part1="< cout<<"part2="< } voidSports: : getScore(floata) { score=a; } voidSports: : putScore(void) { cout<<"Sportswt: "< } voidresult: : display(void) { total=part1+part2+score; putNumber(); putMarks(); putScore(); cout<<"Totalscore: "< } #include"ClassInfo.h" #include usingnamespacestd; intmain() { resultstu; stu.getNumber(678); stu.getMarks(30.5,25.5); stu.getScore(7.0); stu.display(); system("pause"); return0; } 派生类的构造函数 只要基类的构造函数不需要参数,派生类就不需要构造函数。 然而,一旦基类包含了带参的构造函数,那么它的派生类就必须有构造函数,并将参数传递给基类的构造函数。 记住,在使用继承时,我们通常创建子类对象,所以派生类传递参数给基类构造函数时合情合理的。 当基类和派生类都有构造函数时,基类构造函数总是先执行,然后再轮到派生类的构造函数执行。 虚基类的构造函数在任何非虚基类之前被调用。 如果有多个虚基类,调用的次序与它们声明次序一致,然后再派生类构造函数执行之前,任何非虚基类的构造函数得以调用。 基类构造函数的执行 继承方法 执行次序 classB: publicA { }; 1 A();基类构造函数 2 B();派生类构造函数 classA: publicB,publicC { }; 1 B();第一个基类 2 C();第二个基类 3 A();派生类 classA: publicB,virtualpublicC { }; 1 C();虚基类 2 B();普通基类 3 A();派生类 注意: 数据成员按声明次序初始化,与初始化列表中的次序无关。 函数指针 函数指针在C++中
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 符号 常量
![提示](https://static.bingdoc.com/images/bang_tan.gif)