1.前言
本篇目的:C++之结构体初始化10种方式总结
2.C++中的结构体(struct)和类(class)区别
C++中的结构体(struct)和类(class)是两种用于封装数据和相关操作的复合数据类型。尽管它们在许多方面相似,但它们在C++中的使用和设计理念上存在一些关键差异。
首先,从语法角度看,结构体和类的基本定义形式非常相似。它们都允许我们定义数据成员(即变量)和成员函数(即函数),以便我们可以对数据进行操作。然而,在C++中,结构体默认是公有(public)的,这意味着其成员默认是公开的,可以直接访问。相反,类默认是私有的(private),这意味着其成员默认是隐藏的,需要通过公有成员函数进行访问。
这种默认访问权限的差异反映了结构体和类在C++中的设计理念。结构体通常被用于将一组数据聚合在一起,形成一个逻辑上的整体,这些数据成员通常是可以直接访问的。而类则更强调封装和隐藏内部状态,通过公有成员函数提供对内部数据的访问和操作,从而保护数据的完整性和安全性。
此外,类还提供了更多的特性,如继承、多态和模板等,这些特性使得类在构建大型、复杂的软件系统时更加灵活和强大。结构体虽然也可以实现一些基本的封装和抽象,但在这些高级特性上则显得力不从心。
总的来说,结构体和类在C++中都是用于封装数据和操作的复合数据类型,但它们在默认访问权限、设计理念以及提供的特性上存在差异。选择使用结构体还是类,应根据具体的应用场景和需求来决定。对于简单的数据聚合,可以使用结构体;对于需要更复杂封装和抽象的场景,则应使用类。
3.代码实例
直接初始化
struct MyStruct { int x; double y; }; MyStruct s1 = {10, 3.14};
使用成员初始化列表
struct MyStruct { int x; double y; }; MyStruct s2 = { .x = 10, .y = 3.14 };
默认初始化并逐个赋值
struct MyStruct { int x; double y; }; MyStruct s3; s3.x = 10; s3.y = 3.14;
使用构造函数初始化
struct MyStruct { int x; double y; MyStruct(int a, double b) : x(a), y(b) {} }; MyStruct s4(10, 3.14);
使用默认构造函数初始化
struct MyStruct { int x; double y; }; MyStruct s5{}; s5.x = 10; s5.y = 3.14;
使用列表初始化
struct MyStruct { int x; double y; }; MyStruct s6{}; s6 = {10, 3.14};
使用无名称的临时结构体对象
struct MyStruct { int x; double y; }; MyStruct s7 = MyStruct{10, 3.14};
使用emplace_back()
struct MyStruct { int x; double y; }; std::vector<MyStruct> vec; vec.emplace_back(10, 3.14);
使用std::make_pair()
struct MyStruct { int x; double y; }; std::pair<int, double> p = std::make_pair(10, 3.14); MyStruct s8 = {p.first, p.second};
使用memcpy()
struct MyStruct { int x; double y; }; MyStruct s9; int tempX = 10; double tempY = 3.14; std::memcpy(&s9, &MyStruct{tempX, tempY}, sizeof(MyStruct));
使用无名称的临时结构体对象实例代码 V1.0
#include <iostream> using namespace std; struct BinderHandle1 { int32_t handle; }; class BpBinder1 { public: BpBinder1(BinderHandle1 handle) { this->handle = handle; } private: BinderHandle1 handle; }; struct BinderHandle2 { int32_t handle; string data; }; class BpBinder2 { public: BpBinder2(BinderHandle2 handle) { this->handle = handle; } private: BinderHandle2 handle; }; int main() { int handle = 100; BpBinder1 *bp = new BpBinder1(BinderHandle1{handle}); delete bp; BpBinder2 *bp2 = new BpBinder2(BinderHandle2{handle,"124"}); return 0; }
使用无名称的临时结构体对象实例代码 V2.0
#include <iostream> using namespace std; struct BinderHandle2 { int32_t handle; string data; }; class BpBinder2 { public: BpBinder2(BinderHandle2 handle) { this->handle = handle; printf("xxx--------------->%s(), line = %d, handle = %d\n",__FUNCTION__,__LINE__,this->handle.handle); printf("xxx--------------->%s(), line = %d, data = %s\n",__FUNCTION__,__LINE__,this->handle.data.c_str()); } private: BinderHandle2 handle; }; int main() { int handle = 100; BpBinder2 *bp2 = new BpBinder2(BinderHandle2{handle,"124"}); delete bp2; return 0; }