拷贝构造函数在什么情况下调用?

发布于 2018-01-30 16:24  编辑:盘子
0
计算机等级考试题库 扫码微信刷题

问:拷贝构造函数在什么情况下调用?


考无忧小编解答:拷贝构造函数在下列情况下被调用:用已经存在的对象去初始化同一个类的另一个对象;在函数的参数中,以传值方式传递类对象的拷贝;类对象的值被用做函数的返回值。拷贝构造函数和前面说到的转换构造函数有些相似。转换构造函数是把一个类的对象转化为另一个类的对象;拷贝构造函数是用一个已经存在的对象的值实例化该类的一个新对象。

不同对象间的初始化和赋值的区别:赋值操作是在两个已经存在的对象间进行的;而初始化是要创建一个新的对象,并且其初值来源于另一个已存在的对象。编译器会区别这两种情况,赋值的时候调用重载的赋值运算符,初始化的时候调用拷贝构造函数。

如果类中没有拷贝构造函数,则编译器会提供一个默认的。这个默认的拷贝构造函数只是简单地复制类中的每个成员。

#include iostream.h

#include string.h

class Date

{

int mo, da, yr;

char* month;

public:

Date(int m = 0, int d = 0, int y = 0);

Date(const Date &);

~Date();

void display() const;

};

Date::Date(int m, int d, int y)

{

static char* mos[] =

{

January, February, March, April, May, June,

July, August, September, October, November, December

};

mo = m; da = d; yr = y;

if (m != 0)

{

month = new char[strlen(mos[m-1])+1];

strcpy(month, mos[m-1]);

}

else

month = 0;

}

Date::Date(const Date & dt)

{

mo = dt.mo;

da = dt.da;

yr = dt.yr;

if (dt.month != 0)

{

month = new char [strlen(dt.month)+1];

strcpy(month, dt.month);

}

else

month = 0;

}

Date::~Date()

{

delete [] month;

}

void Date::display() const

{

if (month != 0)

cout << month <<' '<< da << , << yr << std::endl;

}

int main()

{

Date birthday(6,24,1940);

birthday.display();

Date newday = birthday;

newday.display();

Date lastday(birthday);

lastday.display();

return 0;

}

本例中,用到了两次拷贝构造函数。一个是使用普通的C++初始化变量的语句:

Date newday = birthday;

另一个是使用构造函数的调用约定,即把初始化值作为函数的参数:

Date lastday(birthday);






考无忧小编推荐:

更多计算机等级考试真题及答案>>>点击查看

想知道更多关于计算机等级报考指南、考试时间和考试信息的最新资讯在这里>>>点击查看


本文网址:http://www.k51.com.cn/info/jsjdjks/1801/3025392.html
选择分享到: