【发布时间】:2014-10-25 07:04:58
【问题描述】:
在学习 C++ 时,书籍总是创建如下结构:
struct X{
int a;
};
X y;
X *yp; // pointer to object of X class
但我在网上看到一些 C++ 代码,人们使用以下语法:
struct X y;
struct X *yp;
他们为什么要在前面加上struct,这两种创建X类对象的方法有什么区别。
【问题讨论】:
在学习 C++ 时,书籍总是创建如下结构:
struct X{
int a;
};
X y;
X *yp; // pointer to object of X class
但我在网上看到一些 C++ 代码,人们使用以下语法:
struct X y;
struct X *yp;
他们为什么要在前面加上struct,这两种创建X类对象的方法有什么区别。
【问题讨论】:
在 C++(相对于 C)中,当 X 是结构类型时,您通常可以只写 X。你还需要写struct X
X 尚未声明时。最后一点的例子:
friend 声明中,第一点示例:
struct A {};
void A() {}
auto main() -> int
{
void (*f)() = &A;
//A x; // !nyet
struct A x;
}
【讨论】:
这是来自 C 的遗产。在 C 中,以下代码:
struct Foo
{
int a;
};
创建了一个结构,并将其标签“Foo”放在自己的“标签命名空间”中
访问它的唯一方法是:
struct Foo foo;
或者,更常见的:
typedef struct Foo Foo;
Foo foo;
但是,在 C++ 中,标签不仅被放置在单独的标签命名空间中,而且
在封闭的命名空间中。但是为了向后兼容,它仍然允许您
使用struct Name访问它
在 C 和 C++ 中还有一个构造 struct Name 的使用
这是一个前向声明:
struct Later;
Later在这里是一个不完整的类型,你只能将它用于不完整的东西
需要知道它的大小(比如创建一个指针)
【讨论】: