通过构造函数传递的引用定义类成员

时间:2016-10-21 22:15:43

标签: c++ pass-by-reference assignment-operator class-members

我正在研究C ++中的链表实现,我很好奇原始数据的生命周期。让我们说一个调用程序使用以下构造函数创建一个新的ListNode。我担心的是,如果数据成员赋值不是值的副本,原始变量可能会有很大差异,超出范围会留下未定义的行为。

describe('<Header />', () => {
  it('valid component', () => {
    const wrapper = shallow(<ProfileHeader />);
    wrapper.setProps({ active: true });
    let checkbox = wrapper.find({ type: 'checkbox' });
    expect(checkbox.props().checked).to.equal(true);
    expect(wrapper.find('.backgroundColor')).to.equal('green');
    wrapper.setProps({ active: false });
    checkbox = wrapper.find({ type: 'checkbox' });
    expect(checkbox.props().checked).to.equal(false);
    expect(wrapper.find('.backgroundColor')).to.equal('red');
  });
});

当值传递给参数列表中的数据时,它会将数据定义为值的副本还是将类成员链接到传递给构造函数的原始变量?

编辑:为清晰起见添加更多信息

list_node.hpp

ListNode<T>::ListNode(const T &value) : data(value) {}

list.hpp

template <typename T>
class ListNode
{

friend class List<T>;

public:
   ListNode<T>(const T &);

private:
   T data;

};

list.cpp

template<typename T>
class List
{
public:
   void insert_at_front(const T &);
private:
   ListNode<T> *get_new_node(const T &);
};

1 个答案:

答案 0 :(得分:4)

struct Foo {
    Foo(const Bar& b) : m_b(b) {}

    Bar m_b;    
};

struct Foo2 {
    Foo2(const Bar& b) : m_b(b) {}

    const Bar& m_b;    
};

正如您所看到的,构造函数代码是相同的,但这两个类做了不同的事情。第一堂课将复制传递的Bar,因此它是安全的#34;如果传入的局部变量超出范围。第二类只是抓住了参考。实际上,这就像持有对传入的变量的引用。因此,如果传入的变量超出范围,那么Foo2将有一个悬空引用。