条款5:了解C++默默编写并调用哪些函数

当写下如下空类时:

class Empty{};

编译器处理后变成;

class Empty

{

public:

Empty() {}//默认构造函数

Empty(const Empty&) {}//默认拷贝构造函数

~Empty(){}//默认析构函数

Empty& operator=(const Empty&) {}//默认赋值操作符

};

编译器产出的析构函数是一个non-virtual版本,除非这个class的base class自身声明有virtual析构函数。

编译器产出copy构造函数和copy assignment操作符,只是单纯地将来源于对象的每一个non-static成员变量拷贝到目标对象中。

特别:当如下两个条件之一不符合,编译器会拒绝产出operator=

1.如果class内含referenc或者const成员,必须自己定义copy assignment操作符。

2.如果某个base class将copy assignment操作符声明为private,编译器会拒绝给derived class生成copy assignment操作符。

时间: 2024-10-13 10:59:39

条款5:了解C++默默编写并调用哪些函数的相关文章

[effictive c++]条款05 了解c++默默编写并调用哪些函数

c++的编译器是非常智能的!当你声明一个空类empty class,如果你的代码有用到这个empty class时,编译器会默默的为你编写一些基本的函数.那么究竟编译器自己添加的函数都有哪些呢?构造函数,析构函数,一个copy构造函数和一个copy assignment操作符.举个例子来说明一下,如果你写下: class empty{}; 就好像你写下这样的代码: class Empty { public: Empty(){ ... } //default 构造函数 ~Empty(){ ....

Effective C++ 条款5 了解C++默默编写并调用哪些函数

1. 成员函数只有被需要(被调用)才必须有定义,同理,只有当默认构造函数,拷贝构造函数,赋值操作符,析构函数被需要而类定义它们时,它们才会被编译器创建出来(除非函数在基类中被声明为虚函数,编译器产生的函数是非虚的,public的). 2. 并不是只要类没有定义默认构造函数,拷贝构造函数,赋值操作符时编译器就会自动合成它们,它们只有在"被需要"的时候才被产生. (具体见http://www.cnblogs.com/reasno/p/4742322.html) 3. 虽然编译器在类的创建者

Effective C++ 之 Item 5:了解C++默默编写并调用哪些函数

Effective C++ chapter 2. 构造 / 析构 / 赋值运算 (Constructors, Destructors, and Assignment Operators) Item 5. 了解 C++ 默默编写并调用哪些函数 (Know what functions C++ silently writes and calls)

Effective C++ Item 5 了解 C++ 默默编写并调用哪些函数

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验: 如果你自己没声明,编译器会自动声明copy constructor,copy assignment,destructor, 如果你没有声明任何构造函数,编译器会自动声明default constructor 示例: 如果你写下 class Empty{ }; 将会等价于 class Empty{ public: Empty() {...} //default构造函数 Empty(c

EC笔记,第二部分:5.了解C++默默编写并调用哪些函数

5.了解C++默默编写并调用哪些函数 1.C++空类 C++会为一个空类建立以下函数 (1).默认构造函数 (2).默认拷贝构造函数 (3).析构函数 (4).赋值运算符(如果成员包含引用类型或const类型,不会生成赋值运算符)(引用的对象和const对象不可更改,所以无法重新赋值) class cl1 { public: int a; cl1(int t):a(t) {}; }; class cl2 { public: int &a; cl2(int t):a(t) {} }; int ma

了解C++默默编写并调用哪些函数

在C++中,如果你写下 1 classEmpty{-}; 就相当于写下 1 classEmpty{ 2 public: 3 Empty();//default构造函数 4 Empty(constEmpty& rhs){--};//copy构造函数 5 ~Empty(){-}//析构函数 6 Empty&operator=(constEmpty& rhs){-};//copy赋值运算符 7 }; 惟有当这些函数被调用时,他们才会被编译器创建出来. 下面代码造成上述每个函数被创建: 1

条款5.了解c++默默编写并且调用了哪些函数。

如果想在一个内含reference成员的class内支持赋值操作,必须自己定义copy assignment操作符.而且面对“内含有const成员的”class,编译器的反应也是相同的,由于更改const成员是非法的,所以编译器不知道如何在其自己生成的赋值函数之中去面对他们. template<class T> class NameObject { public: NameObject(std::string & name, const T & value; ... priva

条款5:了解C++默默编写并调用哪些函数(Know what functions C++ silently writes and calls)

1.default costructor  / copy constructor / copy assignment 者三者的区别? 特别是copy constructor & copy assignment !! 2.编译器可以暗自为class创建default构造函数.copy构造函数.copy assignment操作符,以及析构函数. 3.发现对运算符重载也不是太清楚!!!

条款05:了解C++默默编写并调用哪些函数

编译器在检测到有对象创建.赋值或者以copy构造函数的方式创建对象时会自动生成函数: