【问题标题】:Two cases which should avoid calling copy constructor应避免调用复制构造函数的两种情况
【发布时间】:2018-11-18 14:31:16
【问题描述】:

我学习了三个调用拷贝构造函数的案例

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

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

3。一个函数正在返回一个作为类对象的值

教科书上也说对于上述两种情况(case2和3),为了避免调用复制构造函数,使用call-by-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);

  };

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

首先,当我们传递一个类对象的参数时,如果参数是引用形式而不是值,函数一结束就不会调用析构函数。主函数结束时调用析构函数

第二,无论参数形式是值调用还是引用调用(在代码中,String &s or String s),复制参数时调用构造函数

我说的对吗?

【问题讨论】:

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


【解决方案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)

c2c1 的析构函数在离开 main 函数时被调用(按此顺序)

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

【讨论】:

  • 你的意思是,在void show1(CpClass &s)的情况下,它不会同时调用拷贝构造函数和析构函数?
  • void show1(CpClass &amp;s) 的情况下,不会分配内存,也不会复制任何对象。只复制内存地址。所以没有构造函数和析构函数被调用。
  • 啊哈,那么复制构造函数 CpClass(const CpClass &obj) 是用于按值形式调用的吧?不是地址 那么,所有的复制构造函数复制值都不是地址吗?因为复制构造函数具有像 'const class_name &object' 这样的参数形式
  • 当您使用另一个对象创建对象时应用复制构造函数,例如void show2(CpClass s)。在内部发生类似CpClass s(c2) 的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
相关资源
最近更新 更多