C++构造函数初始化列表与构造函数中的赋值的区别

转载

C++构造函数初始化列表与构造函数中的赋值的区别

C++类中成员变量的初始化有两种方式:

         构造函数初始化列表和构造函数体内赋值下面看看两种方式有何不同。

         成员变量初始化的顺序是按照在那种定义的顺序。

1、内部数据类型(char,int……指针等)


    
    
    
    
  1. class Animal
  2. {
  3. public:
  4. Animal( int weight, int height): //A初始化列表
  5. m_weight(weight),
  6. m_height(height)
  7. {
  8. }
  9. Animal( int weight, int height) //B函数体内初始化
  10. {
  11. m_weight = weight;
  12. m_height = height;
  13. }
  14. private:
  15. int m_weight;
  16. int m_height;
  17. };

对于这些内部类型来说,基本上是没有区别的,效率上也不存在多大差异。

当然A和B方式不能共存的。

 

2、无默认构造函数的继承关系中


   
   
   
   
  1. class Animal
  2. {
  3. public:
  4. Animal( int weight, int height): //没有提供无参的构造函数
  5. m_weight(weight),
  6. m_height(height)
  7. {
  8. }
  9. private:
  10. int m_weight;
  11. int m_height;
  12. };
  13. class Dog: public Animal
  14. {
  15. public:
  16. Dog( int weight, int height, int type) //error 构造函数 父类Animal无合适构造函数
  17. {
  18. }
  19. private:
  20. int m_type;
  21. };

上面的子类和父类编译会出错:


因为子类Dog初始化之前要进行父类Animal的初始化,但是根据Dog的构造函数,没有给父类传递参数,使用了父类Animal的无参数构造函数。而父类Animal提供了有参数的构造函数,这样编译器就不会给父类Animal提供一个默认的无参数的构造函数了,所以编译时报错,说找不到合适的默认构造函数可用。要么提供一个无参数的构造函数,要么在子类的Dog的初始化列表中给父类Animal传递初始化参数,如下:


    
    
    
    
  1. class Dog: public Animal
  2. {
  3. public:
  4. Dog( int weight, int height, int type):
  5. Animal(weight,height) //必须使用初始化列表增加对父类的初始化
  6. {
  7. ;
  8. }
  9. private:
  10. int m_type;
  11. };
 

3、类中const常量,必须在初始化列表中初始,不能使用赋值的方式初始化


   
   
   
   
  1. class Dog: public Animal
  2. {
  3. public:
  4. Dog( int weight, int height, int type):
  5. Animal(weight,height),
  6. LEGS( 4) //必须在初始化列表中初始化
  7. {
  8. //LEGS = 4; //error
  9. }
  10. private:
  11. int m_type;
  12. const int LEGS;
  13. };

4、包含有自定义数据类型(类)对象的成员初始化        


   
   
   
   
  1. class Food
  2. {
  3. public:
  4. Food( int type = 10)
  5. {
  6. m_type = 10;
  7. }
  8. Food(Food &other) //拷贝构造函数
  9. {
  10. m_type = other.m_type;
  11. }
  12. Food & operator =(Food &other) //重载赋值=函数
  13. {
  14. m_type = other.m_type;
  15. return * this;
  16. }
  17. private:
  18. int m_type;
  19. };
  20. 1)构造函数赋值方式 初始化成员对象m_food
  21. class Dog: public Animal
  22. {
  23. public:
  24. Dog(Food &food)
  25. //:m_food(food)
  26. {
  27. m_food = food; //初始化 成员对象
  28. }
  29. private:
  30. Food m_food;
  31. };
  32. //使用
  33. Food fd;
  34. Dog dog(fd); //
  35. Dog dog(fd);结果:
  36. 先执行了 对象类型构造函数Food( int type = 10)——>
  37. 然后在执行 对象类型构造函数Food & operator =(Food &other)
  38. 想象是为什么?
  39. 2)构造函数初始化列表方式
  40. class Dog: public Animal
  41. {
  42. public:
  43. Dog(Food &food)
  44. :m_food(food) //初始化 成员对象
  45. {
  46. //m_food = food;
  47. }
  48. private:
  49. Food m_food;
  50. };
  51. //使用
  52. Food fd;
  53. Dog dog(fd); //
  54. Dog dog(fd);结果:执行Food(Food &other)拷贝构造函数完成初始化

