关闭

<Effective C++ : 构造/析构/赋值运算> 笔记

标签: c++编译器classreferencec
749人阅读 评论(0) 收藏 举报
分类:

条款5:编译器可以暗自为class创建default构造函数、copy构造函数、copy assignment操作符,以及析构函数。


不过,仅仅是需要的时候,编译器才自动生成。如遇到下面代码时

NameClass A;    //defalut构造函数、析构函数

NameClass B(A); //copy构造函数

编译器才生成对应构造函数和析构函数。


编译器生成的构造函数,会为base classes和non-static成员变量赋值。


编译器为某个类生成copy构造函数和copy assignment操作符,需要满足两个条件:生成的代码合法,有适当机会证明它有意义。


例如,当某个类里面有const的non-static成员函数的时候,编译器讲拒绝生成构造函数,即拒绝编译那一行。这个时候就必须自己定义copy构造函数。

试了下,在VC6里,在成员初始化列表里初始化非静态的const成员变量后,编译器就可以自动生成copy构造函数了。未初始化时,则不能。


还有一种情况,当class中有引用类型的成员变量时,编译器也不能自动生成copy构造函数。


如果某个base classes所生成的copy assignment操作符声明为private,编译器也就无法为derived classes自动生成了。


条款6:为驳回编译器自动提供的技能,可将相应的拷贝构造函数等等声明为private并且不予实现。但,友元函数和成员函数还是可以使用private的拷贝构造函数的。更进一步的,使用一个有private的拷贝构造函数的base classes,可以微妙的阻止编译器自动生成drived classes的拷贝构造函数。


条款7:带有多态性质的base classes应该有一个virtual析构函数。如果class带有任何virtual函数,也就应该拥有一个virtual析构函数。


请记住:class的设计目的,如果不是作为base classes使用,或不是为了具备多态性,就不该声明virtual析构函数。


当你不希望某个类被实体化时,可以为其声明一个pure virtual函数。如果没有pure virtual函数,可以声明一个pure virtual析构函数。同时,又必须定义该pure virtual析构函数,因为析构函数是派生类无法重新定义的,而多态性又需要。


条款8:析构函数绝对不要吐出异常。如果一个被析构函数调用的函数可能跑出异常,析构函数应该能捕捉任何异常,然后吞下它们或结束程序。

如果客户需要对某个操作函数运行期间抛出的异常做出反应,那么class应该提供一个普通函数执行该操作,而非在析构函数中。总之,析构函数不可以抛出异常。


条款9:在构造和析构期间,不要调用virtual函数,因为这类调用从不下降至derived class。就是说,在base class的构造函数运行时,其中的virtual函数无法只能调用base自己的,因为derived的virtual函数还是未定义状态。

解决方法是:采用static函数,从derived class构造函数向base class构造函数传递信息。


条款10:令operator= 返回一个reference yo *this,即返回赋值操作符左边参数的引用。这是为了连锁赋值,就像

a = b = c = d = 0;


条款11:在operator= 中处理“自我赋值”的问题,做到证同,和异常安全。

确保当对象自我赋值时,operator=有良好行为。其中技术包括比较“来源对象”和“目标对象”的地址、精心周到的语句顺序、以及copy-and-swap。

确定任何函数,如果操作一个以上的对象,而其中多个对象是同一个对象时,其行为仍然正确。


条款12:拷贝构造函数和拷贝赋值操作符,应该确保复制对象内所有的成员变量,和base class成分。

另外,不要在拷贝构造函数中调用拷贝复制操作符operator=,反之亦然。应该讲他们共同的技能放进第三个函数中,并由2个copy函数共同调用。Because,拷贝构造函数的作用是函数初始化,而operator=的作用是对已初始化过的类进行赋值。

1
0
查看评论

effective c++之构造 析构 赋值运算

(一) 了解C++ 默默编写并调用哪些函数 (只有当被调用到,才会默认生成,否则是没有的) default构造函数(当没有显示的提供任何构造函数时才会有) default析构函数 copy构造函数 copy assign构造函数   (二) 若不想使用编译...
  • sgnoquiter
  • sgnoquiter
  • 2012-06-23 22:04
  • 382

