像Java一样管理对象:T&形式仅仅用在参数传递

类的对象为了关联/包含一个T类型的instance,若成员变量包括T*/ T&, 这种设计叫做“aggregation”(聚合);而若采用T 形式,则称为"composition"(组合)

 1 //组合Composition
 2 class Man {
 3     Eye eye;
 4     Nose nose;
 5 }
 6 
 7 //聚合Aggregation
 8 class Man {
 9     Dog* dog;
10     House& house;
11 }

这个回答不错,百度知道:☛ 组合和聚合的区别?


怎样看待“引用类型作为类的成员变量”?

参考StackOverflow上此问题的回答:☛ Reference member variables as class members

 尤其是其中 manlio的回答

It's called dependency injection via constructor injection: (通过构造函数进行依赖注入)

class A gets the dependency as an argument to its constructor and saves the reference to dependent class as a private variable.

For const-correctness I'd write:

using T = int;

class A
{
public:
  A(const T &thing) : m_thing(thing) {}
  // ...

private:
   const T & m_thing;
};

but a problem with this class is that it accepts references to temporary objects:

T t;
A a1{t};    // this is ok, but...

A a2{T()};  // ... this is BAD.    //临时的匿名对象 属于 rvalue

It's better to add (requires C++11 at least):

class A
{
public:
  A(const T &thing) : m_thing(thing) {}
  A(const T &&) = delete;  // prevents rvalue binding
  // ...

private:
  const T &m_thing;
};

Anyway if you change the constructor:

class A
{
public:
  A(const T *thing) : m_thing(*thing) { assert(thing); }
  // ...

private:
   const T &m_thing;
};

it's pretty much guaranteed that you won't have a pointer to a temporary.

Also, since the constructor takes a pointer, it's clearer to users of A that they need to pay attention to the lifetime of the object they pass.


 

使用T&作为成员变量后:

①各个Contructor里必须对此T& t进行赋值。

②对象生成后就不能再对它进行赋值(=),因为引用不能二次赋值。

 

在此提问  ☛Should I prefer pointers or references in member data?  下, anon的回答:

As everyone seems to be handing out general rules, I'll offer two:

  • Never, ever use references as class members. I have never done so in my own code (except to prove to myself that I was right in this rule) and cannot imagine a case where I would do so. The semantics are too confusing, and it's really not what references were designed for. (引用& 最初就是为了 运算符重载时好看 而设计出来的)

  • Always, always, use references when passing parameters to functions, except for the basic types, or when the algorithm requires a copy.

These rules are simple, and have stood me in good stead. I leave making rules on using smart pointers (but please, not auto_ptr) as class members to others.

即:▶T& 形式仅仅用在 参数传递       ▶作为成员变量都用T* 形式 (绝不要用T&)

 

posted on 2018-06-17 18:56  王家恒  阅读(884)  评论(0编辑  收藏  举报

导航