简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
1.前言
本篇目的:C++之结构体初始化10种方式总结
2.C++中的结构体(struct)和类(class)区别
-
C++中的结构体(struct)和类(class)是两种用于封装数据和相关操作的复合数据类型。尽管它们在许多方面相似,但它们在C++中的使用和设计理念上存在一些关键差异。
-
首先,从语法角度看,结构体和类的基本定义形式非常相似。它们都允许我们定义数据成员(即变量)和成员函数(即函数),以便我们可以对数据进行操作。然而,在C++中,结构体默认是公有(public)的,这意味着其成员默认是公开的,可以直接访问。相反,类默认是私有的(private),这意味着其成员默认是隐藏的,需要通过公有成员函数进行访问。
-
这种默认访问权限的差异反映了结构体和类在C++中的设计理念。结构体通常被用于将一组数据聚合在一起,形成一个逻辑上的整体,这些数据成员通常是可以直接访问的。而类则更强调封装和隐藏内部状态,通过公有成员函数提供对内部数据的访问和操作,从而保护数据的完整性和安全性。
-
此外,类还提供了更多的特性,如继承、多态和模板等,这些特性使得类在构建大型、复杂的软件系统时更加灵活和强大。结构体虽然也可以实现一些基本的封装和抽象,但在这些高级特性上则显得力不从心。
-
总的来说,结构体和类在C++中都是用于封装数据和操作的复合数据类型,但它们在默认访问权限、设计理念以及提供的特性上存在差异。选择使用结构体还是类,应根据具体的应用场景和需求来决定。对于简单的数据聚合,可以使用结构体;对于需要更复杂封装和抽象的场景,则应使用类。
3.代码实例
<1>.直接初始化
struct MyStruct {
int x;
double y;
};
MyStruct s1 = {10, 3.14};
<2>.使用成员初始化列表
struct MyStruct {
int x;
double y;
};
MyStruct s2 = { .x = 10, .y = 3.14 };
<3>.默认初始化并逐个赋值
struct MyStruct {
int x;
double y;
};
MyStruct s3;
s3.x = 10;
s3.y = 3.14;
<4>.使用构造函数初始化
struct MyStruct {
int x;
double y;
MyStruct(int a, double b) : x(a), y(b) {}
};
MyStruct s4(10, 3.14);
<5>.使用默认构造函数初始化
struct MyStruct {
int x;
double y;
};
MyStruct s5{};
s5.x = 10;
s5.y = 3.14;
<6>.使用列表初始化
struct MyStruct {
int x;
double y;
};
MyStruct s6{};
s6 = {10, 3.14};
<7>.使用无名称的临时结构体对象
struct MyStruct {
int x;
double y;
};
MyStruct s7 = MyStruct{10, 3.14};
<8>.使用emplace_back()
struct MyStruct {
int x;
double y;
};
std::vector<MyStruct> vec;
vec.emplace_back(10, 3.14);
<9>.使用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};
<10>.使用memcpy()
struct MyStruct {
int x;
double y;
};
MyStruct s9;
int tempX = 10;
double tempY = 3.14;
std::memcpy(&s9, &MyStruct{tempX, tempY}, sizeof(MyStruct));
<11>.使用无名称的临时结构体对象实例代码 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;
}
<11>.使用无名称的临时结构体对象实例代码 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;
}