我正在努力学习C ++,而我正在研究“Sams在21天内自学C ++”。
到目前为止,我的进展非常顺利,甚至毫不费力地完成了关于指针的章节。但是,“按引用传递对象”的列表让我很困惑。
有一个包含两个构造函数的类:
class SimpleCat
{
public :
SimpleCat();
SimpleCat(SimpleCat&);
...
};
原型的两个功能:
SimpleCat FunctionOne( SimpleCat theCat );
SimpleCat* FunctionTwo( SimpleCat *theCat );
/ 令我困惑的是,在调用第二个函数时,会调用第二个构造函数SimpleCat(SimpleCat&);
。有人可以解释一下吗?任何进一步的搜索都让我同样困惑。 /
编辑:我在这里的帖子中犯了一个错误,复制构造函数(我现在知道它是什么,非常感谢你)用第一个函数调用。我很抱歉这个混乱。我知道现在了解这个链接,你们都有很大的帮助。
答案 0 :(得分:1)
SimpleCat(SimpleCat&)
是copy constructor。 SimpleCat FunctionOne(SimpleCat theCat)
使用pass by value语义。这需要复制类实例。因此调用了复制构造函数。
答案 1 :(得分:1)
我无法重现您描述的行为。如您所见[{3}},只有在您调用FunctionOne
时才会调用复制构造函数。
编辑直接在此处包含代码,以便更容易阅读。
<强>源:强>
#include <iostream>
class SimpleCat {
public:
SimpleCat() {
std::cout << "\tSimpleCat() called\n";
}
SimpleCat(SimpleCat&) {
std::cout << "\tSimpleCat(SimpleCat&) called\n";
}
};
SimpleCat FunctionOne( SimpleCat theCat ){
return theCat;
}
SimpleCat* FunctionTwo( SimpleCat* theCatPtr ){
return theCatPtr;
}
int main() {
SimpleCat cat;
std::cout << "-----\n";
std::cout << "FunctionOne{\n";
FunctionOne(cat);
std::cout << "}\n";
std::cout << "FunctionTwo{\n";
FunctionTwo(&cat);
std::cout << "}\n";
}
<强>输出强>:
SimpleCat() called
-----
FunctionOne{
SimpleCat(SimpleCat&) called
SimpleCat(SimpleCat&) called
}
FunctionTwo{
}
答案 2 :(得分:0)
引用它自己类型的构造函数称为“复制构造函数”(将在您的书中)。
每当编译器需要复制某种类型的对象时,如果类定义具有复制构造函数,它将使用它,否则它使用它提供的默认实现。因此,复制构造函数允许您控制类的复制方式。
您调用FunctionOne
时很可能正在使用复制构造函数,而不是FunctionTwo
,因为参数是按值传递的。
答案 3 :(得分:0)
您的FunctionOne采用BY VALUE对象
这意味着,无论何时调用函数,都会复制数据类型。这适用于普通的数据类型,如int,char,...,也适用于对象(在您的情况下是SimpleCat对象)。
所以当你有一个像void doIt(int a)
这样的函数时,那么当你调用doIt(3)时,值3被复制,创建一个值为3的整数的新实例。 />
转换为FunctionOne
,调用FunctionOne(cat)
将生成cat对象的副本,从而导致调用复制构造函数。