欢迎来到天天文库
浏览记录
ID:37279384
大小:58.00 KB
页数:8页
时间:2019-05-20
《成员初始化顺序》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、C++有如下几条:1构造函数初始化列表的变量优先于构造函数(至少明显的写在前面) (若都在初始化列表中初始化,则按声明顺序初始化,与初始化列表中的顺序无关)2静态成员变量先于实例变量3父类成员变量先于子类成员变量4父类构造函数先于子类构造函数java和C#语言1 类成员变量初始化先于类的构造函数2 静态成员变量先于实例变量3 父类成员变量先于子类成员变量(C#相反)4 父类构造函数先于子类构造函数////////////////////////////////////////////////////////////////////
2、////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////认识成员初始化列表(转载) 一、 成员初始化列表的位置。 成员初始化列表的位置位于构造函数的函数体和参数表之间。
3、通过成员初始化表,类数据成员可以被显式初始化。成员初始化表是由逗号分隔的成员/名字实参对。例如下面的双参数构造函数的实现就使用了成员初始化表。_name是string型的成员类对象。1inline Account::Account( const char* name, double opening_bal )2 : _name( name ), _balance( opening_bal )34{ 5 _acct_nmbr = get_unique_acct_nmbr(); 6} 成员初
4、始化表跟在构造函数的原型后,由冒号开头。成员名是被指定的。后面是括在括号中的初始值,类似于函数调用的语法。如果成员是类对象则初始值变成被传递给适当的构造函数的实参。该构造函数然后被应用在成员类对象上。在我们的例子中,name被传递给应用在_name上的string构造函数。_balance用参数opening_bal初始化。 说明:在这种情况下,string的拷贝构造函数被调用。把成员类对象_name初始化成string参数name. 二、 使用初始化表和在构造函数内使用数据成员的赋值之间有什么区别? inlineAccount:
5、:Account(constchar*name,doubleopening_bal) :_name(name),_balance(opening_bal){ _acct_nmbr=get_unique_acct_nmbr(); }inlineAccount::Account(constchar*name,doubleopening_bal) { _name=name; _balance=opening_bal; _acct_nmbr=get_unique_acct_nm
6、br(); } 这两种实现有区别吗?两种实现的最终结果是一样的。在两个构造函数调用的结束处三个成员都含有相同的值。区别是成员初始化表只提供该类数据成员的初始化。在构造函数体内对数据成员设置值是一个赋值操作。我们可以认为构造函数的执行过程被分成两个阶段:隐式或显式初始化阶段以及一般的计算阶段。计算阶段由构造函数体内的所有语句构成,在计算阶段中数据成员的设置被认为是赋值而不是初始化。没有清楚地认识到这个区别是程序错误和低效的常见源泉.初始化阶段可以是显式的或隐式的取决于是否存在成员初始化表。隐式初始化阶段按照声明的顺序依次调用所有基类的缺省
7、构造函数然后是所有成员类对象的缺省构造函数。1 inline Account::Account()2 {3 _name = "";4 _balance = 0.0;5 _acct_nmbr = 0;6 } 则初始化阶段是隐式的。在构造函数体被执行之前先调用与_name相关联的缺省string构造函数。这意味着把空串赋给_name的赋值操作是没有必要的。对于类对象,在初始化和赋值之间的区别是巨大的。成员类对象应该总是在成员初始化表中被初始化而不是在构造函数体内被赋值。缺省Account构造函数
8、的更正确的实现如下:inlineAccount::Account():_name(string()) { _balance=0.0; _acct_nmbr=0; }它之
此文档下载收益归作者所有