const在C++ 和C 中的比较

本文探讨了C89和C++99标准中const关键字的不同行为,特别是在数组大小指定上的差异。C语言将const视为变量,而C++则将其视为真正的常量,并在编译时进行替换。

目前,我们讨论的是C++99和C89 的标准;

C语言

在C语言(C89标准)中, const 的特性:

const int size=10//正确(常变量)
int array[size]={0}  //错误(常变量不能用做数组下标)
C++语言
const int size=10//正确(常量)
int array[size]={0}  //正确

这是什么原因呢?其实是在C语言和C++语言中,两者的编译方式有区别:
(1)C语言中把const还当做变量编译;
(2)C++语言中凡是出现常量的地方(编译时初始化)均用值来替换。
由于const 对象一旦创建后其值就不能再改变,所以const 对象必须初始化

const int i=get_size();  //正确,运行时初始化
const int j=42;  //正确,编译时初始化
const int k;//错误,k未经初始化

如果利用一个对象去初始化另外一个对象,则他们是不是const都没有关系。

int i=42;
const int ci=i;  //正确,i的值被拷贝给了ci
int j=ci;   //正确,ci的值被拷贝给了j

ci 的常量特征仅仅在执行改变ci 的操作才会发挥作用。

总结:
(1)C++语言和C语言对const的定义不同,C++语言中定义为常量,C语言中定义为常变量;
(2)两个语言对const的编译方式不同(详细见上面)
(3)C++语言中常量有向常变量退化的可能;同时,常量的“常”只是体现在修改它的值时才会发挥作用。

<think>好的,我现在要回答用户关于const关键字在CC++中的区别的问题。首先,我需要回忆一下之前学过的相关知识,并参考提供的引用资料来确保准确性。 首先,根据引用[5],C语言中的const变量虽然是常量,但可以通过指针间接修改,这被称为“伪常量”。而C++中的const常量存储在符号表中,无法通过指针修改,修改时会报错。这说明两者的存储位置可修改性不同。 然后,引用[2]提到C语言const的“左数右指原则”,即const在左边修饰类型,在右边修饰指针。例如,int const *n是常量指针,而int * const n是指针常量。这点在C++中同样适用,但C++const更严格,直接修改会编译错误。 接下来,引用[1][4]指出C++中的const具有更多的编译时优化,比如可以用于数组长度定义,而C语言中不行。这是因为C++const被视为编译时常量,而C中的const变量仍然是运行时的只读变量。 需要确认的是作用域方面,C++const默认具有内部链接,而C中const变量默认外部链接。这意味着在C中,如果在头文件中定义const变量,可能引发重复定义错误,而C++则不会。 此外,初始化要求方面,C允许const变量不初始化,而C++必须初始化,否则编译错误。这点需要引用具体资料中的例子来支持。 最后,总结两者的差异点,包括定义方式、存储位置、作用域、可修改性以及应用场景。同时,结合代码示例来直观展示不同行为,比如通过指针修改时的结果差异。 现在需要检查是否有遗漏点,比如CC++const与宏定义的区别,但根据提供的引用,可能不需要深入这点。确保每个差异点都有引用支持,并且例子正确无误。</think>### const关键字在CC++中的区别对比 #### 1. **定义与存储方式** - **C语言**: `const`定义的常量是**只读变量**,存储在内存中。虽然不能直接修改,但可以通过指针间接修改值,因此称为“伪常量”[^5]。 ```c const int a = 10; int *p = (int*)&a; // 强制类型转换后取地址 *p = 20; // C语言中允许修改,但行为未定义(可能报错或修改失败) ``` - **C++**: `const`定义的常量是**真正的常量**,存储在符号表中。无法通过指针修改,修改会触发编译错误[^2]。 ```cpp const int a = 10; int *p = const_cast<int*>(&a); // 强制去除const属性 *p = 20; // 语法允许,但运行时a的值仍为10(符号表优先) ``` #### 2. **作用域与链接性** - **C语言**: `const`常量默认具有**外部链接性**。若在头文件中定义`const int a = 10;`,多文件包含会导致重复定义错误,需用`static`修饰[^4]。 - **C++**: `const`常量默认具有**内部链接性**,可直接在头文件中定义,多文件包含不会冲突。 #### 3. **初始化要求** - **C语言**: 允许`const`变量不初始化(但未初始化时值为随机)[^3]。 ```c const int a; // 编译通过,但a的值未定义 ``` - **C++**: `const`变量必须显式初始化,否则编译报错。 ```cpp const int a; // 编译错误:未初始化 ``` #### 4. **应用场景** - **C语言**: - 用于定义只读变量(如配置参数)[^3]。 - 不能用于数组长度定义(需用宏或动态分配): ```c const int n = 5; int arr[n]; // 错误:C语言中n不是编译时常量 ``` - **C++**: - 可直接用于数组长度、模板参数等需要编译时常量的场景: ```cpp const int n = 5; int arr[n]; // 合法:C++中n是编译时常量 ``` - 支持`const`成员函数(保证不修改对象状态)[^1]。 #### 5. **与指针结合** - **C/C++通用规则**: 遵循**左数右指原则**: - `const int *p`:指针指向的内容不可变(常量指针)。 - `int *const p`:指针本身不可变(指针常量)。 #### 6. **代码示例对比 ```c // C语言示例 #include <stdio.h> int main() { const int a = 10; int *p = (int*)&a; *p = 20; printf("a=%d, *p=%d\n", a, *p); // 输出可能为a=10, *p=20(取决于编译器优化) return 0; } ``` ```cpp // C++示例 #include <iostream> int main() { const int a = 10; int *p = const_cast<int*>(&a); *p = 20; std::cout << "a=" << a << ", *p=" << *p << std::endl; // 输出a=10, *p=20 return 0; } ``` #### 总结对比表 | 特性 | C语言 | C++ | |---------------------|-------------------------------|------------------------------| | **本质** | 只读变量(伪常量) | 真正常量(符号表存储) | | **指针修改** | 允许(行为未定义) | 禁止(编译报错或值不变) | | **作用域** | 外部链接性(需`static`限制) | 内部链接性(默认安全) | | **初始化要求** | 可不初始化 | 必须初始化 | | **数组长度定义** | 不支持 | 支持 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值