我是C++的新手。
我有一个类如下:
class CodeTest
{
private:
static const int TOTAL=100;
};
TOTAL
是一个声明还是定义?
当我阅读Scott Meyer的书时,提到在实现文件中我们需要定义类似于:
const int CodeTest::TOTAL;
为什么这是必需的?
我是C++的新手。
我有一个类如下:
class CodeTest
{
private:
static const int TOTAL=100;
};
TOTAL
是一个声明还是定义?
当我阅读Scott Meyer的书时,提到在实现文件中我们需要定义类似于:
const int CodeTest::TOTAL;
为什么这是必需的?
在头文件之外的实现文件中进行声明是必需的,否则每个包含该头文件的翻译单元都会定义自己的对象(即变量的存储空间)。
这将违反一次定义规则。其结果是,如果在一个翻译单元中更改了变量,则其他翻译单元将看不到此更改。尽管变量是常量,但取其地址也会在不同的翻译单元中产生不同的指针,因此这很重要。
inline
只是编译器的提示,它们不一定会被内联。 - Nawazinline
并不是给编译器的提示,它决定了链接。是的,就实际的内联而言,它是一个提示,但它也决定了链接,这样的函数不会被导出,因此也不会违反ODR。 - Konrad Rudolphinline
决定的链接是如何帮助这里的? - Nawazconst
整型类型的部分仅适用于这种特殊情况 - 即您可以在类内部初始化该类型,但所有static
数据成员必须在外部定义。问题的第一部分:
这行代码:static const int TOTAL=100;
是一个声明后跟着一个初始化。
TOTAL
是一个标识符。
问题的第二部分:
需要使用 const int CodeTest::TOTAL
来初始化变量。
const
关键字标记了。它是一个常数,就像任何常数定义一样处理,编译器可以为其分配数据区域的空间,也可以不分配。 - Luis Coloradostatic const int TOTAL=100; // is a declaration followed by an initialisation.
来自C++标准第3.1节:
声明将名称引入翻译单元或重新声明先前声明引入的名称。声明指定这些名称的解释和属性。
下一段陈述了,除非它在类定义中声明静态成员,否则声明就是定义:
struct X
{
int a; // defines a
static int b; // declares b
};
您可以在这里阅读更多关于定义和声明的内容:SO: 什么是定义和声明之间的区别?