const对象一样可能被更改

本文通过一个简单的C++示例,展示了即使使用const关键字也不一定能确保字符串对象的不可更改性,进而讨论了逻辑常量性的概念及其背后的原理。

如下:

#include <string>
#include 
<iostream>
using namespace std;
void main(){
    string s(
"Hello");
    
char* p=&s[0];
    
*p='J';
    cout
<<s.c_str()<<endl;
    
//可见,这种情况说明了,即使用const也未必能保证对象的不可更改!
    
//这种情况导出所谓的logical constness...


}
### C语言和C++中const关键字用法的比较 在C语言和C++中,`const`关键字都用于定义常量或限制变量的修改行为。然而,由于C++是一种面向对象的语言,它对`const`的支持更加丰富和灵活。以下是两者的相同点与区别: #### 相同点 1. **定义常量** 在C和C++中,`const`都可以用来定义常量,取代传统的宏定义[^2]。例如: ```c const int MAX = 100; ``` 这段代码在两种语言中都有效,且`MAX`的在程序运行期间不可更改。 2. **修饰指针** `const`可以用于修饰指针,区分常量指针和指针常量[^3]。例如: ```c const int *p; // 指向常量的指针,不能通过*p修改 int *const p; // 常量指针,p本身不能指向其他地址 ``` 3. **函数参数中的应用** 在C和C++中,`const`都可以用于修饰函数参数,确保参数在函数内部不被修改。例如: ```c void func(const int a); // 参数a在函数内部不可变 ``` #### 区别 1. **类成员变量** 在C++中,`const`可以用于类的成员变量,并且必须通过初始化列表进行初始化[^4]。而C语言没有类的概念,因此不存在类似用法。例如: ```cpp class A { const int a; public: A(int x) : a(x) {} // 必须通过初始化列表赋 }; ``` 2. **常成员函数** C++支持定义常成员函数,这类函数不能修改类的数据成员。C语言没有面向对象特性,因此无法实现这一功能[^4]。例如: ```cpp class A { public: int getValue() const { return 10; } // 常成员函数 }; ``` 3. **函数返回** 在C++中,`const`可以修饰函数的返回,以防止返回修改。C语言虽然也支持类似的语法,但实际意义有限,因为C语言通常返回的是而非引用或指针。例如: ```cpp const int& func(); // 返回一个常量引用 ``` 4. **类型安全** C++中`const`的使用更注重类型安全,尤其是在模板编程和泛型编程中。C语言则更多依赖于编译器优化和程序员的手动管理[^2]。 5. **全局作用域** 在C语言中,`const`定义的常量默认具有外部链接性(除非显式声明为`static`),而在C++中,默认情况下`const`变量具有内部链接性[^2]。例如: ```c const int GLOBAL_VAR = 10; // 在C中具有外部链接性 ``` ```cpp const int GLOBAL_VAR = 10; // 在C++中具有内部链接性 ``` 6. **操作符重载** C++允许使用`const`修饰操作符重载函数,以确保操作符不会修改对象状态。C语言没有操作符重载的概念,因此不存在这种用法[^5]。例如: ```cpp A& operator=(const A& a); // 重载赋操作符 ``` ### 示例代码 以下是一个综合示例,展示C和C++中`const`的不同用法: ```c // C语言中的const用法 const int a = 10; // 定义常量 const int *p = &a; // 指向常量的指针 ``` ```cpp // C++中的const用法 class A { const int a; // 常成员变量 public: A(int x) : a(x) {} // 必须通过初始化列表赋 int getValue() const { return a; } // 常成员函数 }; const int& func() { // 返回常量引用 static int b = 20; return b; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值