我有以下代码来测试本地函数返回的对象的流程。只想弄清楚它是如何工作的。在开始时,我认为返回的对象将调用复制构造函数来初始化main函数中的变量tt
。在这种情况下,这段代码会导致分段错误,因为我没有做真正的副本,例如深刻的副本。但是发生的事情完全不是我的想法。它没有调用复制构造函数,也没有遇到分段错误。我真的想知道为什么?
另一个实验是,如果我将显式添加到复制构造函数,编译器将报告错误以隐式调用该副本 构造函数。我只是不明白这个功能是如何工作的。
我的测试环境是在Ubuntu 16.04.1上使用g ++编译器(Ubuntu 5.4.0-6ubuntu1~16.04.4)5.4.0 20160609
class test{
public:
explicit test(int n);
test(const test& t);
~test();
int getCount(){return count;}
void printChar(int idx){ cout<<data[idx]<<endl; }
void setChar(int idx, char v){ data[idx]=v; }
private:
int *data;
int count;
};
test::test(int n):data(NULL)
{
cout<<"in constructor"<<endl;
data = new int [n];
count =n;
}
test::test(const test& t)
{
cout<<"in copy constructor"<<endl;
}
test::~test()
{
cout<<"delete a test"<<endl;
delete [] data;
}
test getClass()
{
test t(10);
t.setChar(0,'f');
t.setChar(1,'u');
return t;
}
int main()
{
test tt = getClass();
cout<<tt.getCount()<<endl;
tt.printChar(0);
return 0;
}