在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;