C++ 面向对象高级设计
2021-05-04 23:45
986 查看
inline关键字
- 类声明内定义的函数,自动成为
inline
函数,类声明外定义的函数,需要加上inline
关键字才能成为inline
函数
构造函数
应该使用列表初始化
class complex { public: complex(double r = 0, double i = 0) : re(r), im(i){} //列表初始化 private: double re, im; }; class complex { public: complex(double r = 0, double i = 0){ re = r; im = i; } //赋值构造函数 private: double re, im; };
列表初始化更快,是理想的初始化方式。
常量成员函数
如果函数内不改变成员函数的值,则可以加上const修饰,更加的保险。
class complex { public: ... double real() const { return re; } double imag() const { return im; } private: double re, im; };
- 常量对象只能调用常量函数,上述成员函数如果不加const, 那complex类型的常量对象则不能调用。
参数的值传递和引用传递
应尽量使用参数的引用传递,避免了参数的复制且提高了效率。
返回值的值传递和引用传递
如果返回值是一个临时对象,那应该使用值传递,因为,一旦离开函数体,内部的临时对象就没了,相反,如果传回的对象是传入的对象的话,就使用引用传递,
ostream对象
对于重载的
ostream对象,一般返回值的参数是ostream&, 不是void&, 因为我们输出的形式一般是cout<<t1<<t2, 连续输出, 返回ostream& 对象,可以继续输出。
友元
友元函数不属于对象函数,所以不受public,private,protected的限制, 但可以随意访问类内的所有成员和函数。
同一个类内的各个对象互为友元,所以在类定义中可以随意访问其他对象的私有成员, 如下:
class complex { public: .... int func(const complex& parm) { return parm.re + parm.im; } private: double re, im; }; complex c1, c2; c1.func(c2);
操作符重载
有两种方式实现操作符的重载:1. 在类内声明public类型的函数实现成员函数重载。2. 在类外声明全局函数重载。
类内声明的操作符重载 +=
在类内声明的操作符重载一般是作用在左操作数上的, 例如:
class complex { public: ..... friend complex& __dopal(complex*, const complex&); complex& operator += (const complex& parm) { return __dopal(this, parm); } private: double re, im; }; inline complex& __dopal(complex* ths, const complex& r) { ths->re += r.re; ths->im += r.im; return *ths; }
complex c1(1, 2); c1 += 1; //重载 +=
对于类内重载的函数,其内隐含着一个this指针,可以像下面这样理解。
complex& operator += (complex* this, const complex& parm) { return __dopal(this, parm); }
- 注意重载的操作符 += 其返回的参数类型为complex&, 是因为可能不止一个两个对象相加,可能多个连加: c1 += c2 += c3;
- 注意不会改动的值或者对象尽量加 const 修饰。
在类外声明的操作符重载 +
类外声明的操作符重载,参数不局限于作用在左操作数,考虑左右操作数的不同形式,所以使用类外重载操作符。
complex c1(2,1); complex c2; c2 = c1 + c2; // 用法1: complex + complex c2 = c1 + 5; // 用法2: complex + double c2 = 7 + c1; // 用法3: double + complex
在类外声明函数重载 <<
与重载+的考虑方法类似,
<<操作符通常的使用方式是
cout<<c1而非
c1<<cout,因此不能使用成员函数重载
<<运算符.
考虑到形如
cout<<c1<<c2<<c3的级联用法,重载函数的返回值为ostream&而非void.
相关文章推荐
- 61条Java面向对象设计的经验原则,成为高级程序员必备
- Geekband_C++面向对象高级编程_第三周学习笔记
- C++面向对象思想(1):类的设计
- Geekband_C++面向对象高级编程_第六周学习笔记
- 61条Java面向对象设计的经验原则,成为高级程序员必备
- C++面向对象高级编程笔记01--GeekBand
- 《GeekBand》c++面向对象高级编程04
- C++面向对象高级开发No.1 - Class Without Pointer
- (GeekBand)C++面向对象高级编程(上)第一周笔记(2)
- C++面向对象高级编程(下)-Geekband
- 37条Java面向对象设计的经验原则,成为高级程序员必备
- C++面向对象高级开发No.2 - Class With Pointer
- 第十二章 C++ 面向对象设计方法概述
- C++面向对象课程设计-1
- C++面向对象高级编程(上)-Geekband
- GeekBand C++面向对象高级编程(上)一
- C++面向对象高级开发课程(第三周)
- 【C++程序设计】-面向对象设计实例
- C++面向对象高级编程(上)学习笔记
- 极客班GeekBand - C++面向对象高级开发 - 2