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

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

我正在使用 C++ 实现链表,我对原始数据的生命周期很好奇。假设一个调用程序使用以下构造函数创建一个新的 ListNode。我担心的是,如果数据成员赋值不是值的拷贝,则原始变量可能会很好地超出范围,从而留下未定义的行为。

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

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

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

list_node.hpp

template <typename T>
class ListNode
{

friend class List<T>;

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

private:
   T data;

};

list.hpp

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

list.cpp

void List<T>::insert_at_front(const T &value)
{
   ListNode<T> *new_node_ptr = get_new_node(value);

   ...
}

ListNode<T> *List<T>::get_new_node(const T &value)
{
   return new ListNode<T>(value);
}

最佳答案

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,因此如果传入的局部变量超出范围,它是“安全的”。第二类只是获取引用。实际上,这就像持有对传入变量的引用。因此,如果传入的变量超出范围,则 Foo2 将有一个悬空引用。

关于c++ - 通过构造函数传递的引用定义类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40186178/

相关文章:

c++ - 包含 C++ 源文件中的 Obj-C++ header

c++ - 好友类 'has no member named...'

Ruby 字符串通过引用函数参数传递

c++ - 在 C++ 中仅使用堆栈的后果

c++ - 由于 opencv_xphoto,使用 opencv_contrib 在 Ubuntu 上进行 OpenCV 制作失败

c++ - read、readsome、get 和 getline 之间有什么区别?

c++ - 避免无意中复制对象——可用的技术

java - 为什么 Java 没有条件与和条件或运算符的复合赋值版本? (&&=, ||=)

c++ - 在 C++ 的析构函数中调用 delete[]

c++ - 我的解决方案有什么问题?