Unix/C++--结构体struct和class类区别

Unix/C++--结构体struct和class类区别

easylogging、libsigcpp,代码中使用大量的结构体代替类,所以想深入理解这么做的考虑是什么,遂整理了这博客。

1 struct 介绍

  • 结构是一种用关键字struct声明的自定义数据类型。与类相似,也可以包含构造函数,常数,字段,方法,属性,索引器,运算符和嵌套类型等,不过,结构是值类型。
  • C–结构体的定义和使用

2 class介绍

C++概述

3 异同

C++中声明一个新的型别,如果不需要虚拟函数,不需要构造,析构方法,那么声明为struct要比声明为class更高效和简洁,因为编译器内部会对此进行分析并且优化。
1:结构的构造函数和类的构造函数不同

  • 结构不能包含显式的无参数构造函数。结构成员将自动初始化为它们的默认值。
  • 结构不能包含以下形式的初始值设定类:base(argument-list);

2:对于结构中的实例字段成员,不能在声明时赋值初始化
3:声明了结构类型后,可以使用new运算符创建构造对象,也可以不使用new关键字。如果不使用new,那么在初始化所有字段之前,字段将保持未赋值状态且对象不可用。
4:什么时候用结构呢?结构使用简单,并且很有用,但是要牢记:结构在堆栈中创建,是值类型,而类是引用类型。每当需要一种经常使用的类型,而且大多数情况下该类型只是一些数据时,使用结构能比使用类获得更佳性能。
注意:
1:结构是值类型,所以会影响性能,但根据使用结构的方式,这种影响可能是正面的,也可能是负面的。正面的影响是为结构分配内存时,速度非常快,因为它们将内联或者保存在堆栈中。在结构超出了作用域被删除时,速度也很快。**另一方面,只要把结构作为参数来传递或者把一个结构赋给另一个结构(例如A=B,其中A和 B是结构),结构的所有内容就被复制,而对于类,则只复制引用。这样,就会有性能损失,根据结构的大小,性能损失也不同。注意,结构主要用于小的数据结构。但当把结构作为参数传递给方法时,就应把它作为ref参数传递,以避免性能损失——此时只传递了结构在内存中的地址,这样传递速度就与在类中的传递速度一样快了。**另一方面,如果这样做,就必须注意被调用的方法可以改变结构的值。
2:struct 与class本质上应该是相同的,只是默认的访问权限不同(struct默认是public,class默认是private ).之所以要保留struct,很大一部分原因是为了与C兼容吧(C++的一篇文章中是这么说的,我感觉还是有一定的道理). class感觉是应该是struct的扩充,除了可以设置成员的访问类型外,还可以有自己的成员函数,可以继承派生等,好象struct能做的class 都能做,但反过来就不行了,如果没有保护数据的要求,struct能做的我都用struct做,比较简单。
3、结构体可以继承,类也可以继承结构体
下面示例代码摘自libsigcpp,
SIGC_API 为开关功能模块的宏,类可以继承结构体

struct SIGC_API signal_base
{
	...
}
class signal_with_accumulator : public signal_base
{
	...
}

结构体可以继承机构体

struct SIGC_API notifiable
{
	using func_destroy_notify = internal::func_destroy_notify;
};
struct SIGC_API trackable : public notifiable
{
	...
}

4 初始问题分析

为结构分配内存时,速度非常快,因为它们将内联或者保存在堆栈中。在结构超出了作用域被删除时,速度也很快。
easylogging、libsigcpp,代码中使用大量的结构体代替类,应该更多的考量是内存分配的速度快,性能高,使用内存少。
其他考虑,等想明白再加。

参考

1、C++中结构体与类的区别(结构不能被继承,默认是public,在堆栈中创建,是值类型,而类是引用类型)good
2、C–结构体的定义和使用
3、C++概述
4、C++ struct继承struct
5、C++结构体完全攻略(超详细)

展开阅读全文
©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读