两种情况应避免调用复制构造函数

时间:2018-11-18 14:31:17

标签: c++ pass-by-reference copy-constructor call-by-value

我了解了有关调用复制构造函数的三种情况

1。正在从同一类的对象中初始化变量

2。使用类的值参数调用函数

3。函数返回的值是该类的对象

对于上述两种情况(案例2和3),教科书也说,为避免调用副本构造函数,请使用按引用调用

我已经搜索了一些信息,但我无法完全理解。

例如(我编写了自己的代码)

class CpClass{
    int p;

       CpClass(const CpClass &obj){
           cout<<"user-defined constructor"<<endl;
           p = obj.p; 
       }

       ~CpClass(){
       cout<<"destructor"<<endl;
       }
};

void show1(String &s)
{ cout << "show1 : " << s.p; }
void show2(String s)
{ cout << "show2 : " << s.p; }

 int main(){

 CpClass c1(10);
 CpClass c2(c1);
 show1(c2);
 show2(c2);

  };

我找到了一些有关此的信息。

首先,当我们传递作为类对象的参数时,如果参数是引用形式而不是值,则函数结束后不会立即调用析构函数。主函数结束时调用析构函数

第二,它在复制参数时调用构造函数,而不管参数形式是按值调用还是按引用调用(在代码中为String&s或String s)

我可以纠正吗?

1 个答案:

答案 0 :(得分:1)

由于您发布的代码无法编译,因此将其更改为:

#include <iostream>
using namespace std;

struct CpClass{
    int p;

    CpClass(int i){
        cout<<"user-defined constructor"<<endl;
        p = i; 
    }

    CpClass(const CpClass &obj){
        cout<<"user-defined constructor"<<endl;
        p = obj.p; 
    }

    ~CpClass(){
        cout<<"destructor"<<endl;
    }
};

void show1(CpClass &s)
{ cout << "show1 : " << s.p; }
void show2(CpClass s) { // Constructor
    cout << "show2 : " << s.p; 
} // Destructor for s

int main() {
   CpClass c1(10); // Constructor
   CpClass c2(c1); // Constructor
   show1(c2);
   show2(c2);
   return 0;
}; // Desctructor for c2, c1

以下几行调用构造函数

CpClass c1(10);
CpClass c2(c1);

show2(c2);

离开函数

后,将调用第一个解析器
void show2(CpClass s)

离开c2函数时(按此顺序),将调用c1main的析构函数

CpClass &sCpClass * const s的语法糖。这意味着s包含对象的地址,而不是副本。语法糖意味着这是一种简短形式,您无需取消引用。