本类对象的引用作为参数,可以直接访问其私有成员
昨天参加了完美世界的笔试,有一个题是写出C++中String类的构造函数,析构函数,拷贝构造函数和赋值函数。
题中给出了四个函数的接口,大致如下所示。
class String{ public: String(const char* str=NULL); String(const String &other); String& operator=(const String& other);
~String(void) {delete[] m_data;} private: char *m_data; // 用于保存字符串 };
当时一直想不明白在拷贝构造和赋值函数中,怎么获取参数的私有成员,导致这个题没答出来。
回来查了一下String类的实现才明白,封装性是对类外的操作来说的,在类内操作本类的一个对象时,可以通过该对象访问其私有成员,这种设计也是挺合理的,因为类是自己设计的,当然自己也就知道类的内部结构,所以没有必要对自己也进行类的“封装”。另有一种说法是:“同种类之间是友元关系”。
所以对于拷贝构造函数和赋值函数按下面方法写是没问题的。
inline String::String(const String &other) { if(!other.m_data)m_data=0; else { m_data=new char[strlen(other.m_data)+1]; strcpy(m_data,other.m_data); } } inline String& String::operator=(const String& other) { if (this!=&other) { delete[] m_data; if(!other.m_data) m_data=0; else { m_data = new char[strlen(other.m_data)+1]; strcpy(m_data,other.m_data); } } return *this; }