Два случая, которые следует избегать вызова конструктора копирования

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

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

};

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

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

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

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

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector