C++面向对象高级开发笔记
最近在rs上下了侯捷老师的C++网课,感觉非常不错
ctor放在private里(Singleton模式)
常量成员函数
注意标黄的const
不会改变数据内容的函数,马上加上const
因为要考虑这种情况,上述类定义了一个复数。如果我们上面没有写const
,则下面的写法就会报错,因为这个函数可能会对类的属性进行改变。
参数传递(pass by value & pass by reference)(尽量by reference)
尽量不要pass by value
,因为pass by reference
更快。
传引用可能会引起改变,如果不希望对方改变,则加const
返回值的传递(pass by value & pass by reference)(尽量by reference)
return by reference语法分析
传达者无需知道接收者是以reference
的形式接收。(Reference的好处)
为什么要返回一个引用?
因为需要应对右边的情况,该式从右向左加
友元函数friend
相同class的各个obj互为友元
注意
- 数据放在
private
中- 参数尽可能pass by reference
- return reference
- 尽量去用初始列
class body外的各种定义(definations)
1.函数+const
第一个参数没有const
,第二个有,因为数据加之后的结果将储存在第一个参数给定的指针对应的对象中。
2.全域函数
imag是一个global函数(全域函数)
操作符重载
一、操作符重载-1,成员函数(operator overloading)有 this
之所以写一个__doapl
,可能是为了让其他class也去用。
二、操作符重载-2,非成员函数,无this(非原地操作)
三、正相、反相
四、==
和!=
inline bool
operator == (const complex& x,
const complex& y)
{
return real (x) == real (y)
&& imag (x) == imag (y);
}
inline bool
operator == (const complex& x, double y)
{
return real (x) == y && imag (x) == 0;
}
inline bool
operator == (double x, const complex& y)
{
return x == real (y) && imag (y) == 0;
}
五、共轭(共轭不是运算符),<<
inline complex
conj (const complex& x)
{
return complex (real (x), -imag (x));
}
#include <iostream.h>
ostream&
operator << (ostream& os, const complex& x)
{
return os << '(' << real (x) << ',' << imag (x) << ')';
}
<<
绝对不能写成成员函数
{
complex c1(2, 1);
cout << conj (c1);
cout << c1 << conj(c1);
}
结果:
思考上面的这行代码,想想为什么重载<<
时要return
ostream&
cout << c1 << conj(c1);
显然,这里时从左向右运算
temp object(临时对象)(TYPENAME())
上述三个函数的返回值绝不可是return by reference,因为他们返回的必定是local object
临时对象:complex(..., ...);
一般很少用,标准库中很多
小结
设计一个class
要注意什么?
-
initialization list要会用
complex (double r = 0, double i = 0) : re(r), im(i) { }
-
函数该加
const
就加 -
参数传递尽量考虑
pass by value
-
数据尽可能放到
private
中 -
函数尽可能放到
public
中
friend
- 可以是函数也可以是类
- 同一个类下的obj互为友元
class body外的各种定义(definations)
运算符重载
- 可以写为成员函数,也可以写为非成员函数
<<
只能写为非成员函数- 注意return by value还是return by reference