繁体   English   中英

这个定义如何?

[英]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) 

另请参阅ISO 14882:98 9.1-1和-2类定义

同样相关的ISO 14882:98 3.2一定义规则

这不是两种语言的陈述。 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM