C++-C++中 class 和 struct 使用上的区分规则?

C++-C++中 class 和 struct 使用上的区分规则?

瑾兮 发布于 2016-12-14 字数 288 浏览 1225 回复 12

我们都知道,在C++中,struct和class,除了在默认访问权限外,语法上是没有任何区别的,在大型项目中,经常可以看到有些地方使用struct,有些地方使用class,struct是从C语言中演变过来的,那么我们在写代码过程中,如果要遵循一些编程规范,我们应该怎么来区分struct和class?在什么情况下应该用哪个?

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(12

虐人心 2017-10-12 12 楼

class成员默认是private的,struct成员默认是public。在实际应用中应当多用class,一般只有在单纯地封装一组数据时采用struct,且这种情况下的struct大都定义在class内部,作为一个数据集合。

灵芸 2017-09-23 11 楼

的确只有默认的权限区别,但是一般我会用struct,因为一个类开始总是public在前,private在后,为了少写public,我会使用struct定义类,这样其后的方法都是默认public的,直到需要private。从简洁上考虑,使用struct更好!

偏爱自由 2017-07-19 10 楼

class更强调封装性,是从面向过程向面向对象的重要转变。本质上没什么区别。

夜无邪 2017-06-22 9 楼

从编译器角度两者除了默认访问权限外确实没有不同。但是从含义上说,struct是从C继承来的东西,在C中只有数据没有对象的概念;而class是C++新加入的,明确表示是用来表述对象特性的。
因此在使用中,struct只用来描述数据,而class只用来描述对象是合理的做法。当然有人会说数据也是对象,这就看个人的理解了。比如我认为只有有行为(方法)的才是对象,但并不排除某些对象只有数据,因为在将来的某个时刻,这个对象会有行为的。

归属感 2017-05-21 8 楼

我只知道,class是有struct演变过来的!而结构体也可以有函数什么的!只是没有限定词罢了!

夜无邪 2017-04-23 7 楼

一般情况下我们公司的代码使用struct的话只能使用C的原生数据类型,也就是int char这种,这样能直接用memset直接零值初始化,struct不允许有函数,特别是虚函数,也就是我们公司是严格区分struct和class的,struct只能用C的方式

晚风撩人 2017-04-15 6 楼

struct和class由于历史原因,具有非常大的相似性和互相替换性。
但是他们的意义却相去甚远。
最简单分辨class和struct的方法如下:
class的所有成员变量应当是private的,并且具有和局部变量有区别的命名方式
struct的所有成员变量应当是public的,struct可以拥有构造函数,但不应当有其他函数(包括析构)。
当一个class/struct你无法区分它到底是class还是struct,你应当重新设计你的代码。

归属感 2017-03-27 5 楼

在 C++ 中class 和 struct 只有两点主要区别:
1. 默认继承权限。默认情况下,class的继承是以private来继承而struct则是按照public进行继承。
2. 成员的默认访问权限。class的成员默认是private权限,struct默认是public权限。
而其它的特性,struct和class基本上,甚至严格来说是一样的。

//一个不常见的示例,将 struct 直接改为class也能编译通过。
//编译环境为 GCC 4.4.1
#include <iostream>
#include <string>

using namespace std;

struct bar
{
private:// 访问权限修饰符
int y;

public:
bar(){};//无参构造函数

bar(int a){ y = a;}//带参数的构造函数

~bar();//虚构函数

void say();

virtual void func1() = 0;//纯虚函数
};

struct foo: protected bar// 继承
{
private:
int x;

public:
foo(){};

void say(string msg) {cout<<msg<<endl;}

virtual int func2();//虚函数
};

int main()
{

return 0;
}

可以看到:
1. 都可以有成员函数:struct可以包含和class中一样的构造函数,析构函数,重载的运算符,友元类,友元结构,友元函数,虚函数,纯虚函数,静态函数;
2. 尽管默认访问权限不同,但都可以拥有public/private/protected修饰符;
3. 都可以进行复杂的继承和多重继承,一个struct可以继承自一个或多个class,反之亦可。
注意这里与C语言并不相同,C 语言中的 struct 从本质上来说只是一个包装数据的语法机制。

在一般情况下,仍必须使用struct结构的主要原因是:
1. 开发维护遗留系统。
2. 需要与传统的API进行通讯。
3. 当然,有时使用struct可以让代码看起来更简洁

灵芸 2017-03-15 4 楼

其实二者区别很小,要不是因为兼容C,Struct完全可以消失。
区别只有::
struct默认访问权限是public,而class默认访问权限是private。
继承时struct缺省是public继承,而class缺省是private继承

甜柠檬 2017-02-08 3 楼

可以参考一下google C++ coding style
Structs Vs Classes:
http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Structs_vs._Classes

当然了,既然叫style,那就是仁者见仁,智者见智的事情了。
对于我来说,如果一个东西要设计成为struct.那必须是一个POD(plain old data)
至于什么是POD呢?
如果不懂,参考这里(http://stackoverflow.com/questions/4178175/what-are-aggregates-and-pods-and-how-why-are-they-special)

夜无邪 2017-01-16 2 楼

C++中的struct只是为了向下兼容而保留的一个C语言的特性,其本质就是默认权限为public的class。
参考:
《深入探索C++对象模型》
《C++语言的设计与演化》

清晨说ぺ晚安 2017-01-02 1 楼

小弟看法如下:
1.区别就在于权限,前面的大牛们都已经讲过了
2.既然区别不大,不用过于纠结,除了权限的影响因素之外,一般我就是对于很简单的结构(一般都不用定义成员函数)就使用结构体,复杂一些的结构就采用类