C ++通过引用传递对象

时间:2011-03-01 15:27:59

标签: c++ object reference

我正在努力学习C ++,而我正在研究“Sams在21天内自学C ++”。

到目前为止,我的进展非常顺利,甚至毫不费力地完成了关于指针的章节。但是,“按引用传递对象”的列表让我很困惑。

有一个包含两个构造函数的类:

class SimpleCat
{
public :
    SimpleCat();
    SimpleCat(SimpleCat&);
...
};

原型的两个功能:

SimpleCat FunctionOne( SimpleCat theCat );
SimpleCat* FunctionTwo( SimpleCat *theCat );

/ 令我困惑的是,在调用第二个函数时,会调用第二个构造函数SimpleCat(SimpleCat&);。有人可以解释一下吗?任何进一步的搜索都让我同样困惑。 /

编辑:我在这里的帖子中犯了一个错误,复制构造函数(我现在知道它是什么,非常感谢你)用第一个函数调用。我很抱歉这个混乱。我知道现在了解这个链接,你们都有很大的帮助。

4 个答案:

答案 0 :(得分:1)

SimpleCat(SimpleCat&)copy constructorSimpleCat 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对象的副本,从而导致调用复制构造函数。