c++类知识点小结

C++类知识点小结

编译器生成的成员函数

默认构造函数

  • 默认构造函数要么没有参数,要么所有的参数都有默认值。

  • 如果没有定义任何构造函数,编译器将定义默认构造函数以创建对象;自动生成的默认构造函数的另一项功能是,调用基类的默认构造函数以及调用本身是对象的成员所属类的默认构造函数。

  • 如果派生类构造函数的成员初始化列表中没有调用基类构造函数,则编译器将使用基类的默认构造函数来构造派生类的基类部分。

  • 如果定义了某种构造函数,编译器将不会定义默认构造函数,在这种情况下如果需要默认构造函数,则必须自己提供。

复制构造函数

  • 复制构造函数接收其所属类的对象作为参数。在下列情况下,将使用复制构造函数:

    1、将新对象初始化为一个同类对象;

    2、按值将对象传递给函数;

    3、函数按值返回对象;

    4、编译器生成临时对象;

  • 如果程序没有使用(显式或隐式)复制构造函数,编译器将提供原型,但不提供函数定义;否则,程序将定义一个执行成员初始化的复制构造函数。

  • 使用new初始化的成员指针通常要求执行深复制,类可能包含需要修改的静态变量,以上情况需要自己定义复制构造函数。

赋值运算符

  • 默认的赋值运算符用于处理同类对象之间的赋值。(如果语句创建新的对象,则使用初始化;如果语句修改已有对象的值,则是赋值
  • 默认赋值为成员赋值。如果成员为类对象,则默认成员赋值将使用相应类的赋值运算符。如果需要显式定义复制构造函数,则基于相同的原因,也需要显式定义赋值运算符。
  • 编译器不会生成将一种类型赋给另一种类型的赋值运算符,如果希望这样做的话,可以显式定义运算符,例如将字符串付给Star对象,可以显式定义如下运算符:Star & Star::operator=(const char *){};另一种方法是使用转换函数将字符串转换为Star对象,然后使用将Star赋给Star的赋值函数。

其它的类方法

构造函数

  • 构造函数不同于其它类方法,因为它创建新的对象,而其他类方法只是被现有的对象调用。这是构造函数不被继承的原因之一。继承意味着派生类对象可以使用基类的方法,然而,构造函数在完成其工作之前,对象并不存在。

析构函数

  • 一定要定义显示析构函数来释放类构造函数使用new分配的所有内存, 并完成类对象所需的任何特殊的清理工作。对于基类,即使它不需要析构函数,也应该提供一个虚析构函数。

转换

  • 使用一个参数就可以调用的构造函数定义了从参数类型到类类型的转换。例如前面提到的将字符串转换为Star对象可通过如下构造函数Star(const char *);

  • 将可转换的类型传递给以类为参数的函数时,将调用转换构造函数。

  • 要将类对象转换为其他类型,应定义转换函数。转换函数可以是没有参数的类成员函数,也可以是返回类型被声明为目标类型的类成员函数,即使没有声明返回类型,函数也应返回所需的转换值。示例:

    1
    2
    Star::Star double(){...}  //将Star对象类型转换为double
    Star::Star const char *(){...} //将对象转换为const char
  • C++11支持将关键字explicit用于转换函数。与构造函数一样,explicit允许使用强制类型转换进行显式转换,但不允许隐式转换。

按值传递对象与传递引用

  • 通常,编写使用对象作为参数的函数时,应按引用而不是按值来传递对象,这样做的原因之一是为了提高效率,另一个原因是,在继承使用虚函数时,被定义为接受基类引用参数的函数可以接受派生类。

返回对象和返回引用

  • 函数不能返回在函数中创建的临时对象的引用(当函数结束时,临时对象将消失,这种引用时非法的),在这种情况下应返回对象,以生成一个调用程序可以使用的副本。
  • 如果函数返回的是通过引用或指针传递给他的对象,应按引用返回对象,以节省时间和内存。