不同的初始化方式得到不同的结果:

      明显构造函数初始化列表的方式得到更高的效率。

文章最后发布于: 2016-12-10 15:16:51
        
                
0 个人打赏
发表评论
还能输入1000个字符
  • 上一页
  • 1
  • 下一页

构造函数初始化列表

08-01 阅读数 3623

0.初始化与赋值的区别意义上:1)初始化:一个变量或者一个对象在产生的时候就赋予一个值,属于伴随性质2)赋值:在一个变量或者一个对象在产生之后的任意时刻赋予一个值,属于任意性质宏观代码上:1)两者作用... 博文 来自: renwu

C++类初始化列表构造函数赋值区别

07-07 阅读数 247

最近面试过程中,面试问了类构造初始化列表和构造函数内赋值有什么区别。当时没完全回答清楚,后来google了一下,发现两者有如此大的不同,现总结如下。构造初始化列表中,是直接调用相应的构造函数进行对象初... 博文 来自: xiejianjun417的专栏

c++ 构造函数初始化列表

08-09 阅读数 864

《C++Primer》中提到在以下三种情况下需要使用构造函数初始化列表:  1.需要初始化的类的成员变量是对象的情况;   2.需要初始化的类的成员变量由const修饰的或初始化的类的引用成员变量; ... 博文 来自: 洪流之源

面试官,不要再问我三次握手和四次挥手

10-08 阅读数 10万+

三次握手和四次挥手是各个公司常见的考点,也具有一定的水平区分度,也被一些面试官作为热身题。很多小伙伴说这个问题刚开始回答的挺好,但是后面越回答越冒冷汗,最后就歇菜了。 见过比较典型的面试场景是这样的:... 博文

德国 IT 薪酬大揭秘!

10-06 阅读数 4151

作者 |德国IT那些事责编 | 伍杏玲“所有脱离工龄、级别、职位、经验、城市以及裙带关系来谈论工资,都是耍流氓!”——佛洛依德一般来说IT行业公司,资历是按等级划分的...... 博文

【安全】Web渗透测试(全流程)

10-29 阅读数 761

1 信息收集

1.1域名、IP、端口

域名信息查询:信息可用于后续渗透

IP信息查询:确认域名对应IP,确认IP是否真实,确认通信是否正常

端口信息查询:NMap扫描,确认开放端口
如果不…


博文



500行代码,教你用python写个微信飞机大战

10-16 阅读数 3万+

这几天在重温微信小游戏的飞机大战,玩着玩着就在思考人生了,这飞机大战怎么就可以做的那么好,操作简单,简单上手。

帮助蹲厕族、YP族、饭圈女孩在无聊之余可以有一样东西让他们振作起来!让他们的左手 / …


博文



别在学习框架了,那些让你起飞的计算机基础知识。

10-22 阅读数 3万+

我之前里的文章,写的大部分都是与计算机基础知识相关的,这些基础知识,就像我们的内功,如果在未来想要走的更远,这些内功是必须要修炼的。框架千变万化,而这些通用的底层知识,却是几乎不变的,了解了这些知识,... 博文

Docker技术( 容器虚拟化技术 )

10-21 阅读数 1万+

Docker虚拟化容器技术 第一章 Docker简介诞生背景Docker 介绍虚拟机技术容器虚拟化技术官方网址第二章 Docker安装前提条件安装DockerDocker底层原理Docker... 博文

MySQL数据库—SQL汇总

10-24 阅读数 2369

一、准备 下文整理常见SQL语句的用法,使用MySQL5.7测试,参考了尚硅谷MySQL教程及用例。用例sql: 链接: https://pan.baidu.com/s/1tb3-12MRNFjV8d... 博文

五款高效率黑科技神器工具,炸裂好用,省时间

10-20 阅读数 1万+

