我正在使用 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/