我了解了有关调用复制构造函数的三种情况
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)
我可以纠正吗?
答案 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
函数时(按此顺序),将调用c1
和main
的析构函数
CpClass &s
是CpClass * const s
的语法糖。这意味着s
包含对象的地址,而不是副本。语法糖意味着这是一种简短形式,您无需取消引用。