-----------------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"); return 0; } |
【made by siwuxie095】