搜索
您的当前位置:首页正文

c++系列之传值和传引用

来源:知库网

sample

/*************************************************************************
  > File Name: constructor.cc
  > Author:perrynzhou
  > 
  > 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
Top