尽量使用初始化而不要在构造函数里赋值

尽量使用初始化而不要在构造函数里赋值

ID:15135339

大小:368.00 KB

页数:4页

时间:2018-08-01

尽量使用初始化而不要在构造函数里赋值_第1页
尽量使用初始化而不要在构造函数里赋值_第2页
尽量使用初始化而不要在构造函数里赋值_第3页
尽量使用初始化而不要在构造函数里赋值_第4页
资源描述:

《尽量使用初始化而不要在构造函数里赋值》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、条款12:尽量使用初始化而不要在构造函数里赋值看这样一个模板,它生成的类使得一个名字和一个t类型的对象的指针关联起来。templateclassnamedptr{public:namedptr(conststring&initname,t*initptr);...private:stringname;t*ptr;};(因为有指针成员的对象在进行拷贝和赋值操作时可能会引起指针混乱(见条款11),namedptr也必须实现这些函数(见条款2))在写namedptr构造函数时,必须将参数值传给相应的数据成员。有两种方法来实现。第一种方法是使用

2、成员初始化列表:templatenamedptr::namedptr(conststring&initname,t*initptr):name(initname),ptr(initptr){}第二种方法是在构造函数体内赋值:templatenamedptr::namedptr(conststring&initname,t*initptr){name=initname;ptr=initptr;}两种方法有重大的不同。从纯实际应用的角度来看,有些情况下必须用初始化。特别是const和引用数据成员只能用初始化,不能

3、被赋值。所以,如果想让namedptr对象不能改变它的名字或指针成员,就必须遵循条款21的建议声明成员为const:templateclassnamedptr{public:namedptr(conststring&initname,t*initptr);...private:conststringname;t*constptr;};这个类的定义要求使用一个成员初始化列表,因为const成员只能被初始化,不能被赋值。如果namedptr对象包含一个现有名字的引用,情况会非常不同。但还是要在构造函数的初始化列表里对引用进行初始

4、化。还可以对名字同时声明const和引用,这样就生成了一个其名字成员在类外可以被修改而在内部是只读的对象。templateclassnamedptr{public:namedptr(conststring&initname,t*initptr);...private:conststring&name;//必须通过成员初始化列表//进行初始化t*constptr;//必须通过成员初始化列表//进行初始化};然而前面最初的类模板不包含const和引用成员。即使这样,用成员初始化列表还是比在构造函数里赋值要好。这次的原因在于效率。当使用成员初

5、始化列表时,只有一个string成员函数被调用。而在构造函数里赋值时,将有两个被调用。为了理解为什么,请看在声明namedptr对象时都发生了些什么。对象的创建分两步:1.数据成员初始化。(参见条款13)2.执行被调用构造函数体内的动作。(对有基类的对象来说,基类的成员初始化和构造函数体的执行发生在派生类的成员初始化和构造函数体的执行之前)对namedptr类来说,这意味着string对象name的构造函数总是在程序执行到namedptr的构造函数体之前就已经被调用了。问题只在于:string的哪个构造函数会被调用?这取决于namedptr类的成

6、员初始化列表。如果没有为name指定初始化参数,string的缺省构造函数会被调用。当在namedptr的构造函数里对name执行赋值时,会对name调用operator=函数。这样总共有两次对string的成员函数的调用:一次是缺省构造函数,另一次是赋值。相反,如果用一个成员初始化列表来指定name必须用initname来初始化,name就会通过拷贝构造函数以仅一个函数调用的代价被初始化。即使是一个很简单的string类型,不必要的函数调用也会造成很高的代价。随着类越来越大,越来越复杂,它们的构造函数也越来越大而复杂,那么对象创建的代价也越来越高。养

7、成尽可能使用成员初始化列表的习惯,不但可以满足const和引用成员初始化的要求,还可以大大减少低效地初始化数据成员的机会。换句话说,通过成员初始化列表来进行初始化总是合法的,效率也决不低于在构造函数体内赋值,它只会更高效。另外,它简化了对类的维护(见条款m32),因为如果一个数据成员以后被修改成了必须使用成员初始化列表的某种数据类型,那么,什么也不用变。但有一种情况下,对类的数据成员用赋值比用初始化更合理。这就是当有大量的固定类型的数据成员要在每个构造函数里以相同的方式初始化的时候。例如,这里有个类可以用来说明这种情形:classmanydatambr

8、s{public://缺省构造函数manydatambrs();//拷贝构造函数manydat

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。