初始化列表的使用

这篇具有很好参考价值的文章主要介绍了初始化列表的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题

类中是否可以定义 const 成员?

可以的

下面的类定义是否合法?

如果合法,ci 的值是什么,存储在哪里?

初始化列表的使用

上面的 Test 类定义是合法的,但是要定义 Test 类对象的时候,编译器会报错,提示 const 成员变量 ci 没初始化

类中的 const 成员

#include <stdio.h>

class Test
{
private:
    const int ci;
public:
    Test()
    {
        ci = 10;
    }
    int getCI()
    {
        return ci;
    }
};


int main()
{
    Test t;

    printf("t.ci = %d\n", t.getCI());

    return 0;
}

我们对上面的代码进行编译,编译直接报错

初始化列表的使用

编译器告诉我们 const 成员变量 ci 还没进行初始化,并且不允许在构造函数的函数体里对 const 成员变量赋值 

C++ 中提供了初始化列表对成员变量进行初始化

语法规则

初始化列表的使用

注意事项

成员的初始化顺序与成员的声明顺序相同

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

初始化列表先于构造函数的函数体执行

初始化列表的使用

#include <stdio.h>

class Value
{
private:
    int mi;
public:
    Value(int i)
    {
        printf("i = %d\n", i);
        mi = i;
    }
    int getI()
    {
        return mi;
    }
};

class Test
{
private:
    Value m2;
    Value m3;
    Value m1;
public:
    Test() : m1(1), m2(2), m3(3)
    {
        printf("Test::Test()\n");
    }
};


int main()
{
    Test t;
    
    return 0;
}

程序运行结果如下图所示:

初始化列表的使用

Test 类中有 3 个 Value 类对象,分别是 m2 m3 m1,我们在 Test 无参构造函数中使用初始化列表对这三个类对象进行初始化,我们在初始化列表中指定的顺序是 m1 m2 m3

初始化和赋值不同,类中构造函数的初始化列表是在对象还在创建的时候,对对象进行初始化,而执行到构造函数的函数体时,对象已经被创建出来了,这个时候去操作对象,是赋值操作而不是初始化

由于 Value 类没有提供无参构造函数,所以,Test 类里的 Value 类对象必须在初始化列表中指定使用有参构造函数,否则就会去使用 Value 类的无参构造函数,编译会报错

 通过打印可以看出,这 3 个 Value 类对象的构造顺序分别是 m2 m3 m1,和类对象的声明顺序相同,与初始化列表指定的顺序无关,并且构造函数的初始化列表执行完后,才会执行构造函数的函数体

类中的 const 成员

类中的 const 成员会被分配空间的

类中的 const 成员的本质是只读变量

类中的 const 成员只能在初始化列表中指定初始值

编译器无法直接得到 const 成员的初始值,因此无法进入符号表成为真正意义上的常量

只读成员变量

#include <stdio.h>

class Value
{
private:
    int mi;
public:
    Value(int i)
    {
        printf("i = %d\n", i);
        mi = i;
    }
    int getI()
    {
        return mi;
    }
};

class Test
{
private:
    const int ci;
    Value m2;
    Value m3;
    Value m1;
public:
    Test() : m1(1), m2(2), m3(3), ci(100)
    {
        printf("Test::Test()\n");
    }
    int getCI()
    {
        return ci;
    }
    int setCI(int v)
    {
        int* p = const_cast<int*>(&ci);
        
        *p = v;
    }
};


int main()
{
    Test t;
    
    printf("t.ci = %d\n", t.getCI());
    
    t.setCI(10);
    
    printf("t.ci = %d\n", t.getCI());
    
    return 0;
}

程序运行结果如下图所示:

初始化列表的使用

Test 类中存在 const 成员变量 ci,我们只能通过初始化列表对这个 const 成员变量进行初始化,在 setCI 函数中我们通过指针间接改变 ci 的值

通过打印可以看出 const 成员变量 ci 的值被改变了,说明了 C++ 中 const 成员变量只是只读变量,并不是常量 

初始化与赋值不同

初始化:对正在创建的对象进行初值设置

赋值:对已经存在的对象进行值设置

小结

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

