在构造函数中使用参数的私有数据

时间:2018-03-02 09:16:37

标签: c++11

我正在阅读shared_ptr的工具。代码是:

template<typename _Tp, _Lock_policy _Lp>
  class __shared_ptr
  {
public:
template<typename _Tp1, typename = _Convertible<_Tp1*>>
      __shared_ptr(const __shared_ptr<_Tp1, _Lp>& __r) noexcept
      : _M_ptr(__r._M_ptr), _M_refcount(__r._M_refcount)
      { }
  ...
private:
  ...
  __shared_count<_Lp>  _M_refcount;
  };

问题:

_M_refcount是私有数据,为什么可以在_M_refcount(__r._M_refcount)中使用它 并且没有错误?

1 个答案:

答案 0 :(得分:2)

这是因为所有__shared_ptr模板化的类之间都是made friends

template<typename _Tp1, _Lock_policy _Lp1> friend class __shared_ptr;

如果以上是不够的,这里有一些介绍访问修饰符:)

private成员只能通过同一类中的名称访问。

E.g。这没关系:

class X
{
private:
    int a;

public:

   auto foo(X other)
   {
       return other.a; // OK
   }
};

在处理类模板时,您必须意识到从模板生成的每个类都是不同的类:

template <class T> class X
{
private:
    int a;

public:
    template <class U>
    auto foo(X<U> other)
    {
        return other.a; // OK iff U == T
    }
};

X<int> xi;
X<bool> xb;

xi.foo(xb); // not OK
xi.foo(xi); // OK

为了让上述代码适用于任何foo,所有X<T>类都必须是朋友:

template <class U>
friend class X;

这是__shared_ptr类模板中发生的事情。