这句话怎么定义?它不应该只是一个声明,因为在我们定义struct date类型的对象之前它不会分配任何内存吗?
struct Date { int d , m , y ; };
我读过Bjarne Stroustrup的这本名为“C ++编程语言”的书,其中已经说过(见4.9节)这是一个声明和定义。
答案 0 :(得分:4)
struct Date; // forward declaration
struct Date{ int d, m, y; }; // class definition (struct is a class-key)
答案 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
的这个最小定义包括默认构造函数,赋值运算符和析构函数。