C++对象访问私有变量释疑

  在Dov Bulka著的《提高C++性能的编程技术》中《引用技术》一章看到这样一段代码:

class MyString
{
public:
	MyString()
	{

	}
	
	MyString(char* str)
	{
		pData = new char[5];
		memset(pData, 0, 5*sizeof(char));
		strcpy_s(pData, 5, str);
	}
	MyString& operator=(const MyString& rhs);

	



private:
	char* pData;

	int i;

};

MyString& MyString::operator=(const MyString& rhs)
{
	if(this == &rhs) return *this;
	delete[] pData;
	int length = strlen(rhs.pData)+1;
	pData = new char[length];
	memcpy(pData, rhs.pData, length);

	return *this;
}

重载的operator=中直接使用rhs.pData访问类的私有变量,这在C#或者Java等语言中绝对是不允许的,但在C++中却能正常编译通过。前段时间在公司项目中也看到类似的代码,当时的代码原型是这样的:

void A::CopyTo(A& a)
{
	//i是类A的一个私有成员变量
	this->i = a.i;
}

这里也是用a来访问了私有成员变量。


总结起来就是说C++的访问权限修饰符public、protected、private只是限制了对象外部访问protected、private,并不限制类内部访问,也就是说上文中的operator=和CopyTo函数都是在类的内部(类的成员函数中)访问私有变量的。

但是像下面这样的代码是万万不能编译通过的:

MyString s("TWO");
//pData是MyString的私有成员变量
//编译不能通过!!
char* ps = s.pData;
	


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值