0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++之初始化列表学习的总结

电子设计 来源:电子设计 作者:电子设计 2020-12-24 17:39 次阅读

大家好,本次给大家分享的内容是C++里面的初始化列表运用,希望对大家有帮助。

一、引出列表的使用:

1、在介绍列表之前,我们先来看看使用const关键字来修饰类中的成员会有什么事情发生,下面是一段简单代码:

#include <stdio.h>
class Test{
private:
const int a;
public
int getA()

return a;

};
int main()

return 0;

编译:

root@txp-virtual-machine:/home/txp/c++# g++ test.cpp
root@txp-virtual-machine:/home/txp/c++#

从编译结果来看,没毛病,完全和正常修饰一个成员一样;为了要显示这里的细节问题,我们来创建一个对象,进而调用类里面的方法来获取成员a的值:

#include <stdio.h>
class Test{
private:
const int a;
public:
int getA()

return a;

};
int main()

Test t;
printf("the t.a is %d",t.getA());
return 0;

编译:

root@txp-virtual-machine:/home/txp/c++# g++ test.cpp
test.cpp:3:7: error: uninitialized const member in ‘class Test’
test.cpp:5:16: note: ‘const int Test::a’ should be initialized
const int a;

通过编译我们发现他报了一个错误,说成员a没有进行初始化;那么没有初始化,我们就给成员a一个值来进行初始化:

#include <stdio.h>
class Test{
private:
const int a;
public:
Test()

a=666;

int getA()

return a;

};
int main()

Test t;
printf("the t.a is %d",t.getA());
return 0;

我们是用了无参构造函数对a进行初始化(private里面的成员不能直接初始化,被保护住了,这个知识是基本常识哈),下面编译看看,会有啥现象发生:

root@txp-virtual-machine:/home/txp/c++# g++ test.cpp
test.cpp: In constructor ‘Test::Test()’:
test.cpp:7:6: error: uninitialized const member in ‘const int’ [-fpermissive]
Test()
^~~~
test.cpp:5:16: note: ‘const int Test::a’ should be initialized
const int a;

test.cpp:9:11: error: assignment of read-only member ‘Test::a’
a=666;

和没有const关键字修饰的成员还不一样,上面说a还是要初始化,也就是我们在构造函数体里面对a进行进行初始赋值是行不通的哦,那该如何解决解决这个问题呢?答案来了,就是我们的初始化列表。

二、初始化列表“闪亮登场”:

1、首先我们先来看一下初始haul列表的书写格式:

ClassName::ClassName:
m1(v1),m2(v1,v2),m3(v3)


从上面我们可以发现,初始化列表就是在构造函数名称后面且在构造函数体之间。同时这里我们也要注意初始化列表的使用原则:

(1)成员的初始化顺序与成员的声明顺序相同。

(2)成员的初始化顺序与初始化列表中的位置无关。

(3)初始化列表优先于构造函数的函数体执行。

我们接着上面那个初始的问题,现在我们使用初始化列表来看看啥情况:

#include <stdio.h>
class Test{
private:
const int a;
public:
Test():a(666)

// a=666;

int getA()

return a;

};
int main()

Test t;
printf("the t.a is %d",t.getA());
return 0;

编译:

root@txp-virtual-machine:/home/txp/c++# g++ test.cpp
root@txp-virtual-machine:/home/txp/c++# ls
a.out test.cpp
root@txp-virtual-machine:/home/txp/c++# ./a.out
the t.a is 666

问题被完美解决,是不是心里很开心哈。接下来我们继续举一个上面规则里面说的初始化顺序问题:

#include <stdio.h>
class Value{
private:
int b;
public:
Value(int c)

printf("the c is %d",c);
b=c;

int getB()

return b;

};
class Test{
private:
Value d1;
Value d2;
Value d3;
public:
Test():d2(2),d1(1),d3(3)

printf("TXP ");

};
int main()

Test t;
return 0;

编译:

root@txp-virtual-machine:/home/txp/c++# g++ test.cpp
root@txp-virtual-machine:/home/txp/c++# ./a.out
the c is 1
the c is 2
the c is 3
TXP

从上面的输出结果我们可以初始化的顺序与成员的声明顺序有关,同时他也先于构造函数体的执行。

三、类中的const成员:

现在我们来总结一下在类中使用const关键字来修饰类中的属性时,这时的属性有啥特征:

(1)类中的const成员会被分配空间的。

(2)类中的const成员的本质是只读变量。

(3)类中的const成员只能再初始化列表中指定初始值

(4)编译器无法直接得到const成员的初始值,因此无法进入到符号表成为真正意义上的常量(也就是说这里的只读变量,我们还是可以通过一定的手段来改变其值的大小。)

下面我们来看一个例子:

#include <stdio.h>
class Value{
private:
int b;
public:
Value(int c)

printf("the c is %d",c);
b=c;

int getB()

return b;

};
class Test{
private:
const int f;
Value d1;
Value d2;
Value d3;
public:
Test():d2(2),d1(1),d3(3),f(888)

printf("TXP");

int getF()

return f;

int setF(int i)

int *p = const_cast<int*>(&f);
*p = i;

};
int main()

Test t;
printf("the f is %d",t.getF());
t.setF(666);
printf("the f is %d",t.getF());

编译:

root@txp-virtual-machine:/home/txp/c++# g++ test.cpp
root@txp-virtual-machine:/home/txp/c++# ./a.out
the c is 1
the c is 2
the c is 3
TXP
the f is 888
the f is 666

通过上面的例子,我们的结论都得到了一一验证。

四、总结:

(1)类中可以使用初始化列表对成员进行初始化。

(2)初始化列表先于构造函数体执行。

(3)类中可以定义const成员变量。

(4)const成员变量必须在初始化列表中指定初值。

