拷贝构造函数
-----------------siwuxie095
以 Student 类为例:
先定义了 Student 类,在使用时,先实例化 stu1 对象,接着又实例化 stu2
对象,并将stu1 赋值给 stu2,这样就使得 stu2 在实例化的过程中拥有 stu1
的值,接着又实例化 stu3 对象,也将 stu1 赋值过来,使得 stu3 拥有了 stu1
里面的值
但是运行代码时却发现,只打印了一行Student,而没有像想象的那样打印
三行,毕竟是实例化了三个对象,理论上应该调用三次构造函数
实际上,后两种实例化对象的方式的确是调用了构造函数,但调用的不是这里
定义的构造函数,而是一个特殊的构造函数,即拷贝构造函数
拷贝构造函数
拷贝构造函数在定义时,与普通的构造函数基本相同,只是在参数上
有严格的要求
如下:
如果将相应的代码写在拷贝构造函数的实现的部分,再采用直接初始化
或复制初始化来实例化对象时,就执行拷贝构造函数中相应的代码,而
在实例化stu2 和 stu3 时并没有定义拷贝构造函数,仍能把它们实例化
出来,可见:拷贝构造函数与普通的构造函数一样,系统可自动生成
构造函数总结:
(1)构造函数的分类
(2)如果自定义了普通构造函数和拷贝构造函数,则系统不会
自动生成这两个函数
(3)初始化列表无论放在普通构造函数的后边还是拷贝构造函数
的后边,都有着不可取代的地位
程序:
Teacher.h:
#include <string> using namespace std;
class Teacher { public:
Teacher(string name = "Jim", int age = 1);//有参默认构造函数 Teacher(const Teacher &t);//拷贝构造函数 void setName(string name); string getName(); void setAge(int age); int getAge(); private: string m_strName; int m_iAge; }; |
Teacher.cpp:
#include"Teacher.h" #include <iostream> using namespace std;
Teacher::Teacher(string name, int age) :m_strName(name), m_iAge(age) { cout << "Teacher(string name, int age)" << endl; }
Teacher::Teacher(const Teacher &t) { cout << "Teacher(const Teacher &t)" << endl; }
void Teacher::setName(string name) { m_strName = name; }
string Teacher::getName() { return m_strName; }
void Teacher::setAge(int age) { m_iAge = age; }
int Teacher::getAge() { return m_iAge; } |
main.cpp:
#include<stdlib.h> #include"Teacher.h" #include <iostream> using namespace std;
//拷贝构造函数在参数传递时也会被自动调用 void test(Teacher t) {
} int main(void) { Teacher t1; Teacher t2 = t1;//复制初始化 Teacher t3(t1); //直接初始化 test(t1); system("pause"); return0; } |
【made by siwuxie095】