【发布时间】:2011-05-22 11:49:14
【问题描述】:
给定的代码在 C 中编译,但在 C++ 中失败。
int main()
{
const int x; /* uninitialized const compiles in C but fails in C++*/
}
从 C 到 C++ 的转变背后的基本原理和原因是什么?
【问题讨论】:
给定的代码在 C 中编译,但在 C++ 中失败。
int main()
{
const int x; /* uninitialized const compiles in C but fails in C++*/
}
从 C 到 C++ 的转变背后的基本原理和原因是什么?
【问题讨论】:
请参阅兼容性附录 C.1.6 中的规范:
7.1.6 [另见 3.5]
更改: const 对象必须在 C++ 中初始化,但可以在 C 中保持未初始化状态
基本原理:一个 const 对象不能被赋值,所以它必须被初始化以保存一个有用的值。
对原始特征的影响:删除语义明确的特征。
转换难度:语义转换。
应用的广泛程度:很少。
【讨论】:
const 块范围变量提供值。
const int i; *((int*)&
请注意,自动存储持续时间的未初始化、 const 限定对象的合法使用:它的地址可以用作标记递归函数中递归级别的唯一键。这有点晦涩,但值得注意。 C 使这种使用变得高效,而 C++ 则需要您在初始化它时浪费时间和代码大小。 (理论上,编译器可能会确定该值从未被使用并优化初始化,但由于您传递的是指针,因此很难证明。)
【讨论】:
const 关键字于 1989 年在 C89 中引入 C,但自 1983 年创建以来一直与 C++ 一起使用。因此它从 C++“向后移植”到 C。
初始化语义在 C 和 C++ 中通常是不同的。尽管大多数时候他们“只是做你期望的事情”,但在某些情况下差异变得非常重要。毕竟,C++ 真的不是 C 的超集。
例如,在 C++ 中你不能:
goto x;
int i = 3;
x:
puts("Hello, world");
但这在 C 中是完全合法的。
【讨论】:
ISO 标准说(在 8.5 [dcl.init] paragraph 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;
}
它将被编译。所以这个self解释了需要对c++强制执行这个错误,声明const vars而不初始化和extern links是没有用的,所以coder肯定是加错了。
【讨论】:
#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 = ☆
cout<<*pstar<<endl;
return 0;
}
【讨论】: