本系列为根据侯捷老师系列课程所编写的笔记。
1.C与C++的区别
C:面向过程语言,将函数和数据分开存储,没有提供足够的关键字,数据是全局的,各个函数都可以处理他们。
C++:面向对象语言,将数据和处理数据的函数封装成一个类,以类为单位创建对象。
2.头文件的防卫式写法
可能有许多程序要用到头文件,此防卫式写法可做到不会重复include同一个头文件。
#ifndef __COMPLEX__
#define __COMPLEX__
//头文件本体
#endif
3.class的声明
在使用的时候再指定类型,可使用模版来实现。
template<typename T>
class complex //class head
{//class body
public:
complex(T r = 0, T i = 0)
: re(r), im(i)
{}
complex& operator += (const complex&);//声明
T real() const {return re;}//定义
T imag() const {return im;}//定义
private:
T re, im;
friend complex& __doapl(complex*, const complex&);
};
4.inline(内联)函数
在class内部定义完成的函数默认为inline函数,例如complex类中的构造函数和real()、imag()为inline函数。
函数是否真的是inline函数由编译器在编译时决定。
5.访问等级
public:所有人皆可访问
private:只有class内部才能访问
protected:只允许class内部及其子类访问
6.构造函数
构造函数在创建对象时会自动调用。
构造函数名称必须与类的名称相同,且可以有参数,该参数可有默认值。构造函数没有返回值类型,因为它的任务就是创建对象。
构造函数可以有初值列,可在初始化时就设定变量的初值,效率比赋值高。
构造函数可以有很多个——重载
把构造函数放入private区域
当创建对象时需要调用构造函数,但当构造函数为private时,外界就不可调用构造函数,即无法创建对象。
用处:当该类不允许被外界创造对象,例如单例模式。
7.常量成员函数
在函数的参数列表后加const关键字,加在不会改变数据的函数后。
当函数使用const成员变量时,使用常量成员函数。
8.参数传递——pass by value vs pass by reference
pass by value:将数据整个传递
pass by reference:传递数据的引用,引用底层实现为指针,因此和传指针一样,在函数中修改变量会改变该变量在函数外的值。若是仅仅只需要该变量的值,可在形参前加const防止改变其值。
reference:传递着无需知道接受者是以reference形式接收。
complex& __doapl(complex* ths, const complex& r)
{
ths->re += r.re;
ths->im += r.im;
return *ths;
}
9.友元friend
友元函数可自由取得friend中的private成员。
相同class的各个object互为友元,即一个class的两个对象可相互取得对方的private成员。
10.操作符重载
- 成员函数
+=操作符作用在其左侧的变量上,若变量对+=有定义,则会调用+=的函数。
所有函数成员函数都有一个隐藏的参数:this,this是一个指针,指向调用该函数的调用者。
complex& complex::operator += (const complex& r)
{
return __doapl(this, r);
}
- 非成员函数
非成员函数中没有this指针。
为何不能返回reference?
因为返回的必定是个local object,在函数结束后即销毁,若pass by reference则在函数结束后找不到该object。
inline complex operator + (const complex& x, const complex& y)
{
//返回临时对象(匿名对象)
return complex(real(x) + real(y), imag(x) + imag(y));
}
inline complex operator + (const complex& x, double y)
{
return complex(real(x) + y, imag(x));
}
inline complex operator + (double x, const complex& y)
{
return complex(x + real(y), imag(y));
}
- 操作符重载<<
因为可能需要连续输出,所以返回ostream;因为需要修改os,所以os不能设定为const。
#include<iostream>
ostream& operator << (ostream& os, const complex& x)
{
return os << '(' << real(x) << ',' << imag(x) << ')';
}