将字段(在类中)定义为引用有什么缺点?

时间:2018-06-27 16:21:16

标签: c++ c++11 reference

将字段(在类中)定义为引用有哪些缺点?
例如:

template <typename T>
class A {  
    T& x; 
public:  
    //....
}

此外,在定义引用成员时是否需要做一些特殊的事情?

2 个答案:

答案 0 :(得分:-1)

引用成员(无提示)破坏了值的语义,因为分配给引用不会重新指向引用。出于这个原因,有些人避免使用参考成员。

例如

int a = 1, b = 2;
int& r1 = a;
int& r2 = b;
r1 = r2; // does a = b
// r1 still refers to a
// r2 still refers to b

答案 1 :(得分:-2)

让我们看一个示例,该示例显示了将引用作为类的成员的缺点:

template <typename T>
A<T>::A(T & obj) : x(obj) {} // constructor (this would probably go in the header)

int main(void) {
    int * num = new int;
    *num = 42;
    A<int> a(*num); // a.x references *num
    delete num; // uh-oh, *num is no longer valid and a.x cannot rebind
    return 0;
}

当然,如果将成员变量声明为T x;,则x将是T的另一个实例,即使在{之后,也可以存储*num的数据副本{1}}被删除。