广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++深入讲解初始化列表的用法
  • 149
分享到

C++深入讲解初始化列表的用法

2024-04-02 19:04:59 149人浏览 八月长安
摘要

目录一、小问题二、类成员的初始化三、类中的 const 成员四、初始化与赋值的不同五、小结一、小问题 下面的类定义是否合法? 如果合法,ci 的值是什么,存储在哪里? 下面编写代码

一、小问题

下面的类定义是否合法? 如果合法,ci 的值是什么,存储在哪里?

下面编写代码一探究竟(代码1):

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

可以看到,编译报错,ci 没有被初始化,如果要初始化,就得在 test() 那里进行,且看下节初始化列表。

二、类成员的初始化

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

语法规则

所以代码 1 可以写成:

#include <stdio.h>
 
class Test
{
private:
    const int ci;
public:
    Test() : ci(10)
    {
        //ci = 10;
    }
    int getCI() 
    { 
        return ci; 
    }
};
 
 
int main()
{
    Test t;
    
    printf("t.ci = %d\n", t.getCI());
    
    return 0;
}

这样编译就能通过,得到想要的结果:

注意事项

  • 成员的初始化顺序与成员的声明顺序相同
  • 成员的初始化顺序与初始化列表中的位置无关
  • 初始化列表先于构造函数的函数体执行

下面看一段初始化列表使用的代码:

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

输出结果如下: 

这段代码很好的将上面的注释事项体现出来了,初始化顺序是 m1,m2,m3,输出顺序确是 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;
}

下面为输出结果:

这段代码说明 const 不是真正意义上的常量,只是只读变量。 

四、初始化与赋值的不同

  • 初始化:对正在创建的对象进行初值设置
  • 赋:对已经存在的对象进行值设置

五、小结

  • 类中可以使用初始化列表对成员进行初始化
  • 初始化列表先于构造函数体执行
  • 类中可以定义 const 成员变量
  • const 成员变量必须在初始化列表中指定初值
  • const 成员变量为只读变量

到此这篇关于C++深入讲解初始化列表的用法的文章就介绍到这了,更多相关C++ 初始化列表内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++深入讲解初始化列表的用法

本文链接: https://www.lsjlt.com/news/146447.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++深入讲解初始化列表的用法
    目录一、小问题二、类成员的初始化三、类中的 const 成员四、初始化与赋值的不同五、小结一、小问题 下面的类定义是否合法 如果合法,ci 的值是什么,存储在哪里 下面编写代码一探...
    99+
    2022-11-13
  • C++示例讲解初始化列表方法
    目录定义特性初始化阶段计算阶段成员变量的初始化顺序定义 我们先来看一个例子 Date(int year, int month, int day)//带参构造函数 :_...
    99+
    2022-11-13
  • C++细讲深浅拷贝与初始化列表如何操作
    目录深浅拷贝区别代码解释特别注意内存图解释初始化列表语法具体实现总结深浅拷贝区别 上一节简单提了编译器会默认给我们提供值拷贝构造函数,结果是新的对象会拥有和传入对象一样的属性,由编译...
    99+
    2022-11-13
  • 解析之C++的列表初始化语法
    目录聚合初始化大括号省略(brace elision)std::initializer_list的另一个故事连《Effective Modern C++》都弄错了的规则构造函数的两步...
    99+
    2022-11-12
  • C++初始化列表的方法有哪些
    本篇内容介绍了“C++初始化列表的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、类的初始化表首先是类中使用构造函数时的初始化表...
    99+
    2023-07-05
  • C++学习之初始化列表详解
    目录前言一、类的初始化表二、initializer_list前言 本文主要介绍C++中地初始化列表 目前对初始化列表应该有两个方面的定义,一个是类的构造函数中使用的那个初始化表,另一...
    99+
    2023-03-19
    C++初始化列表 C++ 列表
  • C++初始化函数列表详细解析
    在以下三种情况下需要使用初始化成员列表: 一,需要初始化的数据成员是对象的情况; 二,需要初始化const修饰的类成员; 三,需要初始化引用成员数据; 原因:C++可以定义引用类型的...
    99+
    2022-11-15
    初始化函数列表
  • C++构造函数的初始化列表详解
    目录1.问题2.解决方法(初始化列表)3.顺序问题总结 1.问题 class A { private: int m_a; public: A(int a) { cout ...
    99+
    2022-11-12
  • C++11中初始化列表initializer lists的使用方法
    C++11引入了初始化列表来初始化变量和对象。自定义类型,如果想用初始化列表就要包含initializer_list头文件。 C++11将使用大括号的初始化(列表初始化)作为一种通用...
    99+
    2022-11-12
  • C++11列表初始化是怎样的
    这篇文章主要介绍“C++11列表初始化是怎样的”,在日常操作中,相信很多人在C++11列表初始化是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++11列表初始化是怎样的”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-19
  • C++类与对象深入之运算符重载与const及初始化列表详解
    目录一:运算符重载相等运算符重载赋值运算符重载小于运算符重载二:const成员const修饰类的成员函数三:cin、cout重载四:初始化列表构造函数赋初值初始化列表explicit...
    99+
    2022-11-13
  • c++基础语法:构造函数初始化列表
    C++为类中提供类成员的初始化列表 类对象的构造 顺序是这样的:1.分配内存,调用构造函数 时,隐式/显示的初始化各数据 成员2.进入构造函数后在构造函数中执行一般计算 使用初始化...
    99+
    2022-11-15
    构造函数 初始化列表
  • C++构造函数初始化列表的实现详解
    目录1.前言2.初始化列表3.注意事项1.前言 初始化就是给变量一个初始值。 初始化的目的是为了让变量有值,防止使用时出现异常。 在构造函数中,有一项重要功能就是对成员变量进行初始化...
    99+
    2022-11-13
  • 怎么使用c#构造函数初始化列表
    在C#中,可以使用构造函数初始化列表来初始化类的成员变量。构造函数初始化列表是在构造函数的参数列表后面使用冒号来定义的。下面是一个示...
    99+
    2023-09-28
    c#
  • C语言深入讲解链表的使用
    目录一、链表的概念二、链表的分类1. 单向或者双向链表2. 带头或者不带头(是否有自带哨兵位头结点)3. 循环或者非循环链表4. 无头单向非循环链表和带头双向循环链表3、链表的实现(...
    99+
    2022-11-13
  • C++之谈谈构造函数的初始化列表
    目录一、引入二、初始化的概念区分三、语法格式及使用四、注意事项【⭐】五、总结与提炼一、引入 我们知道,对于下面这个类A的成员变量_a1和_a2属于【声明】,还没有在内存中为其开辟出一...
    99+
    2023-05-15
    C++构造函数 C++构造函数初始化列表 C++初始化列表
  • C++11关联容器的列表怎么初始化
    本篇内容介绍了“C++11关联容器的列表怎么初始化”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是关联容器关联容器(associativ...
    99+
    2023-06-19
  • C++是怎么构造函数的初始化列表
    C++是怎么构造函数的初始化列表,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1.问题class A {private:int m_a;publi...
    99+
    2023-06-22
  • C++11新特性之列表初始化的具体使用
    目录统一的初始化方法列表初始化的一些使用细节初始化列表1、任何长度的初始化列表2、std::initialzer-list的使用细节列表初始化防止类型收窄在我们实际编程中,我们经常会...
    99+
    2022-11-13
  • C++11中列表初始化机制的概念与实例详解
    目录概述 实现机制详解 POD类型的列表初始化 含有构造函数的类的列表初始化(C++11) 列表初始化用于函数返回值 引入std::initializer_list 代码验证 应用 ...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作