《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函数

posted on 2009-02-18 16:13  月光笛手  阅读(1520)  评论(1)    收藏  举报

导航