C++-C++中 class 和 struct 使用上的区分规则?
我们都知道,在C++中,struct和class,除了在默认访问权限外,语法上是没有任何区别的,在大型项目中,经常可以看到有些地方使用struct,有些地方使用class,struct是从C语言中演变过来的,那么我们在写代码过程中,如果要遵循一些编程规范,我们应该怎么来区分struct和class?在什么情况下应该用哪个?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(12)
class成员默认是private的,struct成员默认是public。在实际应用中应当多用class,一般只有在单纯地封装一组数据时采用struct,且这种情况下的struct大都定义在class内部,作为一个数据集合。
的确只有默认的权限区别,但是一般我会用struct,因为一个类开始总是public在前,private在后,为了少写public,我会使用struct定义类,这样其后的方法都是默认public的,直到需要private。从简洁上考虑,使用struct更好!
class更强调封装性,是从面向过程向面向对象的重要转变。本质上没什么区别。
从编译器角度两者除了默认访问权限外确实没有不同。但是从含义上说,struct是从C继承来的东西,在C中只有数据没有对象的概念;而class是C++新加入的,明确表示是用来表述对象特性的。
因此在使用中,struct只用来描述数据,而class只用来描述对象是合理的做法。当然有人会说数据也是对象,这就看个人的理解了。比如我认为只有有行为(方法)的才是对象,但并不排除某些对象只有数据,因为在将来的某个时刻,这个对象会有行为的。
我只知道,class是有struct演变过来的!而结构体也可以有函数什么的!只是没有限定词罢了!
一般情况下我们公司的代码使用struct的话只能使用C的原生数据类型,也就是int char这种,这样能直接用memset直接零值初始化,struct不允许有函数,特别是虚函数,也就是我们公司是严格区分struct和class的,struct只能用C的方式
struct和class由于历史原因,具有非常大的相似性和互相替换性。
但是他们的意义却相去甚远。
最简单分辨class和struct的方法如下:
class的所有成员变量应当是private的,并且具有和局部变量有区别的命名方式
struct的所有成员变量应当是public的,struct可以拥有构造函数,但不应当有其他函数(包括析构)。
当一个class/struct你无法区分它到底是class还是struct,你应当重新设计你的代码。
在 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可以让代码看起来更简洁
其实二者区别很小,要不是因为兼容C,Struct完全可以消失。
区别只有::
struct默认访问权限是public,而class默认访问权限是private。
继承时struct缺省是public继承,而class缺省是private继承
可以参考一下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)
C++中的struct只是为了向下兼容而保留的一个C语言的特性,其本质就是默认权限为public的class。
参考:
《深入探索C++对象模型》
《C++语言的设计与演化》
小弟看法如下:
1.区别就在于权限,前面的大牛们都已经讲过了
2.既然区别不大,不用过于纠结,除了权限的影响因素之外,一般我就是对于很简单的结构(一般都不用定义成员函数)就使用结构体,复杂一些的结构就采用类