Два случая, которые следует избегать вызова конструктора копирования - PullRequest
0 голосов
/ 18 ноября 2018

Я узнал о трех случаях вызова конструктора копирования

1.Переменная инициализируется из объекта того же класса

2.Функция вызывается с параметром значения класса

3.Функция возвращает значение, которое является объектом класса

Также в учебнике написано для двух вышеупомянутых случаев (case2 и 3), чтобы избежать вызова конструкторов копирования, используйте call-by-ссылка

Я искал некоторую информацию, но не могу точно понять.

Например (я сделал свой собственный код)

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

  };

Я нашелнекоторая информация об этом.

Первый , Когда мы передаем аргумент, который является объектом класса, если параметр является ссылочной формой, а не значением, он не вызывает деструктор, как только функцияЯ отправил.Он вызывает деструктор, когда основная функция завершается

Second , он вызывает конструктор, когда копирует аргумент, является ли форма параметра вызовом по значению или вызовом по ссылке (в коде, String & s или String s)

Я прав или нет?

1 Ответ

0 голосов
/ 18 ноября 2018

Поскольку ваш опубликованный код не компилируется, я изменил его на:

#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 и c1 вызываются при выходе из функции main (в этом порядке)

CpClass &s является синтаксическим сахаром для CpClass * const s.Это означает, что s содержит адрес объекта, а не его копию.Синтаксический сахар означает, что это короткая форма, и вам не нужно разыскивать.

...