侯捷c++课程笔记: complex类
class complex
看了侯捷老师的课,透过c++标准库中complex类的实现,记录一些写c++需要注意的点
如有错误,请指出
防卫式头文件
在头文件的开头和结尾需要加上:
#ifndef
#define
...
#endif
防止头文件的重复声明
初始化列表
在类的构造函数的实现里,最好使用初始化类似定义初值
complex(double r = 0, double i = 0)
: re (r), im (i)
{ }
数据封装
为了体现类的封装,将数据成员全部定义为private,函数成员除了内部操作的函数,其余设为public
一般构造函数为public,在设计模式singleton中设为private
const 关键字
对于不修改数据的函数,应该在()和{}中间加const,如() const {}
double real() const { return re; }
这样做是因为类的使用者在定义常量,const classname 时,在调用类成员函数时,编译器会检查const 关键字
在传引用时,如果不希望函数内改变其值,可在变量名前加const
指针变量名前加const,const int* p1= &x;
不可以修改指针所指向对象的值,可以改变指针的指向
指针变量名后加const,int* const p2=&y;
不可以改变指针的指向,可以修改其指向对象的值
操作符重载
可以设计为成员函数或者全局函数
由于c++的操作符总是作用于左边,所以+和<<必须设计为全局函数(int+complex和cout<<complex)
同时对于+=和cout重载为支持complex+=complex+=complex
和cout<<complex<<complex
的语法 需要将返回值设计为引用而不是void
complex& operator += (const complex&);
ostream&
operator <<(ostream& os, const complex& x)
{
return os << '(' << real(x) << ',' << imag(x) << ')';
}
友元
在类body内定义一个函数,前面加上friend关键字,将其定义为该类的友元,可以访问私有数据
friend complex& __doapl(complex*, const complex&);
this指针
在调用成员函数时,调用者将指向其自身object的指针作为隐藏参数传递给函数
参数名为this,不需要在函数的参数列表中定义
inline complex&
complex::operator+=(const complex& r)
{
return __doapl(this, r);
}
传值 传引用
传值是整个复制一遍,而传引用的底层机制类似于指针,用法也类似。
在对象较大时,传引用的速度要更快。在传参和返回时,要尽可能的使用传引用
在返回时,有一种情况不能传引用,那就是返回的变量为local variable本地临时变量
这种变量在函数执行完后作用域就结束了,使用传引用会造成错误
inline
在函数声明或定义前加inline,建议编译器将其作为inline函数,运行更快
但只是建议,不一定能实现,比较简单的函数可以,具体的标准还没了解
临时对象
在返回一个实例时,可以使用临时对象的语法:类名()
临时对象的作用域仅为该条语句,所以一般用在函数返回时使用
inline complex
operator + (const complex& x, const complex& y)
{
return complex(real(x) + real(y), imag(x) + imag(y));
}