C++中'struct'和'class'之间的所有区别是什么?

19 浏览
0 Comments

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当然,如果您发现我在其他问题中遗漏了什么,请随意关闭此问题 - 我肯定可能会有遗漏。但我没有看到任何答案中讨论这个问题,所以我想问一下。

0
0 Comments

问题出现的原因:

这个问题出现的原因是因为有人想要了解C++中的结构体(struct)和类(class)之间的区别。

解决方法:

要解决这个问题,可以尝试使用下面的代码代替原来的代码:

class { public: int value; } var = { 42 };

这段代码将定义一个公有的类(class),其中有一个整型变量value。通过使用这个代码,就可以理解结构体(struct)和类(class)之间的区别在于访问权限的不同。

0
0 Comments

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`关键字定义的类型是非聚合类型,不能使用初始化列表进行初始化。

0
0 Comments

在这段对话中,讨论了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*,供进一步了解。

0