为什么在类的私有部分声明变量为引用
why we declare variable as a reference in private section of a class
我知道将变量声明为函数中的引用或指针是多么有用,但我只是想知道为什么我们在类的私有部分中将其声明为引用
例子class DoSomething
{
private : int& t_; // why not just 'int t;'
};
如果我们声明变量而不引用,并将类的对象定义为指针或引用会怎么样?这不是很好的实践吗?
如果将变量声明为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
Demo on ideone.
注意:这只是一个例子,说明你可以对int
的引用做什么。这并不意味着你应该做这样的事情而不需要特别小心,因为这样的隐藏引用会使你的代码更难阅读。
使用引用成员的原因有很多。一个来自标准库的例子是back_insert_iterator
,它保持对容器的引用(或指针),以便调用该容器的push_back
函数。
请注意,对于像这样存储指向另一个对象的引用或指针的任何类,您都需要像处理原始引用或指针一样小心。也就是说,您需要警惕悬空引用,并确保不会在引用的生命周期之后使用该引用。
当您在类中存储对变量的引用时,更改变量的结果是:
- 您可以在
DoSomething
的成员函数中更改变量,并使该更改在类外可见。 - 你可以改变
DoSomething
之外的变量,让这个变化在DoSomething
中可见。
我经常发现它在传递给标准库中某些函数的函子中很有用。
@BenjaminLindley已经给了你一个很好的例子。
我经常发现它在工厂模式中很有用,当使用存储在具体工厂中的数据创建具体产品时,但是数据太昂贵而无法复制。
我已经在实现函数接口的类中使用了它。这些类在下列情况下保存对其他数据的引用:
3.1。类需要访问数据,但复制数据的成本太高。
3.2。复制数据是没有意义的,或者复制是设计禁止的(如
std::ofstream
)。3.3。该类需要更新数据并使其对调用代码可见。
相关文章:
- 在疯狂的部分中声明变量
- 如何在C++中为高分辨率时钟声明变量?
- 在命名空间中声明变量,在 main 中定义它,使其对所有其他文件可见
- CUDA 的性能取决于声明变量
- 如何在不为其声明变量的情况下获取和使用常量值的地址?
- C++声明变量时自动类型推断而不初始化
- 在不同循环中多次声明变量的优点
- 奇怪的错误 C2131 与 constexpr 声明变量
- 是否可以在 "if" 语句中声明变量?
- 在python-ctypes中声明变量并传递给dll函数
- 在递归函数C++中声明变量
- 只有一个定义/声明时标头声明变量的多堆定义错误
- 奇怪的未声明变量编译器错误
- 我在C++程序中声明变量时遇到问题
- 在命名空间中声明变量
- C++ lambda 按值捕获,而无需更早声明变量
- 声明变量以保存字符串列表时的内存分配
- 如何声明C 变量应突变
- 为什么允许在开关语句中声明变量?但不是声明 初始化
- 在同一命名空间中声明变量和函数是否出错?[C++]