我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++初始化列表的方法有哪些

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++初始化列表的方法有哪些

本篇内容介绍了“C++初始化列表的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、类的初始化表

首先是类中使用构造函数时的初始化表,其一般书写格式为:

class Test {    int x;    int y;    Test(int _x)         :x(_x),y(0)    {    }};

即:在构造函数小括号与大括号之间,添加一个符号 :,然后在其后依次写出要初始化的成员变量名称,其名称后面有一个(),该小括号中的值就是将要赋值给成员变量的值

但实际上面这个效果与下面这段代码的效果是完全一样的:

Test(int _x) {    x = _x;    y = 0;}

但既然存在,那必然会有它的道理,不然也不可能会通过C++标准委员会的审核

所以下面我们再来看看这个例子:

class Test1 {public:Test1(){cout << "Test1的默认构造函数" << endl;}Test1(const Test1& t) {cout << "Test1的拷贝构造函数" << endl;}const Test1& operator=(const Test1& t) {cout <<"Test1的赋值构造函数" << endl;return *this;}};class Test {Test1 m_t1;public:Test(Test1 _t1)//:t1(_t1){m_t1 = _t1;}};int main() {Test1 t1;Test t(t1);}

代码略微有点长,但并不复杂:

声明一个Test1类,并写好它的三个构造函数,用于测试调用这三个函数的情况

声明一个Test类,用于测试当将一个Test1类作为成员变量,在给其赋值时发生的情况

在main函数中,首先实例化一个Test1类的对象t1,然后传递给Test类的构造函数中来实例化一个Test对象

首先是正常赋值情况下,其输出为:

Test1的默认构造函数
Test1的拷贝构造函数
Test1的默认构造函数
Test1的赋值构造函数

下面分析一下其输出的原因:

实例化t1对象时调用其默认构造函数输出

见t1传入构造函数时,会将t1拷贝给_t1,所以调用了拷贝构造函数

默认会实例化成员变量m_t1,所以会调用其构造函数

最后将_t1赋值给m_t1,调用了赋值构造函数

而如果将test的构造函数改一下,采用初始化表:

