这个陈述如何定义?难道它不应该只是一个声明,因为它在我们定义一个 struct date 类型的对象之前不分配任何内存?
struct Date { int d , m , y ; };
我正在阅读 Bjarne Stroustrup 所著的《C++ 编程语言》这本书,其中(在第 4.9 节中)已经说过这是一个声明和一个定义。
这个陈述如何定义?难道它不应该只是一个声明,因为它在我们定义一个 struct date 类型的对象之前不分配任何内存?
struct Date { int d , m , y ; };
我正在阅读 Bjarne Stroustrup 所著的《C++ 编程语言》这本书,其中(在第 4.9 节中)已经说过这是一个声明和一个定义。
struct Date; // forward declaration
struct Date{ int d, m, y; }; // class definition (struct is a class-key)
这不是任何一种语言的声明。C99 在 6.8 中定义语句,C++11 在 6 中定义语句。
在 C 中,它不是一个定义,它只是一个声明:C99 的 6.7/5 说:
标识符的定义是对该标识符的声明: — 对于一个对象,导致为该对象保留存储空间;——对于函数,包括函数体;— 对于枚举常量或 typedef 名称,是标识符的(唯一)声明。
由于这不是这三件事,所以它不是标识符的定义。在 C99 语法中,它是一个struct-or-union-specifier(后跟一个分号),而后者又是一个type-specifier(后跟一个分号),这是允许的声明形式之一(6.7/1)。
在 C++ 中,它是一个类说明符或类定义:C++11 的 9/2 说
类说明符通常称为类定义。
在 C 和 C++ 中,通常说“每个定义都是声明”,所以这可能就是 Stroustrup 说它既是声明又是定义的原因。
由于上述“定义”的定义,在 C 语言中这是严格正确的。在 C++ 中,我认为在语法中类说明符是声明实际上并不正确,但类定义引入了完整类型,而类声明引入了不完整类型。不完整的类型没有什么可以做,而完整的类型也不能做,所以类定义“和”类声明一样struct Date;
好,甚至更好。
struct Date
这是C 和Date
C++ 中新类型的声明。声明不是陈述。并且没有为新类型的声明保留任何内存。
它声明了类型Date
。它定义了Date
s 成员,因此定义了它将创建的对象的大小。
它没有声明任何方法,因此不需要为类完成任何其他定义。
此外,如果您不声明或定义构造函数、析构函数、赋值运算符等,C++ 将尝试自动为您合成它们。所以这个最小的定义Date
包括一个默认构造函数、赋值运算符和析构函数。