假设现在我们要实现一个复数类complex,在类的实现过程中探索良好的编程习惯。
① Header(头文件)中的防卫式声明
complex.h:
# ifndef __COMPLEX__
# define __COMPLEX__
class complex
{
}
# endif
防止头文件的内容被多次包含。
② 把数据放在private声明下,提供接口访问数据
# ifndef __COMPLEX__
# define __COMPLEX__
class complex
{
public:
double real() const {
return re;}
double imag() const {
return im;}
private:
doubel re,im;
}
# endif
③ 不会改变类属性(数据成员)的成员函数,全部加上const声明
例如上面的成员函数:
double real () `const` {
return re;}
double imag() `const` {
return im;}
既然函数不会改变对象,那么就如实说明,编译器能帮你确保函数的const属性,阅读代码的人也明确你的意图。
而且,const对象才可以调用这些函数——const对象不能够调用非const成员函数。
④ 使用构造函数初始值列表
class complex
{
public:
complex(double r = 0, double i =0)
: re(r), im(i) { }
private:
doubel re,im;
}
在初始值列表中,才是初始化。在构造函数体内的,叫做赋值。
⑤如果可以,参数尽量使用reference to const
为complex 类添加一个+=操作符:
class complex
{
public:
complex& operator += (const complex &)
}
使用引用避免类对象构造与析构的开销,使用const确保参数不会被改变。内置类型的值传递与引用传递效率没有多大差别,甚至值传递效率会更高。例如,传递char
类型时,值传递只需传递一个字节;引用实际上是指针实现,需要四个字节(32位机)的传递开销。但是为了一致,不妨统一使用引用。