模板查询,访问私有成员
template query, accessing private member
我指的是《用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数据成员一样访问相同类型的中的私有数据成员,但正如您所看到的,第二次比较为假,因为操作数不是相同类型的,因此违反了该类型的访问限制。 而且,我认为没有任何方法可以查看编译器生成的代码。(据我所知)
相关文章:
- 这是关于成员访问规则的正确摘要吗
- 为什么我在空指针错误(链表)中获取成员访问权限
- 成员访问是否在空指针上定义C++?
- C++ IDE 不会推断/自动完成对模板类中的 std::array 下标表达式的成员访问
- 为什么类成员数据必须是静态的才能被模板化类的模板化结构成员访问
- 为什么c++允许成员函数定义中实例的私有成员访问
- C/C++ 包含点的宏参数(成员访问运算符)
- 访问说明符(私有/公共/受保护)如何在内部工作(限制成员访问)?
- 如何将超类的受保护成员访问到其派生类. 如果已在派生类中声明了具有相同名称的函数?
- 内部类私有成员访问和封闭的友好性
- 通过 C++ 中的另一个结构成员访问结构
- 具体化 PRVALUES 成员访问的 decltype 行为不正确
- 常量表达式中的静态成员访问
- XVALUE来自类成员访问表达式
- 未经授权的私有类成员访问会产生编译时错误而不是运行时错误?
- 在 c++ 中,为什么 -> 被称为二进制中缀指针成员访问运算符?
- 如何访问模板参数的成员?“成员访问不完整的类型”
- 不明确的可变参数类成员访问
- C 受保护的成员访问
- 将typeID转换为静态成员访问(C )的命名空间