    Test(Test1 _t1)        :t1(_t1)    {        //t1 = _t1;    }

那么就会输出以下内容:

Test1的默认构造函数
Test1的拷贝构造函数
Test1的拷贝构造函数

前两行输出是和前面一样的,而第三行输出,则代替前面第三和第四行的输出

即:通过调用拷贝构造函数一次,来代替原本需要先默认构造,然后再赋值构造两大步骤

这就是有初始化列表这一特性的原因,通过减少构造,达到提高性能的作用

事实上,上面的代码还可以优化为:

    Test(Test1& _t1)        :t1(_t1)    {    }

这样便去掉了第二行的输出,通过引用而减少了一次拷贝构造:

Test1的默认构造函数
Test1的拷贝构造函数

也就是说,对于类来说,一般我们使用初始化表会提高性能,而对于基本数据类型,其实没有什么提升

当初始化列表的好处也不仅仅于此,它的出现可以让我们初始化成员变量更加方便!

所以总的来说,能用初始化表就尽量用,基本没坏处。

二、initializer_list

紧接着便是C++11出现的initializer_list,这同样是个好东西

首先我们还是来看看其主要用途

比如以往如果我们想要初始化一个vector,那么就必须这样写:

    vector<int> v;    v.push_back(1);    v.push_back(1);    v.push_back(1);    v.push_back(1);    v.push_back(1);    v.push_back(1);    v.push_back(1);

这难免有点难看,但有了initializer_list之后,我们就可以直接写为:

vector<int> v{1,1,1,1,1,1,1,1};

是不是方便多了!

注意我这里说的仅仅是方便,因为使用它并不会带来任何性能的提升,甚至会有些性能损失,它的出现就是为了方便我们程序员写代码的

其本质来说它就是一个模板,在标准库源文件中定义如下:

template <class _Elem>class initializer_list

从这里可以看出来,它只有一个参数类型,所以你不能在一个初始化列表中放入不同的类型数据,比如:

vector<int> v{1 , 2.3 };

由于这里vector已经指定了类型为int,所以一旦使用小数就会报错

当然,其使用范围并不仅仅只是标准库,对于基本数据也是支持的:

    int a{ 10 };     int b={ 10 };

上面两种写法都可以

如果我们想要给自己的类或函数添加一个初始化列表赋值怎么做呢?方法也很简单:

void test(initializer_list<int> ls) {    for (auto i = ls.begin(); i != ls.end(); i++) {        cout << *i << endl;    }}int main() {    test({1,2,3,4,5,5,6,7,8,9,10});}

即:通过迭代器遍历即可

“C++初始化列表的方法有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++初始化列表的方法有哪些

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

下载Word文档

猜你喜欢

C++初始化列表的方法有哪些

本篇内容介绍了“C++初始化列表的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、类的初始化表首先是类中使用构造函数时的初始化表
2023-07-05

vue初始化data方法有哪些

vue初始化data方法有两种:1、object方式,语法“var data = { 键值对 }”;2、function方式,语法“data: function () {return { 键值对 }}”。需要注意组件和extend中的data初始化不能是Object,否则会报错。组件中data用function方式是为了防止多个组件实例对象之间共用一个data,产生数据污染。
2023-05-14

WinXP注册表如何初始化有哪些方法

在我们平常安装软件的过程中,有很多软件的注册表会进驻系统,即使卸载了软件也会一直留在其中。而注册表是系统的敏感区,让很多朋友编程客栈都不怎么敢碰它,怕一清理注册表就把WinXP系统弄崩溃了。想要初始化WinXP注册表,重启是没有用的,需要使
2023-06-10

jquery页面初始化的方法有哪些

在jQuery中,可以使用以下方法来初始化页面:1. $(document).ready(function(){}):这是最常用的页面初始化方法。它会在整个文档加载完成后执行函数内的代码。2. $(window).on("load", fu
2023-08-09

java对象初始化的方法有哪些

Java对象初始化的方法有以下几种:构造方法:对象创建时自动调用的方法,用于初始化对象的成员变量和执行其他必要的操作。实例初始化块:在类中定义的非静态代码块,用于对对象进行初始化操作,每次创建对象时都会执行。静态初始化块:在类中定义的静
java对象初始化的方法有哪些
2024-02-29

jquery初始化函数的方法有哪些

在 jQuery 中,有以下几种方法可以用来初始化函数:1. $(document).ready(function(){...}):这是最常见的初始化函数方法。它会在整个 HTML 文档加载完毕后执行函数内的代码。2. $(function
2023-08-09

ArrayList实现初始化的方法有哪些

本篇文章给大家分享的是有关ArrayList实现初始化的方法有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。对于ArrayList的初始化有三种方式:对于第一种默认的构造方
2023-05-31

c++构造函数初始化列表的方法是什么

在C++中,构造函数初始化列表是一种在构造函数中初始化成员变量的方法。它使得在对象创建时直接初始化成员变量,而不是在构造函数体中进行赋值操作。构造函数初始化列表使用冒号(:)跟随在构造函数参数列表后面,并列出需要初始化的成员变量及其初始值。
c++构造函数初始化列表的方法是什么
2024-03-12

php数组初始化方法有哪些

今天小编给大家分享一下php数组初始化方法有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。3种方法:1、利用“[]”单独
2023-06-30

C++11列表初始化是怎样的

这篇文章主要介绍“C++11列表初始化是怎样的”,在日常操作中,相信很多人在C++11列表初始化是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++11列表初始化是怎样的”的疑惑有所帮助!接下来,请跟
2023-06-19

C语言数组初始化的方式有哪些

C语言数组的初始化方式有以下几种:1. 使用花括号{}初始化:可以使用花括号{}将一组初始值按顺序赋给数组元素。例如:int arr[5] = {1, 2, 3, 4, 5};2. 使用指定位置初始化:可以使用数组下标指定位置来初始化数组元
2023-09-04

java中Map和List初始化的方法有哪些

这篇文章主要介绍了java中Map和List初始化的方法有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java中Map和List初始化的方法有哪些文章都会有所收获,下面我们一起来看看吧。Map和List初
2023-07-05

c++基础语法:构造函数初始化列表

构造函数需要初始化的数据成员,不论是否显示的出现在构造函数的成员初始化列表中,都会在该处完成初始化,并且初始化的顺序和其在声明时的顺序是一致的,与列表的先后顺序无关
2022-11-15

C#基类的初始化方法

今天小编给大家分享一下C#基类的初始化方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。基类的初始化派生类继承了基类的成员变
2023-06-17

java数组初始化的方式有哪些

Java数组可以通过以下几种方式进行初始化:1. 静态初始化:在声明数组的同时为数组元素赋初值。```javaint[] arr = {1, 2, 3, 4, 5};```2. 动态初始化:先声明数组,然后再为数组元素赋值。```javai
2023-09-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录