C++ 结构体初始化与赋值详解

 更新时间:2021年11月10日 11:18:30   作者:恋喵大鲤鱼  
本文主要介绍了C++ 结构体初始化与赋值详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

1.结构体初始化

结构体是常用的自定义构造类型,是一种很常见的数据打包方法。结构体对象的初始化有多种方式,分为顺序初始化、指定初始化、构造函数初始化。假如有如下结构体。

struct A {
 int b;
 int c;
};

(1)顺序初始化因为书写起来较为简约,是我们最常用的初始化方式,但相对于指定初始化,无法变更数据成员初始化顺序,灵活性较差,而且表现形式不直观,不能一眼看出 struct 各个数据成员的值。

A a = {1, 2};

(2)指定初始化(Designated Initializer)实现上有两种方式,一种是通过点号加赋值符号实现,即“.fieldname=value”,另外一种是通过冒号实现,即“fieldname:value”,其中 fieldname 为结构体成员名称 。前者是 C99 标准引入的初始化方式,后者是 GCC 的扩展。遗憾的是有些编译器并不支持指定初始化,比如 Visual C++。

// 点号+赋值符号
A a = {.b = 1, .c = 2};

//冒号
A a = {b:1, c:2};

Linux 内核喜欢用 .fieldname=value 的方式进行初始化,使用指定初始化,一个明显的优点是成员初始化顺序和个数可变,并且扩展性好,比如在结构体非末尾处增加字段时,避免了传统顺序初始化带来的大量修改。

(3)构造函数初始化常见于 C++ 代码中,因为 C++ 中的 struct 可以看作 class,结构体也可以拥有构造函数,所以我们可以通过结构体的构造函数来初始化结构体对象。给定带有构造函数的结构体:

struct A {
 A(int b,int c) {
  this->b=b;
  this->c=c;
 };
 int b;
 int c;
}

那么结构体对象的初始化可以像类对象初始化那样:

A a(1,2);

注意: struct 如果定义了构造函数的话,就不能用大括号进行初始化了,即不能再使用指定初始化与顺序初始化了。

2.结构体赋值

变量的赋值和初始化是不一样的,初始化是在变量定义的时候完成的,是属于变量定义的一部分,赋值是在变量定义完成之后想改变变量值的时候所采取的操作。还是给定结构体 A:

struct A {
 int b;
 int c;
};

注意: 结构体变量的赋值是不能采用大括号的方式进行赋值的,例如下面的赋值是不允许的。

A a;
a={1,2}; // 错误赋值

下面列出常见结构体变量赋值的方法。

(1)使用 memset 对结构体变量进行置空操作:

// 按照编译器默认的方式进行初始化(如果 a 是全局静态存储区的变量,默认初始化为0,如果是栈上的局部变量,默认初始化为随机值)
A a; 
memset(&a,0,sizeof(a));

(2)依次给每一个结构体成员变量进行赋值:

A a; 
a.b=1;
a.c=2;

(3)使用已有的结构体变量给另一个结构体变量赋值。也就是说结构体变量之间是可以相互赋值的。

A a = {1,2};
struct A a1;
a1=a;     // 将已有的结构体变量赋给a1

初始化与赋值有着本质的区别,初始化是变量定义时的第一次赋值,赋值则是定义之后的值的变更操作,概念上不同,所以实现上也不一样。

参考文献

2016腾讯春季校园实习招聘技术岗初试(一面)问题汇总(CC++后台)
结构体初始化
C结构体-designated initializer
C语言结构体声明中冒号的使用(占位符) & C结构体的乱序初始化

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

相关文章

  • 基于C++实现去除字符串头尾指定字符功能

    基于C++实现去除字符串头尾指定字符功能

    编程时我们经常需要对字符串进行操作,其中有一项操作就是去除字符串的头(尾)指定的字符,比如空格。本文为大家详细介绍了如何利用C++实现这一效果,需要的可以参考一下
    2022-04-04
  • Qt数据库应用之实现数据分组导出

    Qt数据库应用之实现数据分组导出

    这篇文章主要为大家详细介绍了如何利用Qt实现数据库数据分组导出,文中的示例代码讲解详细,对我们学习或工作有一定参考价值,需要的可以了解一下
    2022-06-06
  • C++读取文本文件中的汉字乱码情况原因及解决

    C++读取文本文件中的汉字乱码情况原因及解决

    本文介绍简体中文Windows操作系统中,C++读取文本文件中的汉字乱码情况原因及解决,文中通过代码和图文给大家介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2024-01-01
  • 如何利用C++实现mysql数据库的连接池详解

    如何利用C++实现mysql数据库的连接池详解

    为了提高MySQL数据库的访问的瓶颈,除了在服务器端增设缓存服务器缓存常用的数据之外(如redis),还可以增加数据库连接池,来提高MySQL Server的访问效率,这篇文章主要给大家介绍了关于如何利用C++实现mysql数据库的连接池的相关资料,需要的朋友可以参考下
    2021-07-07
  • c++基础学习之如何区分引用和指针

    c++基础学习之如何区分引用和指针

    C语言中只有指针,C++加入了引用,能够起到跟指针类似的作用,下面这篇文章主要给大家介绍了关于c++基础学习之区分引用和指针的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-08-08
  • C++ AfxBeginThread的介绍/基本用法

    C++ AfxBeginThread的介绍/基本用法

    这篇文章主要简单介绍了C++ AfxBeginThread的基本用法,十分的细致,有需要的小伙伴可以参考下。
    2015-06-06
  • C语言关键字auto与register的深入理解

    C语言关键字auto与register的深入理解

    本篇文章是对c语言关键字auto与register的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言中 type *(0)的具体使用

    C语言中 type *(0)的具体使用

    表达式 type * (0) 在 C/C++ 编程中是一个常见的技巧,通常用于内核编程和一些系统编程场景中,本文主要介绍了C语言中 type *(0)的具体使用,感兴趣的可以了解一下
    2024-08-08
  • C语言实现贪吃蛇游戏(命令行)

    C语言实现贪吃蛇游戏(命令行)

    这篇文章主要为大家详细介绍了C语言命令行实现贪吃蛇游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • C语言中的内存泄露 怎样避免与检测

    C语言中的内存泄露 怎样避免与检测

    堆经常会出现两种类型的问题:1.释放或改写仍在使用的内存(称为:“内存损坏”)。2.未释放不再使用的内存(称为:“内存泄露”)。这是最难被调试发现的问题之一
    2013-09-09

最新评论