const 变量的问题

const变量存在的原因:

例:for( int i=0;i<5;++i)

这个5是个魔数,表示什么呢?不是所有看到这段代码的人都清楚。这个时候需要提供一些额外的信息,如num_of_days表示这个5。c++中可以将num_of_days声明成为一个常量,这个常量在预编译阶段就能确定,可以用来初始化一个数组。而在c语言中,const修饰的实际上只是不可变的变量,如果用它来初始化一个数组的大小,就会报错。

const int num_of_days=5;


c++中,用const修饰的常量默认为文件内的局部常量,如果让它能被其他文件引用,需要显式声明为extern。非const变量默认为extern。这一点在编程的时候需要注意。


const与指针的问题,分三类:

1)指向const对象的指针

const char *p;

char const *p;

2)const指针

char * const p;

3)指向const对象的const指针

const char *const p;


当定义了typedef 然后与const混用的时候特别令人迷惑。。

这种情况下:const char ** argv;     不理解

### `const` 变量赋值给非 `const` 变量的合法性 在 C++ 中,将 `const` 变量赋值给非 `const` 变量是**合法的**,前提是赋值过程中不涉及直接的指针或引用操作。这是因为赋值操作会创建一个新的副本,而非共享原始常量的内存。因此,非 `const` 变量获得的是原始 `const` 变量的值,而不是其引用或指针。 例如: ```cpp const int a = 10; int b = a; // 合法:b 是 a 的副本,不共享内存 ``` 上述代码中,`b` 获得的是 `a` 的值,而不是对 `a` 的引用或指针,因此不会违反 `const` 限定符的语义[^4]。 --- ### 指针与引用中的限制 虽然直接赋值是合法的,但若尝试通过指针或引用将 `const` 对象赋给非 `const` 指针或引用,则会导致编译错误。这是为了防止通过非 `const` 指针或引用修改原本是 `const` 的对象。 例如: ```cpp const int a = 10; int* p = &a; // 非法:不能将 const int* 赋给 int*,否则可以通过 p 修改 a 的值 [^4] ``` 若确实需要绕过此限制,可以使用类型强制转换(如 `const_cast`),但这可能导致未定义行为,因为修改原本为 `const` 的对象是非法的。 ```cpp const int a = 10; int* p = const_cast<int*>(&a); *p = 20; // 未定义行为:试图修改 const 对象 [^1] ``` --- ### 编译器优化与常量传播 在某些情况下,编译器可能会对 `const` 变量进行优化,例如常量折叠或不为其分配实际内存空间。当将这样的 `const` 变量赋值给非 `const` 变量时,实际上是将编译时常量的值复制给目标变量,而不会涉及运行时的内存访问。 例如: ```cpp const int N = 5; int arr[N]; // N 被当作编译时常量使用 [^2] ``` 此时,`N` 可能并未分配实际内存,而是直接在编译时被替换为 `5`。 --- ### 类型安全与赋值规则 C++ 中的类型系统确保了从 `const` 到非 `const` 的赋值不会破坏类型安全。非 `const` 变量在赋值后拥有独立的状态,不会影响原始 `const` 变量。然而,这种赋值并不适用于指针或引用类型,因为它们涉及共享内存,可能引发对 `const` 对象的修改风险。 --- ### 总结 - 将 `const` 变量赋值给非 `const` 变量是合法的,因为赋值操作创建了副本。 - 指针或引用不可绕过 `const` 限定符,否则会引发编译错误或未定义行为。 - 编译器可能对 `const` 变量进行优化,如不分配实际内存。 - 类型系统确保赋值过程不会破坏类型安全,但指针和引用需特别注意。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值