C++ C++;对象构造函数按常量传递引用复制

C++ C++;对象构造函数按常量传递引用复制,c++,reference,constructor,copy,constants,C++,Reference,Constructor,Copy,Constants,当我将一个对象作为常量引用传递给另一个对象时,是否进行了复制?我一直认为,因为我通过引用传入了对象,所以成员对象本身实际上就是我传入的对象,而不是副本。我编写了一个测试程序,该程序导致传入的引用对象在作用域结束时被销毁,但它并没有像我预期的那样崩溃。这是一个等待发生的bug还是对象正在被复制 #include <iostream> #include <string> class Something { public: Something(const std::s

当我将一个对象作为常量引用传递给另一个对象时,是否进行了复制?我一直认为,因为我通过引用传入了对象,所以成员对象本身实际上就是我传入的对象,而不是副本。我编写了一个测试程序,该程序导致传入的引用对象在作用域结束时被销毁,但它并没有像我预期的那样崩溃。这是一个等待发生的bug还是对象正在被复制

#include <iostream>
#include <string>

class Something
{
public:
    Something(const std::string& str) : mStr(str) {}
    const std::string& str() const
    {
        return mStr;
    }
private:
    std::string mStr;
};

int main()
{
    Something* something;
    {
        std::string temp = "Testing.";
        something = new Something(temp);
    }

    std::cout<<something->str()<<"\n";
    delete something;
    return 0;
}
#包括
#包括
分类
{
公众:
Something(constd::string&str):mStr(str){}
常量std::string&str()常量
{
返回mStr;
}
私人:
std::字符串mStr;
};
int main()
{
某物,某物;
{
std::string temp=“测试。”;
某物=新某物(临时);
}

std::cout将
temp
变量的内容复制到
mStr
。该代码有效。

temp
变量的内容复制到
mStr
。该代码有效。

数据成员
mStr
的类型为
std::string
(它是一个对象,不是引用)


因此,当您在构造函数的初始化列表中初始化它时(通过
:mStr(str)
),通过引用传递的参数被复制。在您的示例中,只有初始化会导致复制:如果删除了初始化,则不会复制任何副本。

数据成员
mStr
的类型为
std::string
(它是一个对象,而不是引用)


因此,当您在构造函数的初始化列表中初始化它时(通过
:mStr(str)
),通过引用传递的参数将被复制。在您的示例中,只有初始化会导致复制:如果删除了初始化,则不会复制任何副本。

您是正确的,只是缺少mStr(str)复制str的事实。此副本将在~Somthing()中销毁

您是正确的,只是您缺少一个事实,即mStr(str)生成str的一个副本。此副本在~Somthing()中被销毁

要正确测试该行为,您不应该使用std::string,而应该使用您自己编写的类的对象。您正在测试std::string,而不是当前的行为!要正确测试该行为,您不应该使用std::string,而应该使用您自己编写的类的对象。您正在测试std::string,而不是当前的行为d构造函数体中的赋值会导致复制吗?构造函数体中的赋值会导致复制吗?