gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:42:04 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com