拷贝构造函数

来源:互联网 发布:淘宝延长收货如何设置 编辑:程序博客网 时间:2024/06/16 14:24

-----------------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】

0 0