2012-05-20
Chapter09
1、复制构造函数浅复制时的隐患
若对象中有指针成员,则当对象作为形参传入时
例如void myFun(Spreadsheet s)……
Spreadsheet s1(5,3);
myFun(s1);// s1与s中的指针成员指向同一块内存(s是由s1通过复制构造函数生成的),当myFun()结束时,会释放s,则s指针成员所指向空间释放,导致s1的指针成员指向的空间释放,即s1的指针成员指向一块已经释放的内存。
2、赋值运算符浅复制时的隐患
Spreadsheet s1(2,2),s2(4,3);
s1=s2;
则s1,s2中的指针成员指向了同一块内存(s1的),导致s2的指针成员原来所指向的内存成了孤儿内存
∴重写赋值运算符注意的三点
1,检查自赋值情况。2,删除原来所指向的内存,并用rhs的值重新分配内存。3,返回(*this),即对象的引用
3、也可将复制构造函数与赋值运算符设为私有(不必实现),禁止用户这么做(比如数组类)
private:
Spreadsheet (const Spreadsheet &src);
Spreadsheet &operator=(const Spreadsheet &src);
4、静态数据成员:一个与类关联而不是与对象关联的数据成员
会默认初始化为0,在函数与方法体之外进行初始化
int Spreadsheet::sCounter=0; //初始化
5、const数据成员:通常是静态的
尽可能用static const 取代全局变量
∵是static ∴必须在源文件中为其声明空间(方法体外)
如 const int Spreadsheet::MaxValue=100;
另外,C++允许在类文件中声明这些变量的同时为其赋值
class Spreadsheet
{
public : static const int MaxValue=100;
}
6、静态方法:方法应用于整个类,而不是单个对象
∴并不是在一个特定的对象上调用,即没有this指针
不能在静态方法中访问非静态成员
在类中像调用常规函数一样调用静态方法。
若声明为public,则在类外可这样调用
string str=Spreadsheet::doubleToString(5);
7、const方法
如果有一个const对象或者对const对象的引用,编译器不允许该对象调用任何方法(防止修改数据成员),除非是const方法
例如:double getValue() const; //类定义中,即头文件中
double SpreadsheetCell::getValue() const
{ return mValue; //方法定义中,即源文件中
}//const不能修改数据成员,否则编译器报错
非const对象可调用非const、const方法
const对象只能调用const方法
8、关键词mutable
在const方法中,编译器不允许修改普通数据成员,但可在const方法中修改mutable数据成员
如在类定义中:mutable int NumberAccess;
则可在const方法中修改NumberAccess的值
9、函数重载:补遗
可以编写两个同名且参数相同的方法,一个声明const,一个不声明
若提供const对象,调用const方法,反之亦然
10、内联
法一:在类定义中inline声明,方法定义中实现
法二:类定义中直接写出其方法定义,即在类定义中展开代码,无需关键词inline
11、友元
类可以将其他非成员函数声明为友元,可以访问protected、private成员和方法
类的内部会暴露给其他类或函数,破坏抽象原则
所以,在有限的情况下(如运算符重载)使用友元