模板查询,访问私有成员

template query, accessing private member

本文关键字:成员 访问 查询      更新时间:2023-10-16

我指的是《用c++思考》一书中提到的一个练习。下面的代码片段抛出一个错误的调用h.play,我理解,因为成员I是私有的。但是我也预料到同样的错误会出现在call me.play上。如果我注释调用h.play代码编译良好。为什么没有错误给我打电话。

玩吗?
class Buddy {};
template<class T> class My {
  int i;
public:
  void play(My<Buddy>& s) {
    s.i = 3;
  }
};
int main() {
  My<int> h;
  My<Buddy> me, bud;
  h.play(bud);
  me.play(bud);
}

谢谢。

[Edit]是否有一种方法可以查看编译器为

生成的代码
My<int> h and 
My<Buddy> me 

?

成员对于具有相同类型的另一个对象的实例总是"public"的。

表示My<Buddy>实例(如me)可以访问其他My<Buddy>实例(如bud)的私有成员。

请记住,My<int>My<Buddy>是完全不同的类型,因此它不能访问这些成员。

因为play方法被定义为引用My<Buddy>而不是引用My<T>,所以在My<Buddy>的另一个实例上调用时,有效的类是相同的类型。因此private成员是可访问的。

与那些假装拥有强大的静态类型系统和泛型(看看你的Java)的语言不同,c++允许你基于模板化的类型的形参(形参通常是类型)来消除静态参数类型(模板类型)的歧义。

注意:您还可以使用派生(动态/晚绑定)类型作为静态参数化类型的参数,但在此场景中不相关。

也就是说,在c++中:

  • typeid(me) == typeid(bud)将为TRUE
  • typeid(h) == typeid(me)将为FALSE

,即使类型"My"是相同的。

可以像访问public数据成员一样访问相同类型的中的私有数据成员,但正如您所看到的,第二次比较为假,因为操作数不是相同类型的,因此违反了该类型的访问限制。

而且,我认为没有任何方法可以查看编译器生成的代码。(据我所知)