这个定义怎么样?

时间:2012-04-26 10:12:28

标签: c++ c declaration

这句话怎么定义?它不应该只是一个声明,因为在我们定义struct date类型的对象之前它不会分配任何内存吗?

struct Date { int d , m , y ; };

我读过Bjarne Stroustrup的这本名为“C ++编程语言”的书,其中已经说过(见4.9节)这是一个声明和定义。

4 个答案:

答案 0 :(得分:4)

struct Date; // forward declaration

struct Date{ int d, m, y; }; // class definition (struct is a class-key) 

另见ISO 14882:98 9.1-1 and -2 class-definition

也相关ISO 14882:98 3.2 One-definition-rule

答案 1 :(得分:4)

这不是任何一种语言的陈述。 C99定义了6.8中的语句,而C ++ 11定义了6中的语句。

在C中,它不是一个定义,它只是一个声明:C99的6.7 / 5说:

  

标识符的定义是该标识符的声明:      - 对于一个对象,导致为该对象保留存储;      - 用于功能,包括功能体;      - 对于枚举常量或typedef名称,是标识符的(唯一)声明。

由于这不是这三件事,所以它不是标识符的定义。在C99语法中,它是 struct-or-union-specifier (后跟分号),而后者又是类型说明符(后跟半-colon),这是声明(6.7 / 1)的允许形式之一。

在C ++中,它是类说明符或类定义:C ++ 11的9/2表示

  

类说明符通常称为类定义。

在C和C ++中,通常会说“每个定义都是一个声明”,所以这可能就是为什么Stroustrup说这是一个声明和一个定义。

在C中,由于上面“定义”的定义,这是完全正确的。在C ++中,我认为在 class-specifier 是一个声明的语法中并不是这样,但是类定义引入了一个完整的类型,而类声明引入了一个不完整的类型。对于完整类型,您无法对不完整的类型执行任何操作,因此类定义“与”struct Date;之类的类声明“一样好”,并且更好。

答案 2 :(得分:0)

这是C中新类型struct Date和C ++中Date的声明。声明不是声明。并且没有为新类型的声明保留内存。

答案 3 :(得分:0)

它声明类型Date。它定义了Date个成员,因此定义了它将创建的对象的大小。

它没有声明方法,因此不需要为该类定义任何其他内容。

另外,如果你没有声明或定义构造函数,析构函数,赋值运算符等,C ++会尝试自动为你合成它们。因此Date的这个最小定义包括默认构造函数,赋值运算符和析构函数。