代码之家  ›  专栏  ›  技术社区  ›  atomSmasher

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

  •  1
  • atomSmasher  · 技术社区  · 8 年前

    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);
    }
    
    1 回复  |  直到 8 年前
        1
  •  4
  •   Nir Friedman    8 年前
    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 将有一个悬而未决的参考。