C++结构体初始化的10种写法总结

来自:网络
时间:2024-06-09
阅读:

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;
}

返回顶部
顶部