mar*_*h44 126 c++ reference class-members
这是一个简化的例子来说明这个问题:
class A {};
class B
{
B(A& a) : a(a) {}
A& a;
};
class C
{
C() : b(a) {}
A a;
B b;
};
Run Code Online (Sandbox Code Playgroud)
因此B负责更新C的一部分.我通过lint运行代码并且它围绕引用成员发出错误:lint#1725.这谈到了对默认副本和分配的关注,这是公平的,但默认的副本和赋值也很糟糕,所以那里没有什么优势.
我总是尽量使用引用,因为裸指针不确定地引入了谁负责删除指针.我更喜欢按值嵌入对象,但如果我需要一个指针,我在拥有指针的类的成员数据中使用auto_ptr,并将对象作为引用传递.
当指针可能为null或可能更改时,我通常只在成员数据中使用指针.有没有其他理由更喜欢指向数据成员的引用?
是否真的可以说包含引用的对象不应该是可赋值的,因为初始化后不应更改引用?
Kla*_*aim 141
我自己的经验法则:
Jam*_*kin 53
避免引用成员,因为它们限制了类的实现可以做什么(包括,如你所提到的,阻止了赋值运算符的实现),并且没有为类提供什么带来好处.
示例问题:
.运算符等),但表现得像指针(可以悬挂) - 所以例如谷歌风格指南不鼓励它Myk*_*yev 33
对象很少应该允许分配和比较之类的其他东西.如果您考虑使用"部门","员工","董事"等对象的某种商业模式,很难想象将一名员工分配给其他员工的情况.
因此,对于业务对象,将一对一和一对多关系描述为引用而不是指针是非常好的.
并且可能将一对或零关系描述为指针.
所以没有'我们不能分配'然后因素.
许多程序员只是习惯使用指针,这就是为什么他们会找到任何参数来避免使用引用.
将指针作为成员将强制您或团队成员在使用前反复检查指针,并带有"以防万一"注释.如果指针可以为零,那么指针可能被用作一种标志,这是不好的,因为每个对象都必须扮演自己的角色.
在一些重要的案例中,根本不需要可转让性.这些通常是轻量级算法包装器,便于计算而不离开范围.这些对象是引用成员的主要候选对象,因为您可以确保它们始终保持有效引用,并且永远不需要复制.
在这种情况下,请确保使赋值运算符(通常也是复制构造函数)不可用(通过继承boost::noncopyable或声明私有).
但是,正如用户pts已经评论过的那样,大多数其他对象也是如此.在这里,使用参考成员可能是一个巨大的问题,通常应该避免.
小智 6
由于每个人似乎都在制定一般规则,我会提供两个:
永远不要使用引用作为类成员.我从来没有在我自己的代码中这样做过(除了向我自己证明我在这个规则中是正确的)并且无法想象我会这样做的情况.语义太混乱了,而且它实际上不是为什么引用设计的.
除了基本类型或算法需要副本时,始终始终使用引用将参数传递给函数.
这些规则很简单,并且对我有利.我留下了使用智能指针(但请,而不是auto_ptr)作为其他人的类成员的规则.