博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++构造函数与初始化列表
阅读量:5757 次
发布时间:2019-06-18

本文共 745 字,大约阅读时间需要 2 分钟。

        C++引入构造函数的目的在于对变量的初始化做出强制,因为人们发现,程序的错误,很大程度上来说,都是由变量没有初始化造成的。

        因此,一种很好的编程习惯就是,在定义变量的时候直接初始化。而在C++中,在变量定义时,系统会自动调用变量的构造函数对变量进行初始化。只要将相应的初始化代码放在构造函数中,就能够保证该类在实例化对象的时候能够给对象赋以理想的初值。

        而事实远远没有这么简单。

        实际上,程序在进入构造函数的大括号体时,就已经完成了变量的定义(也就是分配内存空间)。这就难免会造成这样的一种情况:在对象被构造时,程序进入构造函数大括号体之前,首先调用对象的default构造函数,然后进入构造函数体内,重新对变量进行赋值。这无疑降低了程序的效率。

        还有更糟糕的情况。

        如果一个对象必须经由一个非default构造函数进行定义才能够在将来被正常地赋值,而系统默认地调用了它的default构造函数,就会出现很大的错误。

        因此,C++的设计者引入了构造函数初始化列表的概念。也就是说,在构造函数的初始化列表之中进行的是对变量的定义与初始化(分配内存空间),而不是简单的赋值。这样就能够解决上述的效率以及对构造函数的选择的问题。

        这一点在MFC中体现得尤为明显。继承的类一般会在初始化列表中调用能够其父类的构造函数。

        应为在初始化列表中发生的是成员变量的定义,也就是分配空间,因此初始化列表中构造的顺序与实际编译器定义变量的顺序可能是不一致的,也就是说,编译器不会按照设计者在初始化列表中初始化变量的顺序来为变量分配内存空间。初始化列表中变量的初始化顺序时其在类体内定义的顺序。

        同样得,因为const型成员变量只能在被定义的同时被初始化而不能够再次被赋值,它也只能被放在构造函数的初始化列表中。

转载地址:http://qdvkx.baihongyu.com/

你可能感兴趣的文章
tomcat 安装
查看>>
我的友情链接
查看>>
Centos6.6安装选包及基础场景说明
查看>>
java基础面试题-1
查看>>
深克隆与序列化效率的比较
查看>>
lamp+nginx代理+discuz+wordpress+phpmyadmin搭建一
查看>>
nagios监控使用139邮箱报警
查看>>
Windows Phone 7 中各种Task解说(启动器与选择器)
查看>>
罗森伯格助力2011年中国智能建筑技术发展应用论坛哈尔滨站
查看>>
网络割接
查看>>
windows server 2016 活动目录(二)
查看>>
openstack G版 修改vm的flavor级别
查看>>
python_控制台输出带颜色的文字方法
查看>>
java泛型中特殊符号的含义
查看>>
一秒 解决 ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql 问题
查看>>
Android组件化最佳实践 ARetrofit原理
查看>>
舍弃浮躁, 50条重要的C++学习建议
查看>>
同步手绘板——将View的内容映射成Bitmap转图片导出
查看>>
【Android游戏开发之十】(优化处理)详细剖析Android Traceview 效率检视工具!分析程序运行速度!并讲解两种创建SDcard方式!...
查看>>
微信小程序之wx.navigateback往回携带参数
查看>>