继上篇的文章《Essential C++ 笔记(4):基于对象的编程风格(上)》,继续更新Essential C++ 笔记。
7、合作关系必须建立在友谊的基础上
任何class
均可以将其他函数或其他类指定为它的朋友(friend)。所谓的friend
就具备了和类成员函数相同的访问权限。在类的内部必须是将非成员函数设为朋友。
class Triangular {
friend int operator*(const Triangular_iterator &rhs);
};
class Triangular_iterator {
friend int operator*(const Triangular_iterator &rhs);
};
//类的外部定义
inline int operator*(const Triangular_iterator &rhs){
rhs.check_integrity(); // 可以直接访问类的私有成员
return Triangular_iterator::_elems[rhs.index()]; // 可以直接访问类的私有成员
}
可以先令A类与B类建立友元关系,让A类的所有成员函数称为B类的友元。
class Triangular {
//Triangular_iterator中的所有成员函数都是Triangular中的友元。
friend class Triangular_iterator;
};
8、实现一个Copy assignment operator(拷贝赋值运算符)
下面的代码属于默认的成员逐一赋值操作:
Triangular tri1(8), tri2(8, 9);
tri1 = tri2;
但对于第二节中的Matrix类,上述拷贝过程只是浅拷贝,我们需要的是深拷贝,这时需要一个拷贝构造函数和一个拷贝赋值运算符:
Matrix& Matrix::operator=(const Matrix &rhs){
if(this != &rhs){
_row = rhs._row;
_col = rhs._col;
int elem_cnt = _row * _col;
delete [] _pmat;
_pmat = new double[elem_cnt];
for(int ix = 0; ix < elem_cnt; ix++)
_pmat[ix] = rhs