loonggg读完需要4分钟速读仅需2分钟感觉我好久好久没有给大家分享高质量的软件和插件了。今天周末,难得在家休息一下,痛下决心,分享一些我认为的高效率工具软件给大家。废...... 博文

不就是SELECT COUNT语句吗,竟然能被面试官虐的体无完肤

10-21 阅读数 1万+

数据库查询相信很多人都不陌生,所有经常有人调侃程序员就是CRUD专员,这所谓的CRUD指的就是数据库的增删改查。 在数据库的增删改查操作中,使用最频繁的就是查询操作。而在所有查询操作中,统计数量操作更... 博文

程序员必须掌握的核心算法有哪些?

10-21 阅读数 4万+

由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,... 博文

面试最后一问:你有什么问题想问我吗?

10-22 阅读数 2万+

尽管,我们之前分享了这么多关于面试的主题:

高薪必备的一些Spring Boot高级面试题
面试必问:设计模式遵循的面向对象设计原则!
面试必问:怎么保证缓存与数据库的双写一致性?
27道高频Spr…


博文



Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)

10-22 阅读数 9045

最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成) one 樱花树

动…


博文



还在收集资料?我这里有个github汇总

10-22 阅读数 1万+

原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。国内程序员都喜欢收集资料,但是又不看,github是重灾区。更有莫名其妙fork的,让人不得要...... 博文

程序员不懂浪漫?胡扯!

10-22 阅读数 9368

程序员男朋友你的程序员男朋友为你做过什么暖心的事情呢?我的男朋友是一个程序员,他有很多大家在网络上吐槽的程序员的缺点,比如加班很多,没空陪我吃饭逛街看电影,比如说他有的时...... 博文

程序员成长的四个简单技巧,你 get 了吗?

10-23 阅读数 1万+

最近拜读了“阿里工程师的自我修养”手册,12 位技术专家分享生涯感悟来帮助我们这些菜鸡更好的成长,度过中年危机,我收获颇多,其中有不少的方法技巧和我正在使用的,这让我觉得我做的这些事情是对的,我走在了... 博文

Java 8:一文掌握 Lambda 表达式

10-23 阅读数 8880

本文将介绍 Java 8 新增的 Lambda 表达式,包括 Lambda 表达式的常见用法以及方法引用的用法,并对 Lambda 表达式的原理进行分析,最后对 Lambda 表达式的优缺点进行一个总... 博文

Python中几个非常有趣的模块

10-24 阅读数 1万+

最近学习Python,发现了许多有趣的模块。感觉开启了新世界的大门,因为我也不是对所有模块都熟悉,所以今天不是讲代码。 1、ItChat 这是一个微信自动回复的模块,因为我微信一直无法登陆,所以也没有... 博文

2020年秋招后端面经

10-24 阅读数 2182

