C++中'struct'和'class'之间的所有区别是什么?
C++中'struct'和'class'之间的所有区别是什么?
\n可能是重复问题:
\nC++中struct和class之间的区别是什么 \n
\n我曾经认为C++类之间唯一的区别是默认为private的类成员访问修饰符和与C语言类似的布局保证。\n但是事实证明我错了,因为这段代码无法编译通过:\n
class { int value; } var = { 42 };
\n而这段代码可以:\n
struct { int value; } var = { 42 };
\n我无法弄清楚为什么会有这样的区别,但在Visual C++ 2008中显然存在这样的差异:\n
\n错误 C2552:
\'var\'
:非聚合体无法使用初始化列表进行初始化\n
\n所以,是的,我将再次提出一个重复问题(希望没有重复的答案!):\n
C++中struct和class之间的所有区别是什么?
\n当然,如果您发现我在其他问题中遗漏了什么,请随意关闭此问题 - 我肯定可能会有遗漏。但我没有看到任何答案中讨论这个问题,所以我想问一下。
C++中的`struct`和`class`关键字之间的所有区别是什么?
在C++中,`struct`和`class`关键字的主要区别在于默认的访问权限。使用`struct`定义的成员默认为公共(public)访问权限,而使用`class`定义的成员默认为私有(private)访问权限。这是它们之间唯一的语法上的区别。
然而,上述代码中提到的区别并不是`class`和`struct`之间的区别,而是聚合类型(aggregate)和非聚合类型(non-aggregate)之间的区别。使用聚合类型可以使用初始化列表(initializer list),而非聚合类型不能使用初始化列表。这与`class`或`struct`关键字无关。
以下是示例代码:
class { public: int value; } var = {42}; // 编译通过 struct { private: int value; } var = {42}; // 报错
原因:
- 这是因为使用`class`关键字定义的类型是非聚合类型,不能使用初始化列表进行初始化。
- 而使用`struct`关键字定义的类型是聚合类型,可以使用初始化列表进行初始化。
解决方法:
- 如果想要使用初始化列表进行初始化,可以使用`struct`关键字定义类型。
- 如果需要使用非聚合类型,可以使用`class`关键字定义类型,但不能使用初始化列表进行初始化。
- `struct`和`class`关键字之间的主要区别在于默认的访问权限。
- 在C++中,聚合类型和非聚合类型之间存在使用初始化列表的区别。
- `struct`关键字定义的类型是聚合类型,可以使用初始化列表进行初始化。
- `class`关键字定义的类型是非聚合类型,不能使用初始化列表进行初始化。
在这段对话中,讨论了C++中'struct'和'class'之间的区别。问题的起因是使用{}
初始化器时的错误,提示说只能对聚合体使用{}
初始化器,而第一个类不是聚合体,因为它有一个私有数据成员。根据C++标准,聚合体是一个数组或一个没有用户声明构造函数,没有私有或受保护非静态数据成员,没有基类和没有虚函数的类。对于详细的答案,请参考链接:What is assignment via curly braces called? and can it be controlled?。
讨论中提到,添加public:
修复了这个问题。对于为什么允许创建这样的类的问题,某些情况下即使没有合法的方式访问x
,也可以仍然创建这样的类的实例,并且可以将其作为句柄使用。通过检查地址可以对这些实例进行比较,这在Windows API中经常使用。
最后,还提供了一个链接:Handles Comparison: empty classes vs. undefined classes vs. void*,供进一步了解。