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

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容