初始化列表先于构造函数体执行

类中可以定义 const 成员变量

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

const 成员变量为只读变量文章来源地址https://www.toymoban.com/news/detail-493430.html

到了这里,关于初始化列表的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ | 谈谈构造函数的初始化列表

    我们知道,对于下面这个类A的成员变量 _a1 和 _a2 属于【声明】,还没有在内存中为其开辟出一块空间以供存放,真正开出空间则是在【定义】的时候,那何时定义呢?也就是使用这个类A去实例化出对象的时候 这个对象的空间被开出来了,难道里面的成员变量就一定开出空间

    2023年04月11日
    浏览(99)
  • 【C++奇遇记】构造函数 | 初始化列表

    🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集 数据库专栏 初阶数据结构 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长,值得我们全力奔赴更美好的生活✨ 🐤本篇文章将讲授C++的初始化列表相关的知识

    2024年02月12日
    浏览(56)
  • C++中包含初始化列表的构造函数

    构造函数对初始化成员变化很有用。另一种初始化成员的方式是使用初始化列表。对于程序中接受两个参数的构造函数,其包含初始化列表的变种类似于下面这样: 格式为: :成员变量1(参数1),成员变量2(参数2) 编译器会将初始化列表一一转换成代码,并将这些代码放

    2024年02月05日
    浏览(53)
  • C++:初始化列表,static成员,友元,内部类

    个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C++》 本篇博客作为C++:初始化列表,static成员,友元,内部类的知识总结。 初始化列表:以冒号开始,接着是一个以逗号分隔的数据成员列表,每个“成员变量”后面跟一个放在括号中的初始值或表达式。 初始化

    2024年02月07日
    浏览(55)
  • 【C++】构造函数和初始化列表的性能差距

    构造函数和初始化列表的性能差距对比测试 在C++类和对象中,你可能听到过更加推荐用初始化列表来初始化类内成员。如果类内成员是自定义类型,则只能在初始化列表中调用自定义类型的构造函数。 但初始化列表和在构造函数体内直接赋值有无性能差距呢?今天就用一份

    2024年02月11日
    浏览(43)
  • C++11 列表初始化&initializer_list

    C++11,是继C++98后的一次有力更新,引进了很多好用的语法,STL也添加了几个新容器,也解决了很多的问题。本篇博客就学习一下C++11 列表初始化 的新语法和 initializer_list 在C++类和对象中,类的构造函数有初始化列表,而我们今天要学习的是列表初始化,二者名字相近,但是

    2024年02月06日
    浏览(53)
  • 【C++11】:统一的列表初始化|声明|STL变化

    ​                                                 🎬慕斯主页 : 修仙—别有洞天                                               ♈️ 今日夜电波:マイノリティ脈絡—ずっと真夜中でいいのに。                                          

    2024年03月26日
    浏览(51)
  • 【C++】初始化列表构造函数VS普通构造函数

    初始化列表构造函数最优先匹配问题 对于一个类而言,只要其中包含有初始化列表的构造函数,编译器在编译使用{}语法的构造时会最倾向于调用初始化列表构造函数,哪怕做类型转换也在所不惜,哪怕有类型最佳匹配的普通构造函数或移动构造函数也会被劫持 编译器这种热

    2024年02月05日
    浏览(69)
  • C++——初始化列表 | explicit关键字 | static成员

    🌸作者简介: 花想云 ,在读本科生一枚,致力于 C/C++、Linux 学习。 🌸 本文收录于 C++系列 ,本专栏主要内容为 C++ 初阶、C++ 进阶、STL 详解等,专为大学生打造全套 C++ 学习教程,持续更新! 🌸 相关专栏推荐: C语言初阶系列 、 C语言进阶系列 、 数据结构与算法 本章我们

    2023年04月11日
    浏览(49)
  • 【C++基础(六)】类和对象(下)--初始化列表,友元,匿名对象

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C++初阶之路⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C++   🔝🔝 关于类和对象的大致内容已经结束 本篇文章主要是介绍一些冗杂的细节 虽然本节的内容属于对类和对象锦上添花 但在很多特定的场所下,还是

    2024年02月14日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包