C++入门经典 笔记 (第十四章)高级函数

来源:互联网 发布:linux superuser 编辑:程序博客网 时间:2024/06/01 16:55

在前面的第五章,介绍了如何实现函数的重载:编写多个名称相同但参数不同的函数,同样,对于类中的成员函数,也可以重载。编译器会根据参数的类型和数据决定调用哪个版本。同样,也成员函数一样,用于初始化对象的构造函数也可以重载。一个类可以有两个或多个构造函数,编译器将根据参数的数量和类型选择正确的构造函数。可以重载构造函数,但不能重载析构函数。因为析构函数的签名总是:名称为类名前加~,且不接受任何参数。

复制构造函数

除了提供默认构造函数和析构函数外,编译器还提供一个默认复制构造函数。每当创建对象的备份时,都将调用复制构造函数。按值将对象传入或传出函数时,都将创建对象的一个临时备份。如果对象是用户自己定义的,就将调用相应类的复制构造函数。

所有复制构造函数都接受一个参数:一个引用,它指向所属类的对象。最好将该引用声明为常量,因为复制构造函数不用修改传入的对象,如:

Tricycle   (const  Tricycle &trike); 在这条语句中,构造函数Tricycle接受一个常量引用,它指向一个现有的Tricycle对象。这个复制构造函数的目标是创建Tricycle对象的备份。

默认构造函数只将作为参数传入的对象的每个成员变量复制都新对象中,这称为浅复制(成员复制)。对于堆内存中的对象,浅复制将一个对象的成员变量的值复制到另一个对象中,这导致两个对象中的指针指向相同的内存地址。而深复制将堆内存中的值复制到新分配的堆内存中。对于浅复制,会出现一种问题,当其中一个对象不在作用域内,将调用对象的析构函数释放内存,而另一个对象仍然指向该内存,这将导致程序出错。解决的办法就是自己定义复制构造函数,并在复制时正确的分配内存。


0 0