我知道将变量声明为函数中的引用或指针是多么有用,但我只是想知道为什么我们在类的私有部分将它声明为引用。
示例
class DoSomething
{
private : int& t_; // why not just 'int t;'
};
如果我们在没有引用的情况下声明变量,并将类的对象定义为指针或引用,那该怎么办?这不是好习惯吗?
答案 0 :(得分:3)
如果您将变量声明为int
,则其值将为"离婚"从它已初始化的变量。如果你把它作为参考,变量将是"跟踪"用于初始化的变量:
class demoRef {
int &r;
public:
demoRef(int& x) : r(x) {}
void show() {cout << r << endl;}
};
class demoCopy {
int r;
public:
demoCopy(int& x) : r(x) {}
void show() {cout << r << endl;}
};
int main() {
int x = 123;
demoRef dRef(x);
demoCopy dCopy(x);
dRef.show();
dCopy.show();
x = 456;
dRef.show();
dCopy.show();
return 0;
}
此代码生成以下输出:
123
123
456
123
注意:这只是您可以对int
的引用所做的事情的说明。这并不意味着暗示你应该做这样的事情而不要格外小心,因为像这样的隐藏引用会让你的代码更难阅读。
答案 1 :(得分:1)
您可能拥有参考成员的原因有很多。标准库中的一个示例是back_insert_iterator
,它将一个引用(或指针)保存到容器中,以便调用该容器的push_back
函数。
请注意,对于任何这样存储引用或指向另一个对象的类,您需要像使用原始引用或指针一样小心。也就是说,您需要警惕悬挂引用,并确保您不会在引用的生命周期内使用引用。
答案 2 :(得分:0)
当您在类中存储对变量的引用时,更改变量的结果是:
DoSomething
的成员函数中更改变量,并让该变更在课堂外可见。 DoSomething
之外更改变量,并在DoSomething
内显示该变更。关键问题是:它在哪里有用?
我经常发现它在传递给标准库中某些函数的仿函数中很有用。
@BenjaminLindley已经给你一个非常好的例子。
当使用存储在具体工厂中的数据创建具体产品但数据太昂贵而无法复制时,我经常发现它在工厂模式中很有用。
我在实现功能接口的类中使用过它。这些类在以下情况下保存对其他数据的引用:
3.1。该类需要访问数据,但复制数据的成本太高。
3.2。复制数据或设计禁止复制是没有意义的(例如std::ofstream
)。
3.3。该类需要更新数据并使其对调用代码可见。