#include <iostream>
using namespace std;
class T
{
public:
T(){a = 11;}
int Get() const{return a;}
private:
int a;
};
class Test
{
public:
Test(int a):m_a(a){}
Test(const Test &t){m_a = t.m_a;}? //拷贝构造函数,通过同类型的引用参数访问私有变量
Test& operator=(const Test &t)???//赋值操作函数,通过同类型的引用参数访问私有变量
{
m_a = t.m_a;
}
//Test(const T &t){m_a = t.a;}????//此语句出错,不能访问T类型的私有成员?Test(const T &t){m_a = t.Get();}?//这个实现可以
void Print() const
{
cout<<"m_a:"<<m_a<<endl;
}
private:
int m_a;
};
解释如下:C++的限定符是限定类的,不是限定对象的,只要是类型相同就能相互访问。两个是同类型的,因此可以直接访问,但是需要指定一下是哪个对象。
所谓访问权限(如public,private),是对“类”来说的,不是对“对象”来说的,private访问权限是其它类不能访问,而非这个类的不同对象不能访问。
其实这也非常合理,类是自己设计的,当然自己也就知道类的内部结构,所以没有必要对自己也进行类的“封装”。
对于成员函数中允许访问对象的数据成员,一方面保证了安全性与封装性,另一方面提供方便的操作。
第一句话的解释,就是承认只有成员函数可以访问私有成员, 这里不涉及友元及派生。这样一来,安全性仍然得到了保证,也完成了封装工作。
对于第二句话,试想,如果都得靠接口来实现数据传送,那么操作是否极为不便? 既然处于成员函数中,已经保证了足够的安全和封装性,那么这里如果还得借助接口,就有些不合情合理了。作为对数据成员的灵活处理,设计者允许在成员函数中 访问对象的私有成员,为使用者提供了很大的方便。这同时也反映了语言的灵活性和原则性。
转自:http://securelvlan.spaces.live.com/Blog/cns!C60FD6EABDDFC877!1102.entry
转自:http://securelvlan.spaces.live.com/Blog/cns!C60FD6EABDDFC877!1102.entry