目录
一、拷贝构造函数的概念
拷贝构造函数是一种特殊的构造函数,拷贝构造函数的作用是在创建一个新对象是,使用一个已经存在的对象去初识化这个新对象,
下面我来举一个例子:
Point p2(p1)
这个的作用是在创建p1这个新对象的时候使用本来就存在的对象p2去初始化p1,在这个初始化的过程中我们就需要调用到拷贝构造函数
二、拷贝构造函数的初识
- 由于拷贝构造函数也是一种构造函数,所以它的函数名也是要和类名相等的,并且也是没有返回值的
- 拷贝构造函数只有一个同类对象引用的参数
- 每个类必须要有一个拷贝构造函数,我们可以自定义拷贝构造函数,也可以不自定义使用系统随机自动生成的一个默认的拷贝构造函数
三、拷贝构造函数定义方法
自定义拷贝构造函数的一般形式:
类名::类名(const 类名 &对象名){ 拷贝构造函数的函数体 …………………… }
下面我们就来举一个简单的例子
#include <iostream> using namespace std; class Score { private: int age, score; public: Score(int a, int s); //创建一个自定义的构造函数 ~Score(); //首先声明一个析构函数 Score(const Score& p); //自定义的拷贝构造函数 void print_age(); //输出对象的年龄 }; Score::Score(int a, int s) { cout << "我是构造函数,现在已执行……" << endl; age = a; score = s; } Score::~Score() { cout << "对象注销,现在自动执行析构函数了……" << endl; } Score::Score(const Score& p) { age = p.age; score = p.score; cout << "拷贝构造函数已经使用……" << endl; } void Score::print_age() { cout << age << endl; } int main() { Score score2(18, 100); Score score3(score2); //调用拷贝构造函数方法一,拷贝score2 Score score4 = score2; //调用拷贝构造函数方法二,拷贝score2 score2.print_age(); score3.print_age(); score4.print_age(); }
输出结果:
四、 拷贝构造函数调用的条件
1、当用一个类的对象去初始化同类的另一个对象的时候。正如上面例子的这两条语句:
Score score3(score2); //调用拷贝构造函数方法一,拷贝score2 Score score4 = score2; //调用拷贝构造函数方法二,拷贝score2
2、当一个函数的形参是一个类的对象的时候,且调用函数对形参与实参的结合时
3、当函数返回值是一个对象的时候
五、拷贝构造函数必须以引用的形式传递(参数为引用值)。
当一个对象以传递值的方式传一个函数的时候,拷贝构造函数自动的被调用来生成函数中的对象。如果一个对象是被传入自己的拷贝构造函数,它的拷贝构造函数将会被调用来拷贝这个对象这样复制才可以传入它自己的拷贝构造函数,这会导致无限循环直至栈溢出(Stack Overflow)。除了当对象传入函数的时候被隐式调用以外,拷贝构造函数在对象被函数返回的时候也同样的被调用。