const的含义【转】

一听到被面试者说:“const意味着常数”,我就知道我正在和一个业余者打交道。去年Dan Saks已经在他的文章里完全概括了const的所有用法,因此ESP(译者:Embedded Systems Programming)的每一位读者应该非常熟悉const能做什么和不能做什么.如果你从没有读到那篇文章,只要能说出const意味着“只读”就可 以了。尽管这个答案不是完全的答案,但我接受它作为一个正确的答案。(如果你想知道更详细的答案,仔细读一下Saks的文章吧。)
如果应试者能正确回答这个问题,我将问他一个附加的问题:
下面的声明都是什么意思?

 

const int a;
int const a;
const int *a;
int * const a;
int const * a const;

 

/******/
前两个的作用是一样,a是一个常整型数。

第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。

第四个意思a是一个指向整型 数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。

最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数 是不可修改的,同时指针也是不可修改的)。

 

如果应试者能正确回答这些问题,那么他就给我留下了一个好印象。顺带提一句,也许你可能会问,即使不用关键字 const,也还是能很容易写出功能正确的程序,那么我为什么还要如此看重关键字const呢?我也如下的几下理由:
※ 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理 其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。) 
※ 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。 
※ 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。

<think>我们正在讨论C++成员函数后加const含义。根据之前引用的资料,特别是引用[1]、[2]、[3]和[4],可以总结如下: 用户问题:函数后加const含义 回答要点: 1. const成员函数表示该函数不会修改类的数据成员(除非成员被mutable修饰)。 2. 它隐含地将this指针变为指向常量的指针(即const T* this),因此在函数体内不能修改非mutable的成员变量。 3. 声明和定义时都需要在函数参数列表后加const关键字。 4. 这种函数可以被const对象和非const对象调用,而非const成员函数只能被非const对象调用。 5. 作用:提高程序可读性、可靠性和安全性(编译器会检查是否修改成员)。 6. 注意:静态成员函数后面不能加const(因为静态成员函数没有this指针)。 另外,根据引用[4]中的例子,我们也可以看到在const成员函数中修改成员变量会导致编译错误。 现在,根据用户的提问需求,我们需要用中文回答,并且按照要求使用LaTeX格式的数学表达式(虽然这个问题可能涉及数学表达式较少,但如果有数学含义的部分也要用LaTeX)。同时,生成相关问题。 由于问题本身是关于C++语法的,我们不会涉及太多数学公式,但我们可以用代码块来展示示例。 最后,生成相关问题。 下面开始组织回答: </think>### C++成员函数后加`const`的含义解析 在C++中,成员函数后添加`const`修饰符是该语言的核心特性之一,其主要含义和作用如下: #### 1. **常量成员函数声明** - **语法格式**: `返回值类型 函数名(参数列表) const { 函数体 }` - **核心含义**: 声明该函数为"只读函数",承诺不会修改类的数据成员(编译器强制检查)[^1][^2] #### 2. `this`指针的型 - 普通成员函数的`this`指针类型:`ClassName* const` - `const`成员函数的`this`指针类型:`const ClassName* const` - 数学表示: 设类为$C$,成员函数$f$,则: $$ f_{\text{const}} : \text{const } C \times \cdots \to \text{返回类型} $$ 隐含`this`指针从$C*$变为$\text{const } C*$[^2][^3] #### 3. 编译期强制约束 ```cpp class Vector2 { public: float x, y; // const成员函数:承诺不修改成员 float magnitude() const { // x = 10; // 错误!编译器报错 return sqrt(x*x + y*y); } // 非const函数:允许修改成员 void scale(float s) { x *= s; // 允许操作 y *= s; } }; ``` - 在`const`函数内修改成员 ⇒ **编译错误**[^2][^4] - 例外情况:`mutable`修饰的成员可被修改(如缓存标记、互斥锁等) #### 4. 对象调用权限 | 函数类型 | const对象 | 非const对象 | |----------------|-----------|-------------| | const成员函数 | ✔️ 允许 | ✔️ 允许 | | 非const成员函数| ❌ 禁止 | ✔️ 允许 | - 数学关系描述: 设$O_{\text{const}}$为const对象,$O$为非const对象,$F_c$为const函数,$F$为非const函数,则: $$ O_{\text{const}} \rightarrow F_c \quad \text{(合法调用)} $$ $$ O_{\text{const}} \not\rightarrow F \quad \text{(非法调用)} $$ #### 5. 核心价值 1. **增强代码安全性** 编译器自动阻止意外修改(如`if(obj.getX()=10)`会被拒绝)[^4] 2. **提高接口可读性** 明确标识不修改对象状态的函数 3. **支持const对象操作** 使const对象能调用必要的成员函数[^3] 4. **优化设计意图** 强制实现"最小权限原则"(Principle of Least Privilege) > 典型应用场景:getter方法、数学计算(如向量模长)、状态检查等不修改对象内容的操作[^1][^3] #### 6. 使用准则 - **声明定义一致**:头文件和实现文件均需添加`const` - **不适用场景**:静态成员函数(无`this`指针)、构造函数、析构函数 - **重载区分**:`void func()const`和`void func()`构成合法重载 ```cpp // 合法重载示例 class Logger { public: string getMessage() const { return cachedMsg; } // const对象调用 string& getMessage() { return modifiableMsg; } // 非const对象调用 private: mutable string cachedMsg; // mutable修饰的可修改成员 string modifiableMsg; }; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值