C++中,如果我们在一个函数中,定义了一个类的对象,然后返回这个对象,在main函数中用一个对象去接受这个返回的对象的时候,这里面参与的函数调用大家可能不熟悉,这里通过程序和注释的方式给大家讲解一下。编译的环境是vs2013,我下面是进入单步调试时测试出来的结果。大家可以把下面的代码在自己的vs上面调试一下,结合着我的注释内容(我把解释部分直接放在了代码注释里面了),做更加深刻的理解。
#include<iostream>
using namespace std;
class Date
{
private:
int _year;
int _month;
int _day;
public:
Date(int y,int m,int d);
Date(const Date& d);
void setDate(int y,int m,int d);
void showDate();
};
Date::Date(int y = 2017, int m = 3, int d = 8) :_year(y), _month(m), _day(d)
{
cout << "Constcuting ..." << endl;
}
Date::Date(const Date &d)
{
_year = d._year;
_month = d._month;
_day = d._day;
cout << "拷贝构造函数" << endl;
}
void Date::setDate(int y, int m, int d)
{
_year = y;
_month = m;
_day = d;
}
inline void Date::showDate()
{
cout << _year << "." << _month << "." << _day << endl;
}
Date newSetdate(Date &d)
{
Date tmp; //这里函数被调用,首先调用构造函数,并且自动赋初值,实例化了一个新的对象tmp
return tmp; //这返回tmp的时候,没有直接把内容进行返回,而是返回tmp的一份拷贝,所以这里调用了拷贝构造函数
}
int main()
{
Date date1(2017,3,7); //首先调用构造函数
date1.showDate(); //这里打印的结果是2.17,3,7
date1 = newSetdate(date1); //这里首先调用的我的一个普通函数,大家可以先去这个普通函数中看一下
date1.showDate();
return 0;
}
这里给大家说一下调用拷贝构造函数的几种情况,一般情况下建议重写拷贝构造函数,防止出现深浅拷贝的问题。
(1) 当用类的一个对象去初始化类的另一个对象的时候
(2) 当函数的形参是类的对象,调用函数进行形参和实参结合时
(3) 当函数的返回值是对象,函数执行完成返回调用者时