(转帖)关于访问同类引用参数的私有变量的疑问

#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

posted on 2011-02-22 16:05  ltang  阅读(469)  评论(0编辑  收藏  举报

导航