主要包含华为,网易互娱,广联达,科大讯飞,浦发,中兴,上海农商行这些已经拿offer的,还有京东(不小心把二面时间换了一下,等通知等三个月了),虾皮(一面挂),顺丰(sp专场一面之后没消息,秋招第一个... 博文

小白成长以及学习轨迹:我的四年大学,写给正在读大学的你

10-24 阅读数 6376

前阵子有些读者问我大学期间的学习路线,说他自己现在有点迷茫。说实话,对于学习路线这种文章,一抓一大堆,我也不大喜欢去建议别人究竟该怎么学习,学习顺序之类的。不过对于大学,很多人进入大学的时候,可能都是... 博文

Python自动化完成tb喵币任务

10-25 阅读数 7317

2019双十一,tb推出了新的活动,商店喵币,看了一下每天都有几个任务来领取喵币,从而升级店铺赚钱,然而我既想赚红包又不想干苦力,遂使用python来进行手机自动化操作,目测全网首发!

用到的库:



博文



十年磨一剑? Linux QQ 终于发布了新版本!

10-24 阅读数 1万+

前言 十年磨一剑!Linux QQ 终于发布了 2.0.0 Beta 版本。今天 腾讯QQ 悄然发布了 Linux QQ 测试版 。不过好歹终于能在 Linux 桌面使用正统的 QQ 了。下载地址在文... 博文

从月薪3K的中专生,到身家千万的CTO!人生最大的对手,就是自已

10-25 阅读数 8955

关注“技术领导力”博客,独家大厂干货推送

文/Daniel.W

David坐在我对面,窗外是梦境般的外滩夜景,繁星点点的璀璨灯火,散落在黄浦江两岸。我转过头对David说,你丫挺会享受啊,约我…


博文



JDK8 新特性:判空遍历写法

10-25 阅读数 5788

在工作中,经常会处理各种变量,但往往会在使用变量的时候,要进行空判断,不然要报错。

Java 8 提供了判空写法:

Optional.ofNullable(变量).orElse(默认值);

例…


博文



史上最强Tomcat8性能优化

10-25 阅读数 1万+

文章目录授人以鱼不如授人以渔目的服务器资源Tomcat配置优化Linux环境安装运行Tomcat8AJP连接执行器(线程池)3种运行模式部署测试用的web项目查看服务器信息部署web应用使用Apach... 博文

ARM:供给中国 160 亿颗芯片,继续授权华为!

10-25 阅读数 1万+

Arm中国执行董事长兼CEO吴雄昂

记者 | 胡巍巍

出品 | CSDN(ID:CSDNnews)

2019年5月15日,美国商务部将华为及其70家附属公司纳入实体清单。

当时,还有消息称,A…


博文



单点登录(SSO)

10-26 阅读数 4830

一、SSO(单点登录)介绍

SSO英文全称Single SignOn,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用…


博文



2019最新Java面试题,常见面试题及答案汇总

10-26 阅读数 5839

Java最新常见面试题 + 答案汇总 1、面试题模块汇总 面试题包括以下十九个模块:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Sprin... 博文

漫话:什么是 https ?这应该是全网把 https 讲的最好的一篇文章了

10-26 阅读数 7453

今天这篇文章,讲通过对话的形式,让你由浅入深着知道,为什么 Https 是安全的。

一、对称加密

一禅:在每次发送真实数据之前,服务器先生成一把密钥,然后先把密钥传输给客户端。之后服务器给客…


博文



HTML CSS整理笔记

10-26 阅读数 4832

常见字体单位: 1.em 移动端常用的字体尺寸单位,说白em就相当于“倍”,比如设置当前的div的字体大小为1.5em,则当前的div的字体大小为:当前div继承的字体大小*1.5。 但当div进行嵌... 博文

【Windows】Window中的常用快捷键

10-26 阅读数 2556

00. 目录 文章目录00. 目录01.电脑快捷键大全02.Ctrl快捷键03.Alt快捷键04.Shift快捷键05.常规键盘快捷键 01.电脑快捷键大全 单独按Windows:显示或隐藏 “开始”... 博文

应届生求职面试真的有那么难吗

10-27 阅读数 3266

前言 本周有幸参加了公司的校招(专场宣讲会),并作为一位技术面试官的角色出现在校园,让我回忆起了当年自己是如何参加校招、如何进行面试,当年的场景历历在目,感受颇多。在此,以校招应届生技术面试官的身份... 博文

经典算法(1):冒泡排序及其优化

10-27 阅读数 2819

冒泡排序 在平常的学习中用到了冒泡排序,这篇博客对冒泡排序算法进行了详细的代码实现,并且进行了两次彻底的优化,供大家一起参考学习。

冒泡排序是一种最基础的交换排序。冒泡排序就像水冒泡,小(大)的元…


博文



程序员必须掌握的十大经典算法

10-27 阅读数 1707

程序员必须要掌握的十大经典算法 算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种... 博文

C#贪吃蛇游戏(全代码)

10-27 阅读数 1024

C#贪吃蛇游戏Form方法100毫秒刷新秒刷新(蛇的移动速度由此决定)画蛇创建食物画食物吃掉食物生存还是毁灭游戏结束button点击事件链其他静态变量游戏主体类蛇食物 这是本人第一篇博客,感谢收看,之... 博文

            
                        

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

你可能感兴趣的:(C++相关)