(5)const成员变量只为只读变量。

以上就是本次的学习分享。纯属个人学习c++的成长之旅。

审核编辑:符乾江
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 可编程逻辑
    +关注

    关注

    7

    文章

    514

    浏览量

    44071
  • C++
    C++
    +关注

    关注

    22

    文章

    2104

    浏览量

    73479
收藏 人收藏

    评论

    相关推荐

    基于旋转平移解耦框架的视觉惯性初始化方法

    精确和鲁棒的初始化对于视觉惯性里程计(VIO)至关重要,因为不良的初始化会严重降低姿态精度。
    的头像 发表于 11-01 10:16 189次阅读
    基于旋转平移解耦框架的视觉惯性<b class='flag-5'>初始化</b>方法

    TMS320C6000 McBSP初始化

    电子发烧友网站提供《TMS320C6000 McBSP初始化.pdf》资料免费下载
    发表于 10-26 10:10 0次下载
    TMS320<b class='flag-5'>C</b>6000 McBSP<b class='flag-5'>初始化</b>

    Keil中变量不被初始化方法

    有些时候在我们的应用过程中要求变量有连续性,或者现场保留,例如Bootloader跳转,某种原因的复位过程中我们有些关键变量不能被初始化,在不同的编译环境下有不同的设置,本文就这个操作做总结,分别
    的头像 发表于 08-30 11:47 519次阅读
    Keil中变量不被<b class='flag-5'>初始化</b>方法

    初始化IO口为外部中断线的时候,最先初始化的会被后初始化的覆盖掉为什么?

    初始化IO口为外部中断线的时候,比如GPIOA6与GPIOB6先后初始化为外部中断,最先初始化的会被后初始化的覆盖掉,不知道是为什么?
    发表于 05-14 08:26

    字符型、指针型等变量等该如何初始化

     对于数值类型的变量往往初始化为0,但对于其他类型的变量,如字符型、指针型等变量等该如何初始化呢?
    的头像 发表于 03-18 11:02 1250次阅读

    MCU单片机GPIO初始化该按什么顺序配置?为什么初始化时有电平跳变?

    GPIO初始化时有时钟配置、模式配置、输出配置、复用配置,那么在编写初始化代码时,到底该按什么顺序执行呢?如果顺序不当那初始化过程可能会出现短暂的电平跳变。
    的头像 发表于 02-22 11:07 1422次阅读
    MCU单片机GPIO<b class='flag-5'>初始化</b>该按什么顺序配置?为什么<b class='flag-5'>初始化</b>时有电平跳变?

    串口初始化一般是初始化哪些内容

    串口初始化是指在使用串口进行数据通信之前,对串口进行一系列的设置和配置,以确保串口能够正常工作。串口初始化的内容主要包括以下几个方面: 串口硬件设置:首先,需要确定要使用的串口是哪一个,通常计算机
    的头像 发表于 01-04 09:39 3045次阅读

    labview运行后如何初始化

    LabVIEW是一款强大的图形编程软件,在运行之前通常需要进行一些初始化操作。本文将详细介绍LabVIEW运行前的初始化过程,并提供了一些常用的初始化方法。 创建新项目: 在LabV
    的头像 发表于 12-28 17:24 2472次阅读

    自动初始化机制原理详解

    自动初始化机制是指初始化函数不需要被显式调用,只需要在函数定义处通过宏定义的方式进行申明,就会在系统启动过程中被执行。这篇文章就来探索一下其中的奥秘, 简单理解其原理!
    的头像 发表于 12-16 09:33 961次阅读
    自动<b class='flag-5'>初始化</b>机制原理详解

    C语言编程时,各种类型的变量该如何初始化

    C语言编程时,各种类型的变量该如何初始化? 在C语言中,每个变量都需要在使用之前进行初始化初始化是为变量分配内存空间并赋予
    的头像 发表于 12-07 13:53 1118次阅读

    secondary cpu初始化状态设置

    ,用于填写secondary cpu的入口地址。 uboot负责将这块内存的地址写入devicetree中,当内核初始化完成,需要启动secondary cpu时,就将其内核入口地址写到那块内存中
    的头像 发表于 12-05 15:27 1001次阅读
    secondary cpu<b class='flag-5'>初始化</b>状态设置

    在ubuntu20.04中如何初始化rosdep

    初始化rosdep 输入以下的命令,先对其初始化一下 sudo rosdep init 如果出现以下界面,那么恭喜你,你可以省下一些麻烦了,直接跳到第7步就行了: 如果出现了以下几种错误,也不要担心
    的头像 发表于 12-01 16:22 871次阅读
    在ubuntu20.04中如何<b class='flag-5'>初始化</b>rosdep

    C语言中的数组格式与初始化

    多少存储空间。 数组格式与初始化     格式:   元素类型 数组名[元素个数];        比如:   int[3];       数组元素有顺序之分,每个元素都有一个唯一的下标(索引),而且都是从0开始。     数组中第i个元素的访问方式:    a[i]       数组元
    的头像 发表于 11-26 16:12 748次阅读
    <b class='flag-5'>C</b>语言中的数组格式与<b class='flag-5'>初始化</b>

    实战经验 | Keil、IAR、CubeIDE 中变量不被初始化方法

    程中要求变量有连续性,或者现场保留,例如 Bootloader 跳转,某种原因的复位过程中我们有些关键变量不能被初始化,在不同的编译环境下有不同的设置,本文就这个操作做总结,分别介绍使用 Keil
    的头像 发表于 11-24 18:05 3890次阅读

    MSP430F5529硬件IIC驱动OLED(初始化使用的寄存器)

    MSP430F5529硬件IIC驱动OLED(初始化使用的寄存器)
    发表于 11-24 16:36 1次下载