将局部变量作为向量的成员传递给被调用者

时间:2014-11-07 17:39:44

标签: c++

我有这个:

#include <iostream>
#include <vector>

class B
{
    public:
    std::string s;

    B()
    {
        std::cout<<"constructing B"<<std::endl;
    }    
    ~B()
    {
        std::cout<<"destroying B"<<std::endl;
    }
};
class A
{
    private:
    void Do(std::vector<B>& v)
    {
        B b;
        b.s = "this is a test";
        v.push_back(b);
    }

    public:
    void Check()
    {
        std::vector<B> v;
        Do(v);
        std::cout<<v[0].s<<std::endl;
    }
};
int main()
{
    A a;
    a.Check();
}

问题:这很有效,所以显然编译器知道b不应该超出范围,但这是用v内部创建的对象填充向量Do的好方法吗? 以上的输出是

constructing B
destroying B
this is a test
destroying B

这是正确的,假设b被复制,那么旧的值被破坏并且更新的传递在向量中了吗?

2 个答案:

答案 0 :(得分:1)

向量存储本地对象b的副本。因此,相对于此局部变量的代码没有问题

答案 1 :(得分:1)

push_backb复制到为v创建的新元素中,然后在b返回之前销毁Do