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

 更新时间:2024年04月03日 10:20:19   作者:Android系统攻城狮  
这篇文章主要为大家详细介绍了10种C++中结构体初始化的写法,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下

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

到此这篇关于C++结构体初始化的10种写法总结的文章就介绍到这了,更多相关C++结构体初始化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++全面精通类与对象

    C++全面精通类与对象

    类和对象是两种以计算机为载体的计算机语言的合称。对象是对客观事物的抽象,类是对对象的抽象。类是一种抽象的数据类型;变量就是可以变化的量,存储在内存中—个可以拥有在某个范围内的可变存储区域
    2022-05-05
  • C++设计模式之迭代器模式(Iterator)

    C++设计模式之迭代器模式(Iterator)

    这篇文章主要为大家详细介绍了C++设计模式之迭代器模式Iterator,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • C++中TinyXML读取xml文件用法详解

    C++中TinyXML读取xml文件用法详解

    本文主要介绍了C++中TinyXML读取xml文件用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • C语言文件操作详情(二)

    C语言文件操作详情(二)

    这篇文章主要介绍了C语言文件操作详情,文章基于上一篇文章的内容继续展开C语言文件操作的相关详情,需要的小伙伴可以参考一下
    2022-04-04
  • 你知道C语言中#和##表示的意义吗

    你知道C语言中#和##表示的意义吗

    如标题,这篇文章会讲解C语言中的#和##是啥意思。我相信,大部分朋友应该都没怎么用过,这两个玩意的使用条件也相当苛刻,快跟随小编一起来看看吧
    2023-04-04
  • C++实现LeetCode(159.最多有两个不同字符的最长子串)

    C++实现LeetCode(159.最多有两个不同字符的最长子串)

    这篇文章主要介绍了C++实现LeetCode(159.最多有两个不同字符的最长子串),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • c++ TCHAR转string导致中文缺失或乱码问题及解决

    c++ TCHAR转string导致中文缺失或乱码问题及解决

    这篇文章主要介绍了c++ TCHAR转string导致中文缺失或乱码问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • C++简单实现shared_ptr的代码

    C++简单实现shared_ptr的代码

    智能指针用于资源管理,为了保证资源的操作得到顺利的执行防止资源泄露,因此大多数实现都以noexcept在参数列表后声明为不抛出异常,这篇文章主要介绍了C++简单实现shared_ptr的代码,需要的朋友可以参考下
    2022-09-09
  • C语言文件读写操作介绍与简单示例

    C语言文件读写操作介绍与简单示例

    这篇文章主要给大家介绍了关于C语言文件读写操作的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 在VC中隐藏控制台程序窗口的实现代码

    在VC中隐藏控制台程序窗口的实现代码

    大家都知道,当编写一个win32 console application时,当运行此类程序的时候默认情况下会有一个类似dos窗口的console窗口,但是有的时候我们只想在程序中运行一段功能代码,不希望显示这个console窗口,让代码执行完毕之后程序自动退出
    2013-04-04

最新评论