Effective C++ — 构造/析构/赋值运算(一)

Effective C++ ________________________________________________________________________________________________ 上一个博客我记录了Effective C++的前5个条款Effective...
  • Dawn_sf
  • Dawn_sf
  • 2017-09-16 17:03
  • 211

Effective C++ -- 构造析构赋值运算

05.了解C++默默编写并调用哪些函数 编译产生的析构函数时non-virtual,除非这个类的基类析构函数为virtual成员变量中有引用和const成员时,无法自动生成copy assignment函数基类将copy assignment操作符声明为private时,编译器拒绝为其derive...
  • zjufirefly
  • zjufirefly
  • 2015-03-14 22:29
  • 4558

Effective C++ <二>:构造,析构,赋值运算

如果这些函数出错的化,将会遍及整个class条款05:了解C++默默编写并调用哪些函数真讨厌,编译器会帮你添加上一些函数 如果你写下class Empty{};就好像如下class Empty { public: Empty() {...}; //default构造函数 ...
  • MonroeD
  • MonroeD
  • 2017-06-03 22:19
  • 127

Effective C++ 2.构造/析构/赋值运算

(1)  了解C++默默编写并调用了哪些函数                      编译器可以暗自为你 创建  default构造函数, copy 构造函数, cop...
  • u011444931
  • u011444931
  • 2013-12-25 17:25
  • 467

Effective C++(二)构造/析构/赋值运算

二、构造/析构/赋值运算 条款05:了解C++默默编写并调用哪些函数 1、空类 触发条件:如果被调用,且都是public 1)编译器会声明一个copy构造函数、一个copy assignment操作符和一个析构函数 2)如果没有声明构造函数,还会声明一个default构造函数(否则不会创建...
  • health747474
  • health747474
  • 2013-03-26 09:04
  • 394

Effective C++ — 构造/析构/赋值运算(二)

Effective C++  ————————————————————————————— 条款11:在operator=中处理"自我赋值" 有的人可能想了,有谁会写出 a = a;这种表达式这个条款是拿来充数的吧? 你还真的别这么说,这种情况还真的有情况发...
  • Dawn_sf
  • Dawn_sf
  • 2017-09-18 14:07
  • 256

C++ effective 2.构造/析构/赋值运算

二.构造/析构/赋值运算 条款05:了解C++默默编写并调用哪些函数 如果你自己美声明,编译器就会为类声明(编译器版本的)一个拷贝构造函数,一个拷贝赋值操作符和一个析构函数。此外如果你没有声明任何构造函数,编译器也会成为你声明 一个默认构造函数。所有这些函数都是public且inli...
  • walkerkalr
  • walkerkalr
  • 2013-12-05 16:05
  • 567

Effective C++读书笔记---构造/析构/赋值运算

五、条款05-了解C++默默编写并调用哪些函数1.class中,当C++处理过它之后,如果自己没声明任何函数,编译器就会为它声明一个default构造函数、一个copy构造函数、一个copy assignment操作符和一个析构函数。惟有当这些函数被需要(被调用),它们才会被编译器创建出来。编译器产...
  • DotScylla
  • DotScylla
  • 2009-11-23 15:08
  • 560

《Effective C++》构造、析构、赋值运算

Item 05:了解C++默默编写并调用了哪些函数 总结:编译器可以暗自为class创建default 构造函数、copy构造函数、copy assignment操作符,以及析构函数。 (这一小节比较简单,想要深入了解可以翻阅深入探索C++对象模型的笔记)Item 06:若不想明...
  • m0_37316917
  • m0_37316917
  • 2017-03-11 21:02
  • 134
    个人资料
    • 访问:604295次
    • 积分:7751
    • 等级:
    • 排名:第3263名
    • 原创:192篇
    • 转载:6篇
    • 译文:0篇
    • 评论:99条
    博客专栏
    文章分类
    最新评论