常量成员,指的是在C++类中声明对象成员时可以加上const关键字,这样声明的成员叫常量成员,
常量成员分为常量数据成员和常量函数成员
定义
class node { public: const int id; // 用const修饰, id成员变量不能被改值; } int main() { CA a; a.id = 10; // 报错!! 由于被const修饰, id值不能改变 }
初始化
可以在定义的时候直接在后面赋值(不建议使用)
class node { public: const int id = 10; }
通过成员初始化列表的方式进行初始化
常量数据成员也在构造函数范围内, 但是常量数据成员值无法改变.
错误示范:
#include<iostream> using namespace std; class CA { public: const int id; CA(){ id = 10; // 报错: 表达式必须是可修改的值 } }; int main() { CA a; cout << a.id << endl; }
采用成员初始化列表对常量数据成员初始化
#include<iostream> using namespace std; class CA { public: int num; const int id; CA(): id(10) {} // 在构造函数之后 + ":" + 初始化内容 CA(int i, int n) : id(i), num(i) // 可以带参初始化列表 {} // 普通数据成员也可初始化 }; // 如果是要给类中的多个数据初始化中间用‘,’号隔开 int main() { CA a, b(15); cout << a.id << endl; cout << b.id << endl; }
初始化列表的特性 1、初始化列表也是实现类中成员数据的初始化的一种方式 2、一些特殊情况下,数据成员的初始化只能用初始化列表的方式给数据成员赋值,而不能在构造函数中 直接赋值 3、初始化列表必须写在构造函数的定义体后面 4、构造函数能对数据的初始化工作,初始化列表也可以,但是初始化列表能做的,构造函数不一定能 5、初始化列表的初始化顺序是按照他们在类中出现的顺序来初始化的,而不是在初始化列表中写的顺序 来初始化的
#include<iostream> using namespace std; class CA { int id = 10; public: void fun() const // 类内定义 { id = 15; // 报错 } void fun1() const; // 类内声明 }; void CA::fun1() const // 类外实现 { }
特点:
类中的常量函数成员, 在这个函数中不能对自身变量进行修改,通过语法限定.
只要是this指针所指向的所有数据都不可以被修改(静态数据可以改变)。
可以用来帮助我们来限定自身.
class CA { int id = 10; }; int main() { const CA a; a.id = 10; // 报错 }
常量对象声明, 在生成对象前面加上 const修饰.
常量对象中的任何数据成员都不能改变, 只能调用对象中的常量函数成员.