对于Const关键字修饰的对象
const T a; 声明的对象具有以下特点:
状态不可变(除非通过 mutable)。
只能调用 const 成员函数。
构造后不可修改,需通过构造函数初始化。
通过 const 指针 / 引用访问。
-
对象状态不可修改
所有非静态成员变量(除非声明为 mutable)在对象构造后不可修改。class T {int value;mutable int count; // 可变成员,可在const对象中修改 public:void setValue(int v) { value = v; } // 非const成员函数void incrementCount() const { count++; } // const函数可修改mutable成员 };const T a; // 必须通过构造函数初始化 // a.setValue(10); // 错误:不能调用非const成员函数 a.incrementCount(); // 允许:修改mutable成员
-
只能调用 const 成员函数
const 对象只能调用 **const 成员函数 **,确保对象状态不被修改。class T { public:void f() const { /* 只读操作 */ } // const成员函数void g() { /* 可修改操作 */ } // 非const成员函数 };const T a; a.f(); // 允许 // a.g(); // 错误:const对象不能调用非const函数
-
构造与析构的特殊性
构造函数:可在初始化时设置对象状态(因为对象尚未完全构造)。
析构函数:隐式为 const,即使未显式声明(否则 const 对象无法正常析构)。class T { public:T(int v) : value(v) {} // 构造函数可初始化const对象~T() { /* 析构函数隐式为const */ } private:int value; };const T a(10); // 正确:通过构造函数初始化
-
成员函数重载与 const 版本
类可提供 **const 和非 const 版本的同名函数 **,根据对象是否为 const 自动选择调用:class T {std::string data; public:const char& operator[](size_t pos) const { // const版本(返回只读引用)return data[pos];}char& operator[](size_t pos) { // 非const版本(返回可写引用)return data[pos];} };const T a; a[0] = 'x'; // 错误:调用const版本,返回const char& T b; b[0] = 'x'; // 允许:调用非const版本,返回char&
-
指针与引用的 const 限定
const 对象只能被 const 指针 / 引用指向:const T a; T* ptr = &a; // 错误:普通指针不能指向const对象 const T* const_ptr = &a; // 正确:const指针可指向const对象T& ref = a; // 错误:普通引用不能绑定到const对象 const T& const_ref = a; // 正确:const引用可绑定
-
与标准库容器的交互
存储 const 对象:标准库容器(如 std::vector)不能直接存储 const 对象(因容器需支持元素赋值和移动)。
正确做法:存储普通对象,通过 const 引用访问。std::vector<T> vec; const T& const_ref = vec[0]; // 通过const引用访问容器元素
-
性能与优化
编译器优化:const 对象可能被编译器视为常量,允许更多优化(如内联、常量传播)。
内存布局:与普通对象相同,但访问权限受限制。