C中的const与C++中的const有何不同?

15

这段给出的代码在C语言中可以编译通过,但在C++中无法通过。

int main()
{
   const int x; /* uninitialized const compiles in C but fails in C++*/
}

从 C 转向 C++ 的原因和理由是什么?

5个回答

15

请查看规范,兼容性附录 C.1.6:

7.1.6 [参见 3.5]

更改: 在 C++ 中 const 对象必须初始化,但在 C 中可以不初始化

原因: const 对象不能被赋值,所以必须初始化为有用的值。

对原始特性的影响: 删除了语义上明确定义的特性。

转换难度: 语义转换。

使用频率: 很少。


在C语言中,常量对象可以被赋值吗? - Sergii
@Sergii 我不这么认为。在C语言中只有文件作用域的定义可以是试探性的。因此,在我看来,C程序无法为const块作用域变量提供值。 - Johannes Schaub - litb
@JohannesSchaub-litb C(或C ++)程序可以使用强制转换为const变量提供一个值:const int i; *((int*)& - Yury
2
@Yury 不行,那是未定义的行为。 - this

13
请注意,未初始化的自动存储期const限定对象存在合法用途:其地址可以被取出并用作递归函数中标记递归层次的唯一键。这有点晦涩,但值得注意。在C语言中可以高效地使用这种方法,而在C++中则需要浪费时间和代码大小进行初始化。(理论上编译器可能能够确定该值从未被使用并优化掉初始化,但由于你正在传递指针,这可能相当困难。)

您也可以想象一种情况,即使用外部魔法(例如连接器或完成的二进制文件),使正常内容出现在这样一个变量中,这是您不想要(或者可能不能)表达为C源代码的内容。 - unwind
如果有自动存储,链接器就无法引入它;每个函数调用都有一个实例,而不是任何全局变量。一旦在源代码级别存在未初始化对象的不确定值访问导致UB,编译器可能已经在链接器看到它之前生成了随机无意义的代码。 - R.. GitHub STOP HELPING ICE
没错,我没注意到“自动”的部分。 - unwind

6

const关键字在1989年的C89中被引入,但自1983年创建以来就一直存在于C++中。因此,它是从C++中“倒退”到C中的。

C和C ++中的初始化语义通常不同。尽管大多数时候它们“只是做您期望的事情”,但在某些情况下,差异变得非常重要。毕竟,C ++真的不是C的超集。

例如,在C ++中,您无法:

goto x;
int i = 3;
x:
puts("Hello, world");

但这在C语言中是完全合法的。

5
不会下投票,因为这很有趣(而且正确),但它并没有完全回答问题。 - cnicutar

3
ISO标准中说(在8.5 [dcl.init] 第9段):
如果未为对象指定初始化程序,并且该对象是(可能是cv限定的)非POD类类型(或其数组),则应对对象进行默认初始化;如果对象是const限定类型,则基础类类型必须具有用户声明的默认构造函数。
如果您尝试将示例修改为以下内容,则会发生什么:
int main()
{
   /*Unless explicitly declared extern, a const object does not have
 external linkage and must be initialized*/
   extern const int x; 
   return 0;
}

它将被编译。因此,这自我解释了在c++中强制执行此错误的必要性,声明未初始化的const变量和外部链接是无用的,所以程序员一定是因为失误而添加的。


-1
#include<iostream>
using namespace std;

class Test
{
    int value;
    public:
        Test(int v = 0) {value = v;}
        int getvalue() const {return value;}
};

int main(){

    Test t(20);
    cout << t.getvalue();
    return 0;
     
    const double P1 = 68.68;
    cout<<P1<<endl;
    
    int star  = 57;
    int const *pstar = &star;
    cout<<*pstar<<endl;
    
    return 0;
    
}

2
这如何解释C和C++之间的区别? - BoP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接