这是我的代码:
#include <iostream>
#include <cstring>
using namespace std;
class someClass{
char * data;
public:
someClass(const char * s){
data = new char[strlen(s)+1];
strcpy(data,s);
cout << "constructing.."<<endl;
}
someClass(const someClass &o){
data = new char[strlen(o.data)];
strcpy(data,o.data);
cout << "copy construction" << endl;
}
~someClass(){delete [] data; cout << "destructing..." << endl;}
char * getValue(){return data;}
};
void showValue(someClass o){
char * s;
s = o.getValue();
cout << s << endl;
}
int main(int argc, char ** argv){
someClass str("Hello"), ptr("world");
showValue(str);
showValue(ptr);
}
,输出为:
constructing..
constructing..
copy construction
Hello
destructing...
copy construction
world
destructing...
destructing...
destructing...
现在前两个&#39;构建..&#39;我们在第1行的main()中创建对象时会立即触发。
showValue( str )运行并触发单词&#39; hello&#39;的复制构造函数。 如何?创建和临时对象后,它会在功能失效时自行破坏。
showValue( ptr )运行并触发单词&#39; world&#39;的复制构造函数。 如何?创建和临时对象后,它会在功能失效时自行破坏。
最后,我们的str和ptr对象以相反的顺序被销毁。
为什么要复制ctor?我没有将someClass对象发送到someClass对象。你能解释一下情况吗?
答案 0 :(得分:4)
致电
时正在制作副本void showValue(someClass o)
如果您想避免复制,请参考
void showValue(someClass const& o)
在第一种情况下,o
是someClass
参数的函数本地副本,在函数结束时被销毁。
答案 1 :(得分:2)
void showValue(someClass o){
char * s;
s = o.getValue();
cout << s << endl;
}
你的cade的这一部分调用someClass
的复制构造函数。
如果你想摆脱它,你可以将你的班级改为:
void showValue(const someClass & o){
char * s;
s = o.getValue();
cout << s << endl;
}
并将GetValue更改为:
char * getValue() const {return data;}
这被称为传递const-reference,而不是传递值(你正在做什么)。当您传递值时,该函数将调用名为。
的类的复制构造函数建议对getValue()
进行更改是因为编译器希望确保对getValue
内showValue
的调用不会修改const元素{{1}的成员对象}。