C++之结构体初始化10种写法总结(二百六十六)

2024-04-03 10:04

本文主要是介绍C++之结构体初始化10种写法总结(二百六十六),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

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

这篇关于C++之结构体初始化10种写法总结(二百六十六)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/872607

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

c++中std::placeholders的使用方法

《c++中std::placeholders的使用方法》std::placeholders是C++标准库中的一个工具,用于在函数对象绑定时创建占位符,本文就来详细的介绍一下,具有一定的参考价值,感兴... 目录1. 基本概念2. 使用场景3. 示例示例 1:部分参数绑定示例 2:参数重排序4. 注意事项5.

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

使用C++实现单链表的操作与实践

《使用C++实现单链表的操作与实践》在程序设计中,链表是一种常见的数据结构,特别是在动态数据管理、频繁插入和删除元素的场景中,链表相比于数组,具有更高的灵活性和高效性,尤其是在需要频繁修改数据结构的应... 目录一、单链表的基本概念二、单链表类的设计1. 节点的定义2. 链表的类定义三、单链表的操作实现四、