当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++进阶与实例

读书笔记05:c++默默为您编写的函数

    《Effective C++》读书笔记05:c++默默为您编写的函数

    这一部分的条款讲的都是类的构造/析构/赋值函数的使用。

    当你写下一个:

 1 class Empty {};

    经过了编译器的处理,就好像你写下了如下的代码:
 1 class Empty
2 {
3 public:
4   Empty() {}                           //default构造函数
5   Empty(const Empty& rhs) {}           //copy构造函数
6   ~Empty() {}                          //析构函数
7
8   Empty& operator=(const Empty& rhs) {}//copy assignment操作符
9 }

    你看,c++编译器会在你需要的时候创建

    1.default构造函数

    2.析构函数

    3.copy构造函数

    4.copy assignment函数

    这样一来,你就可以写如下代码了:

 1 Empty e1;     //调用了default构造函数
2
3 Empty e2(e1); //调用了copy构造函数
4 e2 = e1;      //调用了copy assignment函数
5                 //调用析构函数

    好吧,知道了有这些函数,可这些函数用来干什么?为什么编译器要写这些函数?

    1.default构造函数和2.析构函数主要是给编译器一个放置代码的地方,可以用来调用基类和non-static成员变量的构造函数和析构函数。

    3.copy构造函数和4.copy assignment函数,编译器创建的版本只是简单的将每一个non-static成员变量拷贝到目标对象,看下面这个例子:

 1 using namespace std;
2
3 class NameObject
4 {
5 public:
6   NameObject(const char* name, const int& value);
7   NameObject(const string& name, const int& value);
8
9 private:
10   string nameValue;
11   int objectValue;
12 }
13
14 NameObject no1("Smallest Prime Number", 2);
15 NameObject no2(no1);   //以no1.nameValue和no1.objectValue的值设定no2的值
16                           //nameValue是string,首先会调用string的copy构造函数并以no1.nameValue作为参数
17                           //由于objectValue是内置int型,所以会直接将它的每一位拷贝过去。

    上面的例子是理想的情况,就是每个变量都是可以直接赋值过去的,没有引用类型和const类型,假如有这两种类型的成员变量,则会报错
 1 class NameObject
2 {
3 public:
4        NameObject(string& name, const int& value);
5 private:
6        string& nameValue;        //引用类型
7        const int objectValue;    //const类型         
8 };
9
10 int main()
11 {
12   string newDog("DaHuang");
13   string oldDog("XiaoGuai");
14   NameObject p(newDog, 2);
15   NameObject s(oldDog, 36);
16   p = s;           //错误,不能更改non-static的引用成员的指向,不能更改const成员的值
17                       //所以编译器提示不能 使用default assignment,并报错
18   return 0;
19   system("PAUSE");   
20 }
    所以,在存在这样的成员变量时,尽可能自己定义coyy构造函数和copy assignment函数
相关内容
赞助商链接