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

C++ 应避免调用复制构造函数的两种情况,c++,pass-by-reference,copy-constructor,call-by-value,C++,Pass By Reference,Copy Constructor,Call By Value,我已经了解了关于调用复制构造函数的三个案例 CpClass c1(10); CpClass c2(c1); show2(c2); 一,。正在从同一类的对象初始化变量 二,。使用类的值参数调用函数 三,。函数返回的值是类的对象 此外,教科书还指出,对于上述两种情况CaseSe2和3,为了避免调用复制构造函数,请使用callby reference 我搜索了一些信息,但我不能完全理解 例如,我自己编写了代码 class CpClass{ int p; CpClass(co

我已经了解了关于调用复制构造函数的三个案例

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

show2(c2);
一,。正在从同一类的对象初始化变量

二,。使用类的值参数调用函数

三,。函数返回的值是类的对象

此外,教科书还指出,对于上述两种情况CaseSe2和3,为了避免调用复制构造函数,请使用callby reference

我搜索了一些信息,但我不能完全理解

例如,我自己编写了代码

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);

  };
我找到了一些关于这个的信息

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

其次,它在复制参数时调用构造函数,无论参数形式是在代码、字符串&s还是字符串s中按值调用还是按引用调用


我是否正确?

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

#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
离开函数后调用第一个Destructor

void show2(CpClass s)
按此顺序离开主函数时,将调用c2和c1的析构函数


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

您能给出您使用的真实代码吗?不是这样。哪一个编译器有什么标志。只是一个旁注:当通过引用返回对象时必须小心。如果对象是在堆栈上创建的,则引用将悬空。有关详细信息,请参阅。您的意思是,在void show1CpClass&s的情况下,它不会同时调用复制构造函数和析构函数吗?在void show1CpClass&s的情况下,不会分配内存,也不会复制对象。只复制内存地址。所以没有构造函数也没有析构函数被调用。啊哈,那么复制构造函数CpClassconst CpClass&obj是用于按值形式调用的,对吗?那么不是地址,所有复制构造函数复制值不是地址吗?由于复制构造函数具有类似“const class_name&object”的参数形式,因此当您使用另一个对象创建对象时,会应用复制构造函数,如void show2CpClass s。在内部发生了类似CpClass sc2的事情。