C++类设计小结(第十三章)

编译器生成的成员函数

  1. 默认构造函数:
  • 若用户没有定义构造函数,则系统自动生成默认构造函数
  • 用户定义了构造函数,则必须定义默认构造函数
  • 默认构造函数要么没有参数,要么所有参数都是默认值
  • 派生类构造函数的成员初始化列表中没有显式调用基类构造函数,则编译器将自动使用基类的默认构造函数来构造派生类对象的基类部分。
  • 如果类中包含指针成员,则必须初始化这些成语,最好提供显示默认构造函数
  1. 复制构造函数
  • 原型:Class_name(const Class_name & )
  • 使用复制构造函数的情况:
    1.将新对象初始化为一个同类对象
    2.按值传递对象给函数
    3.函数按值返回对象
    4.编译器生成临时对象
  • 使用new初始化的成员指针通常要求执行深复制,或者类可能包含需要修改的静态变量,则需要自己定义复制构造函数。

ps. 构造函数

  • 构造函数不能继承,因为构造函数创造对象,其他类方法只是现有对象的调用。
  1. 赋值运算符
  • 对已有对象的值进行修改就是赋值。
  • 原型:Class_name & Class_name :: operator = (const Class_name &) ;将类赋值给类
  • 原型:Class_name & Class_name :: operator = (const char * );将字符串赋值给类

其他类方法

  1. 析构函数
  • 一定要定义显式析构函数来释放类构造函数使用new分配的所有内存
  • 对于基类,即使不适用析构函数,也要提供一个虚析构函数
  1. 按值传递对象和按引用传递对象
  • 按值传递对象涉及到临时拷贝,既调用复制构造函数,然后调用析构函数,复制大型对象比传递引用花费时间要多得多。如果不修改对象,应声明为const 引用
  • 按引用传递另一个reason,在继承使用虚函数时,被定义为接受基类引用的参数可以接受派生类。
  1. 返回对象和返回引用
  • 应返回引用而不是返回对象的原因在于返回对象涉及生成返回对象的临时副本(复制构造函数和析构函数的调用需要花费时间)
  • 函数不能返回在函数中创建的临时对象,这时候必须用返回对象。
  1. 使用const
  • 确保方法不修改参数 Class (const Class& c)
  • 确保方法不修改调用它的对象 void show() const
  • 确保指针或引用返回的值不能用于修改对象中数据 const Class& top(const Class& c) const (返回的指针或引用也必须是const)

公有继承考虑的因素

  1. is-a关系
    (1)在某种情况下,最好的方法可能是创建包含纯虚函数的抽象数据类,并从她派生出其他类
    (2)表示is-a方式之一是,无需进行显式类型转换,比如基类指针或引用可以指向派生类对象
  2. 不能被继承
    (1)构造函数,每个类都需要有自己的构造函数,然后显式调用基类构造函数
    (2)析构函数,
    (3)赋值运算符
  3. 赋值运算符
    (1)如果对象属于派生类,编译器将使用基类赋值运算符来处理派生类的基类部分的赋值。
    (2)如果类构造函数使用new来初始化指针,则需要提供一个显式赋值运算符
    (3)将派生类赋值给基类对象,赋值运算符只会处理基类成员。
    (4)将基类对象赋值给派生类对象,将不能运行,除非有转换构造函数(转换构造函数可以接受一个类型为基类的参数和其他参数,条件是其他参数有默认值)另一个方法是定义一个将基类赋给派生类的赋值运算符
Pclass& Pclass::operator = (const Pclass& pc)
{
    if(this == &pc)
        return *this
    Class::operator=(hs)
    delete [ ] name;
    name = new char(std::strlen(pc.name)+1);
    strcpy(name,pc.name);
    return *this;}
  1. 私有成员和保护成员
    (1)对派生类而已,保护成员类似于公有成员;对于外部而言,保护成员类似于私有成员。
  2. 虚方法
    (1)设计基类时,必须确定是否要将方法声明为虚的。如果希望派生类能够重新定义方法,则应将方法定义为虚的。
    (2)无论什么方法,若参数是按值传递,则按这个值得类使用方法;如果不是虚方法,且参数是按引用或指针传递,则按这个指针或引用的类型来使用方法;若是虚方法,且参数是按引用或指针传递,则按这个指针或引用指向值得类型使用方法,
  3. 友元函数
    (1)友元函数不是成员函数,所以不能继承,如果希望派生类能够使用基类的友元函数,可以通过强制类型转化将派生类引用或指针转换为基类。
    os << (const Class & ) hs

你可能感兴趣的:(C++类设计小结(第十三章))