对私有类的成员函数数的访问如何进行?

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&为什么在构造函数里面可以直接访问另一个同类对象的私有成员?
class Test{
Test(const Test& other)
this-&value = other.value;
int value;
很好奇为什么在构造函数里面可以直接访问另一个对象的私有成员,虽然他们是同一个类。
按投票排序
成员 accessibility 是类的性质,不是对象的性质。
一个类当然可以访问所有自己的类的实例的私有成员了。这可以引申出若干问题,譬如说:当Fuck继承自Bitch的时候,为什么Fuck的函数可以访问Fuck实例其中定义在Bitch里面的私有成员,却不能访问Bitch实例中的私有成员?friend class Fuck&T&;和template&typename T&friend class F的区别?等等
是同一个类就可以访问私有成员,拷贝构造函数不是特例。class C
C() : a(0) {}
void Test(const C& c)
cout && c.a &&
cout && a &&
类型上私有 而不是实例私有
没什么特殊原因,C++/Jave的访问控制就是设计成了class-level,而不是object-level。
因为这个可访问性是编译层面的。在一个类实现的时候,他必须对他自己的一切具有可控性,可见性。所以他的所有成员都不会对这个类的实现隐藏。而在底层,一个成员只不过是一个偏移量而已。所以答案是,编译器认为这样的方式合理。
首先可以回答,因为语言规范就是这么定义的。所以你也许是想问,为什么语言规范是这么定义的。忘了是哪本书上写的了,想在对象级别隔离私有属性的访问,实现起来有难度,又没有足够的必要,所以就这样了。印象中他说的是Java
同类成员不能私聊的话,就没办法定义equals方法了。
已有帐号?
无法登录?
社交帐号登录访问私有数据,访问方法的几点总结
1.虽然在类A的成员函数的参数是类B,但是这种访问类B的私有成员数据时错的。
2.在类A的成员函数的参数是类B,在类A中可以访问类B的成员函数。
3.如果类A想访问类B的数据成员怎么办?可以让类A成为类B友元类。
让类A成为类B的友元类后,既可以访问类B的私有成员,也可以访问类B的的成员方法。
==================================================================================================
4.虽然类A公有继承了类B,但是还是不能访问类B的私有数据成员,如果想访问,只能让类A的成员函数调用类B的成员函数,因为在类B的成员函数可以返回自己的私有成员数据。
==================================================================================================
5.让类B作为类A的数据成员,这样类A可以访问类B的成员函数,但是不能访问类B的私有数据成员。
总结与提高:
&一&一个类A如果想访问另外一个类B的成员函数,1)公有继承2)友元类3)把B作为A的数据成员4)在类A的成员函数的参数为类B的对象。
&二&一个类A如果想直接的访问类B的私有成员数据,1)友元类
&三&一个类A如果想间接的访问类B的私有成员数据,1)公有继承2)把B作为A的数据成员,然后访问B的成员函数3)在类A的函数参数中传递B的对象,然后按照方法2)去访问类B的数据成员。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。如何强制访问c++私有成员
前几天笔试adobe,出了这样一个题,当时只想到通过指针的偏移量来访问,但是由于对C++的类对象布局不是很有把握,就随便写了个答案,今天上百度搜了下,发现好几种方法,拿出来一起分享。&
&先看一个类 &
#include &stdio.h&
private: &
& & char *
& & A(): str("nothing"){};
int main() &
& & return 0;
如何输出a的私有成员str所指向的字符串"nothing"?可以任意添加代码,但不可以修改这个类。
&#9733;&#9733;方法一: &
在定义A前,加一句“#define private
public”。该方法可以欺骗编译器,让它把“private”当作“public”,然后就可以用“a.str”了。
达到了我们的目的,只可惜这个方法有点“左道旁门”。 &
&#9733;&#9733;方法二: &
a.str的地址就是a的地址,所以用“puts(*(char**)&a);”即可访问a.str。
&#9733;方法二变种: &
方法二不错,但如果str不是类的第一个成员变量,就会有点麻烦。比如,把A改成如下形式:
private: &
& & char *
& & A(): str("nothing"){};
d占一个字节,a.str的地址相对于a的地址,偏移量为1,可以这么用“puts(*(char**)((char*)&a+1));”。这看似不错,但没有考虑字节对齐
问题。为了能高效的访问变量,编译器可能会以空间换时间,采取字节对齐措施。字节对齐后,程序高效了,但对我们而言就麻烦了。str的地
址的偏移量未必是1,可以是2、4、8等,怎么才能获取a.str的偏移量呢?别急,我们可以给该方法打打补丁。
&#9734;方法二变种的补丁: &
在定义A前,加一句“#pragma
pack(1)”,这行代码可以让编译器按1字节进行对齐,这样以后就可以放心大胆地用“puts(*(char**)(char*)
&a+1));”了。 &
&#9733;&#9733;方法三: &
方法二的变种打了补丁后,也有了“左道旁门”的“嫌疑”。方法三就显得“高尚”多了。构造一个和A相似的类,但增加了一个非虚成员函数
,用来返回str的地址。 &
#include &stdio.h&
private: &
& & char *
& & A(): str("nothing"){};
private: &
& & char *
& & B(): str("nothing"){};
& & char *get()
int main() &
puts(((B*)(&a))-&get());
& & return 0;
&#9733;&#9733;方法四: &
和方法三一样,也是构造一个新的类。但有所不同的是,“private”变成了“public”。B的布局和A相同,即同名变量的偏移量相同。这样,
我们就可以把A实例的指针转化为B*类型,来访问str了。 &
#include &stdio.h&
private: &
& & char *
& & A(): str("nothing"){};
& & char *
& & B(): str("nothing"){};
int main() &
//或“puts(((B*)(&a))-&str);”
puts(reinterpret_cast&B*&(&a)-&str);
& & return 0;
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 类的成员函数 的文章

 

随机推荐