sample
/*************************************************************************
> File Name: constructor.cc
> Author:perrynzhou
> Mail:perrynzhou@gmail.com
> Created Time: Sun Jan 6 10:14:04 2019
************************************************************************/
#include <iostream>
using namespace std;
class Spreadsheet
{
public:
Spreadsheet() { cout << "Spreadsheet()" << endl; }
Spreadsheet(int mValue) : mValue(mValue)
{
cout << "Spreadsheet(int mValue)" << endl;
}
~Spreadsheet() { cout << "~Spreadsheet()" << endl; }
Spreadsheet(const Spreadsheet &spread)
{
cout << "Spreadsheet(const Spreadsheet& spread)" << endl;
}
Spreadsheet &operator=(const Spreadsheet &spread)
{
cout << "Spreadsheet& operator=(const Spreadsheet& spread) " << endl;
if (this == &spread)
{
return *this;
}
mValue = spread.getValue();
return *this;
}
int getValue() const { return mValue; }
void addValue(int value) { mValue = mValue + value; }
private:
int mValue = 1;
};
Spreadsheet processSpreadsheetPassValue(Spreadsheet s)
{
s.addValue(1);
return s;
}
Spreadsheet processSpreadsheetPassRef(Spreadsheet &s)
{
s.addValue(1);
return s;
}
Spreadsheet &processSpreadsheetPassValue1(Spreadsheet &s)
{
s.addValue(1);
return s;
}
int main(void)
{
cout << "...Spreadsheet processSpreadsheetPassValue(Spreadsheets)..." << endl;
Spreadsheet s(10);
processSpreadsheetPassValue(s);
/*
cout << "...start Spreadsheet processSpreadsheetPassRef(Spreadsheet&s)..." << endl;
processSpreadsheetPassRef(s);
cout << "...start Spreadsheet processSpreadsheetPassValue1(Spreadsheet&s)..." << endl;
processSpreadsheetPassValue1(s);
*/
return 0;
}
构造函数和析构函数行为
构造函数
1.申请对象大小的内存(堆或者栈)空间
2.强制转换为对象类型
3.调用对象的构造函数
析构函数
1.调用析构函数
2.释放栈或者堆内存
processSpreadsheetPassValue,参数传值,返回值
- 代码
cout << "...Spreadsheet processSpreadsheetPassValue(Spreadsheets)..." << endl;
Spreadsheet s(10);
processSpreadsheetPassValue(s);
- 执行过程
1.调用s的构造函数Spreadsheet(int mValue)
2.依据processSpreadsheetPassValue中的s对象,调用复制拷贝构造函数生成对象s1
3.由于processSpreadsheetPassValue返是一个对象,在函数内return之前,依据s1,调用s1的复制拷贝构造函数生成对象s2,调用s1的析构函数
4.processSpreadsheetPassValue返回s2后,调用s2析构函数
5.调用s的析构函数
image.png
processSpreadsheetPassRef,引用传参,返回值
- 代码
cout << "...start Spreadsheet processSpreadsheetPassRef(Spreadsheet&s)..." << endl;
Spreadsheet s(10);
processSpreadsheetPassRef(s);
- 执行过程
1.调用s的构造函数Spreadsheet(int mValue)
2.函数processSpreadsheetPassRef传递是引用,所以不产生临时对象
3.processSpreadsheetPassRef在return之前,会调用s的复制构造函数,生成对象s1,然后return s1
4.processSpreadsheetPassRef 在返回之后,接着会调用s1析构函数
5.调用s析构函数
image.png
- 代码
cout << "...start Spreadsheet processSpreadsheetPassValue1(Spreadsheet&s)..." << endl;
Spreadsheet s(10);
processSpreadsheetPassValue1(s);
-
执行过程
1.函数传入引用,传出引用
image.png