Loading

侯捷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+=complexcout<<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));
}
posted @ 2021-08-30 11:45  traver  阅读(194)  评论(0编辑  收藏  举报