关于拷贝构造函数和赋值操作重载函数访问类的私有成员有关问题
关于拷贝构造函数和赋值操作重载函数访问类的私有成员问题
看下面的类:
这里char* m_data 是私有成员变量,但是为什么在拷贝构造函数和赋值操作重载函数中可以直接访问这个变量?虽然说这是同一个类中的,但是我们做赋值构造类的时候,是在类外部就行构造和赋值,比如:
char* data ="this is a string";//初始化
CString str(data);//调用构造函数
CString strTemp(str)//调用拷贝构造函数,这里str相对strtrmp来说是一个外部变量(我认为和char* data 一样,应该是独立与strtemp存在的),它们在内存中应该有不同的拷贝,但是为什么这里的strtemp可以访问str的私有变量???
------解决方案--------------------
c++的限定符是限定类的,不是限定对象的,只要是类型相同就能相互访问。
------解决方案--------------------
注意到拷贝构造函数和赋值操作重载函数前面都有String::,即都是String类的成员函数,访问控制是通过类来进行的,即在本类或者其友元内都可以访问私有成员,即使m_data也可以扩展为this->m_data,也是通过对象来访问的
------解决方案--------------------
public, private, protect是针对类型的,同一种类型间可以直接访问的
------解决方案--------------------
我见过的语言里面如果限定的都是限定类外部对类的访问权限,还没见过限定对象外部对对象访问权限的。两个是同类型的,因此可以直接访问,但是需要指定一下是哪个对象。
------解决方案--------------------
------解决方案--------------------
实际上是成员函数在访问私有成员,只不过是通过对象进行的.
------解决方案--------------------
友元就像是个后门一样,是破坏封装的典型,但话说回来,友元也得在类里主动声明
------解决方案--------------------
这样的确破坏了OO设计。但提供这样的机制并不是C++的错,自己这样做那是自己设计上的问题,或是迫于某种需要。就像比较敏感的goto语句一样。
------解决方案--------------------
看下面的类:
- C/C++ code
class CString { public: String(const char *str = NULL); String(const String &other); ~String(void); String & operator =(const String &other); private: char *m_data; }; String::~String(void) { delete[] m_data; } String::String(const char *str) { if(str==NULL){ m_data = new char[1]; *m_data = '\0'; } else { int length = strlen(str); m_data = new char[length+1]; strcpy(m_data, str); } } String::String(const String &other) { int length = strlen(other.m_data); m_data = new char[length+1]; strcpy(m_data, other.m_data); } String & String::operator =(const String &other) { if(this == &other) return *this; delete [] m_data; int length = strlen(other.m_data); m_data = new char[length+1]; strcpy(m_data, other.m_data); return *this; }
这里char* m_data 是私有成员变量,但是为什么在拷贝构造函数和赋值操作重载函数中可以直接访问这个变量?虽然说这是同一个类中的,但是我们做赋值构造类的时候,是在类外部就行构造和赋值,比如:
char* data ="this is a string";//初始化
CString str(data);//调用构造函数
CString strTemp(str)//调用拷贝构造函数,这里str相对strtrmp来说是一个外部变量(我认为和char* data 一样,应该是独立与strtemp存在的),它们在内存中应该有不同的拷贝,但是为什么这里的strtemp可以访问str的私有变量???
------解决方案--------------------
c++的限定符是限定类的,不是限定对象的,只要是类型相同就能相互访问。
------解决方案--------------------
注意到拷贝构造函数和赋值操作重载函数前面都有String::,即都是String类的成员函数,访问控制是通过类来进行的,即在本类或者其友元内都可以访问私有成员,即使m_data也可以扩展为this->m_data,也是通过对象来访问的
------解决方案--------------------
public, private, protect是针对类型的,同一种类型间可以直接访问的
------解决方案--------------------
我见过的语言里面如果限定的都是限定类外部对类的访问权限,还没见过限定对象外部对对象访问权限的。两个是同类型的,因此可以直接访问,但是需要指定一下是哪个对象。
------解决方案--------------------
------解决方案--------------------
实际上是成员函数在访问私有成员,只不过是通过对象进行的.
------解决方案--------------------
友元就像是个后门一样,是破坏封装的典型,但话说回来,友元也得在类里主动声明
------解决方案--------------------
这样的确破坏了OO设计。但提供这样的机制并不是C++的错,自己这样做那是自己设计上的问题,或是迫于某种需要。就像比较敏感的goto语句一样。
------解决方案--------------------