accelerated cpp chapter 11 定义抽象数据类型

来源:互联网 发布:身份证号后四位 算法 编辑:程序博客网 时间:2024/06/07 12:07

1 设计一个类的时候,一般要先确定类提供的借口,确定借口的途径是研究类的使用者将会怎么使用类。

 

2 explicit关键字。这个关键字只在定义带一个参数的构造函数的时候才有意义。声明为explicit的构造函数只有在用户显示的调用它的时候它才会被调用。这样就避免了改函数被隐式调用以生成一个对象。

 

 

3 重载函数时,函数参数的const属性也能用于区分参数。如对索引操作符[]进行重载时,其参数都是一个整形参数,是一样的,但因为索引操作符函数必须是成员函数,所以它一定有一个指向自身的隐含参数,而根据该隐含参数是否为常量,能够区分这两个函数。所以该函数能够重载。如:

          T& operator[](size_type i)

          const T& operator[](size_type i);

 

4 拷贝构造函数

   拷贝构造函数负责通过一个已有对象初始化创建另一个相同类型的对象,通常有两种使用情形:

   (1)隐式拷贝:出现在讲一个对象值传递给函数,或者函数传值返回一个对象,此时传入和传出的对象是通过隐式拷贝原对象生成的;

   (2)显示拷贝:及声明一个对象后,显示的通过调用拷贝构造函数通过一个已有对象来初始化新对象(可通过赋值操作符将已有对象赋值给新对象或者将已有对象作为参数传递给新对象来进行);

  拷贝构造函数只有一个与类本身相同类型的参数,而且通常是通过常量引用的方式传递;

  编写拷贝构造函数的时候,对指针指向的对象要注意使用深拷贝。

 

5 赋值运算符

  一个类可以重载多个不同的赋值运算符,将不同类型的值付给该类型的对象。但是我们一般都将参数是本身类型的操作符重载版本成为赋值运算符,用于将已有对象赋值给另一个已有对象。

  在编写赋值运算符的时候,要考虑自我赋值的问题,即用户有可能会把一个对象赋值给它本身。因为赋值操作符通常涉及删除被赋值对象之前指向的值,而自我赋值这时可能会引起错误,所以要注意处理。

 

6 拷贝构造函数与赋值运算符的区别

      赋值操作:总是把一个已经存在的值擦除,然后代之以一个县的值;

      拷贝构造函数:总是创建一个新的对象,所以不存在要对一个已经存在的值进行删除。

  拷贝与赋值操作的工作方式很类似,二者联系虽紧密,但是要注意:

      构造函数始终只控制初始化操作;

      赋值函数operator=始终只控制赋值操作。

 

7 this关键字

  this关键字只在成员函数内部才有效。

 

8 析构函数

  以波浪线前缀~开头,和类同名,无参数,无返回值。

 

9 当用户没有自定义一下函数时,系统会自动生成默认构造函数(用户没有自定义任何构造函数),拷贝构造函数,赋值操作符函数和析构函数。这些函数的操作都是对每一个要操作的成员进行递归操作的,调用该成员类型对应的构造函数,赋值函数或析构函数。

   特别注意的是:默认析构函数删除一个指针时不会释放该指针指向的对象的内存空间。

 

10 三位一体规则(rule of three)

   拷贝构造函数,析构函数和赋值运算符函数相互关系紧密,形成以下三位一体规则:

       如果类需要一个自定义析构函数,则它同时可能一需要一个自定义拷贝构造函数和一个自定义赋值运算符函数。

  这是因为,如果一个类中进行了动态资源分配,则需要一个析构函数来释放资源。既然有动态资源分配,就需要自定义拷贝构造函数和赋值运算符函数在拷贝动态资源时进行深拷贝

原创粉丝点击