这个问题已经在C#/.Net的上下文中被问及过。
现在我想学习C++中结构体和类的区别。请讨论技术差异以及在面向对象设计中选择其中一个的原因。
我将从一个明显的区别开始:
- 如果没有指定
public:
或private:
,结构体的成员默认为public;类的成员默认为private。
我相信在C++规范的晦涩角落还可以找到其他差异。
您忘记了类和结构体之间的棘手区别。
引用标准(§11.2.2 in C++98 through C++11):
在派生类声明为struct时,如果一个基类缺少访问说明符,则默认情况下使用public;如果一个基类缺少访问说明符,则默认情况下使用private。
为了完整起见,class和struct之间更广为人知的差异在(11.2)中定义:
使用class关键字定义的类的成员默认为private。使用struct或union关键字定义的类的成员默认为public。
额外的差异:关键字class
可以用于声明模板参数,而struct
关键字不能这样使用。
class
时,所有子对象默认为私有,而使用 struct
则默认为公共,两者都定义了一个类类型。 - Ben Voigt引用C++ FAQ的话:
[7.8]关键字struct和class有什么区别?
一个结构体(struct)的成员变量和继承类默认为 public,而类(class)默认为 private。注意: 应该明确指定基类为public、private或protected,而不是依赖默认值。
在其他方面,struct和class具有相同的功能。
好的,够了这种干净利落的技术说法。情感上,大多数开发人员对类和结构体之间有很强的区别。结构体仅仅感觉像是一个开放的位桶,几乎没有封装或功能。类感觉像是一个生活在社会中并拥有智能服务、强封装屏障和良好定义接口的负责任成员。由于这是大多数人已经有的内涵,如果你有一个只有很少方法和公共数据的类(在设计良好的系统中确实存在这样的事情!),那么你应该使用struct关键字,但否则你应该使用class关键字。
struct
的定义隐藏在*.c
文件中,并让其他翻译单元只能通过指针来使用它。因此,你拥有更强的封装性,因为其他翻译单元甚至不知道struct
里面有什么。 - 12431234123412341234123类的成员默认为私有,结构体的成员默认为公共。除此之外,没有其他区别。另请参见此问题。
struct
和 class
都声明了一个具有相同语义的 _类_(尽管在解析定义体时可能会有不同的理解)。 - Lightness Races in Orbit你使用哪种风格取决于情况和口味。我通常更喜欢将
struct
用于所有数据都是公共的类。我认为这样的类是“不太合适的类型,只是数据结构”。
在功能上,除了 public/private 外没有任何区别。
例如,程序1编译失败,而程序2可以正常工作。
// Program 1
#include <stdio.h>
class Test {
int x; // x is private
};
int main()
{
Test t;
t.x = 20; // compiler error because x is private
getchar();
return 0;
}
// Program 2
#include <stdio.h>
struct Test {
int x; // x is public
};
int main()
{
Test t;
t.x = 20; // works fine because x is public
getchar();
return 0;
}
例如,程序3编译失败而程序4正常工作。
// Program 3
#include <stdio.h>
class Base {
public:
int x;
};
class Derived : Base { }; // is equivalent to class Derived : private Base {}
int main()
{
Derived d;
d.x = 20; // compiler error because inheritance is private
getchar();
return 0;
}
// Program 4
#include <stdio.h>
class Base {
public:
int x;
};
struct Derived : Base { }; // is equivalent to struct Derived : public Base {}
int main()
{
Derived d;
d.x = 20; // works fine because inheritance is public
getchar();
return 0;
}
STRUCT是一种抽象数据类型,根据结构规范将给定的内存块分成不同的部分。在文件序列化/反序列化中,STRUCT很有用,因为结构体通常可以直接写入文件。(即:获取指向结构体的指针,使用SIZE宏计算要复制的字节数,然后移动结构体中的数据进出)
类是另一种抽象数据类型,旨在确保信息隐藏。内部可能会有各种操纵、方法、临时变量、状态变量等,所有这些都用于向想要使用类的任何代码提供一致的API。
实际上,structs关注于数据,而classes关注于代码。
但您需要了解这些仅仅是抽象。完全可以创建看起来像类的structs和看起来像structs的classes。事实上,最早期的C++编译器只是将C++代码转换为C的预编译器。因此,这些抽象是有益于逻辑思维的,不一定是计算机本身的资产。
除了它们是不同类型的抽象之外,类还提供了解决C代码命名难题的解决方案。由于不能公开具有相同名称的多个函数,开发人员曾经遵循_()模式。例如:mathlibextreme_max()。通过将API分组到类中,类似的函数(这里称为“方法”)可以分组在一起,并受到来自其他类方法命名的保护。这使程序员能够更好地组织代码并增加代码重用。至少理论上是这样。
struct
声明类(包括public
/private
/protected
、继承等)。 - melpomeneclass
和struct
的区别是关键字之间的差异,而不是数据类型之间的差异。
struct foo : foo_base { int x;};
class bar : bar_base { int x; };
两者都定义了一个类类型。这个上下文中关键词的不同之处在于默认访问权限不同:
foo::x
为公共(public),foo_base
以公共方式继承bar::x
为私有(private),bar_base
以私有方式继承class A{
public:
int i;
};
class A2:A{
};
struct A3:A{
};
struct abc{
int i;
};
struct abc2:abc{
};
class abc3:abc{
};
int _tmain(int argc, _TCHAR* argv[])
{
abc2 objabc;
objabc.i = 10;
A3 ob;
ob.i = 10;
//A2 obja; //privately inherited
//obja.i = 10;
//abc3 obss;
//obss.i = 10;
}
这是关于VS2005的。
struct
的区别吗?请看这里。 - Marc.2377struct
的含义。;) 但你完全可以使用class
关键字来代替。 - Lightness Races in Orbit