1.作用:无法修改数据成员,一般用来修饰Get的函数
2.本质:this指针类型:const T* const
3.意义:让编译器提醒开发者该函数不能修改类的成员变量,用于const对象(引用或指针)
看一个例子:
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 class CInterger { 6 public: 7 CInterger(int nNumber) { m_nNumber = nNumber; } 8 int GetNumber(); 9 void SetNumber(int nNumber) { m_nNumber = nNumber; }; 10 11 private: 12 int m_nNumber; 13 }; 14 15 int CInterger::GetNumber() { return m_nNumber; } 16 17 int main(int argc, char const *argv[]) { 18 CInterger i = 1; 19 return 0; 20 }
在C++中,语法比较自由,可以在程序运行时利用指针改变程序任意处的内容
以上中,可知get方法只是获取成员变量,故不允许人为修改
使用常成员函数:
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 class CInterger { 6 public: 7 CInterger(int nNumber) { m_nNumber = nNumber; } 8 int GetNumber() const; //常成员函数 9 void SetNumber(int nNumber) { m_nNumber = nNumber; }; 10 11 private: 12 int m_nNumber; 13 }; 14 15 int CInterger::GetNumber() const { 16 // m_nNumber = 1; Error:expression must be a modifiable lvalue 17 return m_nNumber; 18 } 19 20 int main(int argc, char const *argv[]) { 21 CInterger i = 1; 22 return 0; 23 }
const 常成员函数
1.普通的类成员函数this指针类型: T* const(表示该指针本身不能被修改)T为该类
例如:SetNumber()的this指针类型为:CInterger* const;
2.常成员函数this指针类型:const T* const
1)表示该指针本身不能被修改
2)表示指针指向的内容不能被修改
this指针指向对象,所以常成员函数this指向的内容(成员变量)不能被修改
如何非的在常成员函数内修改成员变量?
将类中的成员变量声明为mutable;
... private: mutable int m_nNumber;
const常成员变量
1 class CInterger { 2 public: 3 CInterger(int nNumber) { m_nNumber = nNumber; } 4 int GetNumber() const; 5 void SetNumber(int nNumber) { m_nNumber = nNumber; }; 6 7 private: 8 int m_nNumber; 9 const int m_nTest; //error: uninitialized const member in ‘const int 10 };
常成员变量在定义的时候要初始化,因为其定义后不允许被修改。
const int m_nTest = 1;
但是对于一些版本较低的编译器,不允许定义时初始化,所以可以用初始化列表的方式来初始化。
在构造函数后
CInterger(int nNumber) : m_nTest(1),m_nNumber(2) { m_nNumber = nNumber; }
初始化列表:
1、可以用来初始化普通成员变量/常成员变量
2、通常用来构造有参数的成员对象
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 class CTest { 6 public: 7 CTest(int m, int n) { 8 m_n = n; 9 m_m = m; 10 } 11 private: 12 int m_n; 13 int m_m; 14 }; 15 16 class CInterger { 17 public: 18 CInterger(int nNumber) : m_nTest(1), m_nNumber(2),t(22,33) { m_nNumber = nNumber; } 19 void SetNumber(int nNumber) { m_nNumber = nNumber; }; 20 21 private: 22 CTest t; 23 int m_nNumber; 24 const int m_nTest; 25 }; 26 27 int main(int argc, char const *argv[]) { 28 CInterger i = 1; 29 return 0; 30 }