C++学习笔记 const修饰类成员与成员函数
一、 常数据成员
常数据成员,已经初始化就不可以改变
1 const int m; //const 数据类型 数据成员名 2 int const s; //数据类型 const 数据成员名
被const修饰的成员必须进行初始化,并且不能被更改。而初始化的方式则是在类的构造函数的初始化列表里进行的。
1 class Clock 2 3 4 Clock(int a,int b,int c):h(a),m(b),s(c)//类的构造函数的初始化列表
通常把常数据成员定义为静态成员,使其成为类的一个常量
1 private: static const int x; //静态常量类内申明,类外初始化
其中x为static类型,因其静态化的特殊性,需要在类外初始化,即便为私有类型;
二,常成员函数
const成员函数可以使用类中的所有成员变量,但是不能修改他们的值,这种措施主要为了保护数据而设置。const成员函数也称常成员函数。
需要在声明和定义的时候在函数头部的结尾加上const关键字
1 char *getname() const; 2 int getage() const; 3 float getscore() const;
常成员函数只能调用常成员函数,而不能调用非常成员函数,访问但不可以更改非常成员变量。
注意:但是有一种情况例外,如果成员申明时加关键字mutable后,在常函数中依然可以修改
1 //类名 *p=this; 2 //普通类成员函数this指针:T* const(表示指针本身不能修改) 3 //常成员函数this指针类型:const T* const(表示指针本身同时指针指向的内容不能修改) 4 //类名 * const p=(类名* const)this; 5 6 //p->成员=123;可以修改成员参数
三,常对象
常对象是指该对象在其生命周期内,其所有的数据成员的值都不能被改变;定义对象时加上关键字const,该对象就是常对象,其一般形式如下:
1 const class object(params); 2 class const object(params); 3 4 5 //定义const指针 6 const class *p = new class(params); 7 class const *p = new class(params);
一旦将对象定义为常对象之后,不管是哪种形式,该对象就只能访问被 const 修饰的成员了(包括 const 成员变量和 const 成员函数),因为非 const 成员可能会修改对象的数据(编译器也会这样假设),C++禁止这样做。
数据成员 | 非const的普通成员函数 | const成员函数 |
---|---|---|
非const的普通数据成员 | 可以引用,也可以改变值 | 可以引用,但不可以改变值 |
const数据成员 | 可以引用,但不可以改变值 | 可以引用,但不可以改变值 |
const对象 | 不允许 | 可以引用,但不可以改变值 |
注意:1,不要误认为常对象中的成员函数都是常成员函数,常对象只保证其所有数据成员的值不被修改
2,如果在常对象中成员函数未加const声明,则编译系统会把它当最非const成员函数处理
3,常成员函数不能调用另外一个非const成员函数