一、构造和析构函数

  C++在幕后为你写的的函数:一个拷贝构造函数,一个赋值运算符,一个析构函数,一对取址运算符。另外,如果你没有声明任何构造函数,它也将为你声明一个缺省构造函数。所有这些函数都是公有的。换句话说,如果你这么写:


class Empty{};


  和你这么写是一样的:


class Empty
{
public:
  Empty();                        // 缺省构造函数
  Empty(const Empty& rhs);        // 拷贝构造函数

  ~Empty();                       // 析构函数 ---- 是否为虚函数看下文说明
  Empty&
  operator=(const Empty& rhs);    // 赋值运算符

  Empty* operator&();             // 取址运算符
  const Empty* operator&() const;
};
 


  深拷贝和浅拷贝:

  默认拷贝构造函数均是浅拷贝。但是一个类可能拥有其它资源,如其构造函数分配了一个堆内存,析构函数释放了这个内存,则此时需要进行深拷贝了,深拷贝不能依赖编译器实现。为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符。

  拷贝构造函数的调用:

  1、当用类的一个对象去初始化该类的另一个对象时。

  2、当对象作为函数的实参传递给函数的形参时。

  3、当函数的返回值是类的对象,函数执行完成返回时。

  在构造函数中调用另一个构造函数,会生成一个临时对象,并且立即释放。

  string c=a;只调用了拷贝构造函数。而string c; c=a;分别调用了构造函数和赋值函数。

  构造函数和析构函数的注意点:

  1、构造函数和析构函数不能有返回值

  2、可以显式调用构造函数和析构函数

  3、拷贝(复制)构造函数不能用值传递

  4、不要在构造函数和析构函数中抛出异常和调用有异常抛出的函数,可能会有内存泄露!

  5、确定基类有虚析构函数

  二、static、const、友元与虚函数

  1、静态成员使用static申明,在内存中永远只有一份实例(静态变量,类内声明,类外定义)

  2、是类的对象所共有的

  3、静态成员变量可以被成员函数访问,但静态成员函数只能访问静态成员变量

  4、友元是为了一个普通函数直接访问一个类的保护甚至是私有成员的机制

  虚函数:

  在普通成员函数前面加 virtual 关键字

  一个函数在基类申明一个virtual,那么在所有的派生类都是是virtual的

  一个函数在基类为普通函数,在派生类定义为virtual的函数称为越位

  抽象类:

  具有纯虚函数的类是抽象类

  抽象类不能被实例化,所以抽象类只能以指针方式被应用

  抽象类可以防止切片的发生

  抽象类不产生虚表。

  const对象与成员:

  1、const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数.

  2、const对象的成员是不可修改的,然而const对象通过指针维护的对象却是可以修改的.

  3、const成员函数不可以修改对象的数据,不管对象是否具有const性质。

  4、然而加上mutable修饰符的数据成员,对于任何情况下通过任何手段都可修改,此时的const成员函数是可以修改它的