[英]How is this a definition?
这个陈述如何定义? 难道它不应该只是一个声明,因为它在我们定义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语法中,它是一个结构或联合说明符 (后跟一个分号),又是一个类型说明符 (后跟一个分号),这是声明的允许形式之一(6.7 / 1)。
在C ++中,它是一个类说明符或类定义:C ++ 11的9/2说
类说明符通常称为类定义。
在C和C ++中,通常都说“每个定义都是声明”,所以这可能就是Stroustrup说它既是声明又是定义的原因。
在C语言中,这确实是正确的,因为上面的“定义”的定义。 在C ++中,我认为在语法上, 类说明符实际上是一个声明不是真的,但类定义引入了完整类型,而类声明引入了不完整类型。 对于不完整类型,您无能为力,对于完整类型也无能为力,因此类定义与struct Date;
这样的类声明“一样好” struct Date;
,更好。
这是一种新类型的声明struct Date
C和Date
在C ++中。 声明不是声明。 并且没有为新类型的声明保留内存。
声明类型为Date
。 它定义了Date
的成员,因此定义了它将创建的对象的大小。
它没有声明任何方法,因此不需要定义其他任何东西就可以完成该类。
另外,如果您不声明或定义构造函数,析构函数,赋值运算符等,C ++会尝试自动为您综合它们。 因此,此Date
最小定义包括默认构造函数,赋值运算符和析构函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.