关于拷贝构造函数和赋值操作重载函数访问同类引用参数的私有变量的疑问

#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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值