C++ const 用法

张开发
2026/4/15 23:44:58 15 分钟阅读

分享文章

C++ const 用法
Cconst用法一、const的常见用法1. 定义常量使用const定义不可修改的常量。constintx100;// x 的值不可改变// x 200; // 错误2.const引用const引用可以绑定到常量或临时对象但不能通过引用修改所绑定的值。constintx100;constintrefx;// 正确// int ref2 x; // 错误x 是常量非常量引用不能绑定到常量3.const与指针3.1 指针指向的内容是常量const在*左边constint*p;// 或 int const *p;intx10,y20;px;// *p 30; // 错误不能通过 p 修改所指向的内容py;// 正确p 本身可以指向其他变量3.2 指针本身是常量const在*右边int*constpx;// p 必须初始化且不能再指向其他变量// p y; // 错误p 是常量指针*p30;// 正确可以修改所指向的内容3.3 两者都是常量constint*constpx;// *p 30; // 错误不能修改内容// p y; // 错误不能修改指向4.const数据成员类内const成员变量必须在构造函数的初始化列表中初始化不能在声明时直接赋值C11 之后允许在声明时初始化但传统风格推荐使用初始化列表。classTest{public:Test(inta):x(a){}// 正确private:constintx;// const int y 10; // C11 起允许但为了兼容性常用初始化列表};5.const对象const对象只能调用const成员函数不能调用非const成员函数。constTestt(10);// t.someNonConstFunc(); // 错误t.someConstFunc();// 正确6.const成员函数const成员函数承诺不会修改对象的非mutable成员变量。语法上在函数参数列表后加const。classTest{public:voidGetCount()const;// const 成员函数};二、mutable与const的配合mutable修饰的成员变量即使在const成员函数或const对象中也可以被修改。常用于统计、缓存等场景。完整示例计数器类#includeiostreamusingnamespacestd;classCounter{public:Counter(intcount):count_(count),queryTimes_(0){}// const 成员函数不能修改普通成员 count_intGetCount()const{coutconst GetCount...count_endl;queryTimes_;// 可以修改 mutable 成员returncount_;}// 非 const 成员函数重载intGetCount(){coutnon-const GetCount...count_endl;queryTimes_;// 同样可以修改 mutable 成员returncount_;}voidIncrement(){count_;}voidOutput()const{coutconst Output: count count_endl;queryTimes_;// mutable 成员可在 const 函数中修改}intGetQueryTimes()const{returnqueryTimes_;}private:intcount_;// 普通成员mutableintqueryTimes_;// 可变成员用于统计查询次数};intmain(){// const 对象只能调用 const 成员函数constCounterc1(10);coutCount from const object: c1.GetCount()endl;c1.Output();// 正确Output 是 const// 普通对象可以调用任意成员函数Counterc2(20);c2.GetCount();// 调用非 const 版本c2.Increment();c2.Output();// 调用 const 版本coutQuery times from c2: c2.GetQueryTimes()endl;return0;}输出示例Count from const object: const GetCount...10 10 const Output: count 10 non-const GetCount...20 const Output: count 21 Query times from c2: 2三、核心要点总结用法含义能否修改const T x;常量变量否const T ref x;常量引用不能通过引用修改const T* p;指向常量的指针不能通过p修改指向的内容T* const p;常量指针不能改变p的指向const T* const p;指向常量的常量指针两者都不能改const成员函数不修改对象状态除mutable非mutable成员只读const对象只能调用const成员函数同上mutable T x;可在const函数中修改任意位置均可四、最佳实践建议尽量使用const能声明为const的变量、参数、成员函数都加上提升代码安全性和可读性。区分指针常量与常量指针记住口诀 —— “左定值右定向”const在*左边修饰指向的值右边修饰指针本身。const成员函数重载可以同时提供const和non-const版本让const对象也能使用并让非const对象获得更高效或可修改的版本。谨慎使用mutable仅用于纯粹的统计、缓存、互斥锁等不影响对象“逻辑状态”的成员。

更多文章