面向对象编程
C++写法复杂非常自由,咱们出手一定要像正规军出战
头文件与类的声明
C++代码基本形式
C++代码与C代码的区别
以complex函数为案例介绍
头文件中的防卫式声明用以防止重复定义,第二次再定义的时候就定义过了不会进入头文件
头文件的布局
template模板介绍
黄字部分用于告诉编译器类型可能不一样,T代表任意类型
构造函数
类的声明
inline(内联)函数
有大括号{}的才是函数
inline函数最终还是由编译器决定,所有inline函数都只是在告诉编译器尽量inline
访问级别
public是公开的
private是私密的,数据的部分应该是私密的
函数的部分,大部分应该是public,只有少数的应该是自己用放在private
如果外面要访问private内的数据必须通过public中设置的函数
被外界调用放public,否则放private
构造函数
构造函数的名称一定要和类的名称相同
构造函数可以拥有参数,参数可以有默认值
正规构造函数写法应该如下图所示
不可能直接调用构造函数
构造函数可以有多个(重载)
重载只是看上去同名,在编译器中不同
c1和c2是一样的,都可以调用两种构造函数,这种情况下,构造函数1和2不能同时存在
构造函数不能存在冲突情况
参数传递与返回值
构造函数放在private里
我不允许外界创建对象
外界只能通过getInstance()函数调用内部的构造函数,这种写法叫Singleton
常量成员函数
不会改变数据内容的马上加上const
例如:你只是把数据拿出来,那就需要加上const
如果const的对象调用非const函数,那函数内部就可能会改变对象的内容。这是矛盾的
参数传递
pass by value 和 pass by reference(to const)
pass by value是把整包都传过去字节是固定的,尽量不要pass by value(double r=0…)
我们应该习惯性的传递地址过去
所有传递数据都尽量使用传递引用
如果使用指针传递过去,但我不希望你改变,那可以使用pass by reference by const的方法,及图中const complex&的方法,如果改变则编译出错。
返回值传递
返回值的传递也尽量使用by reference
前面加&符号就是表示return by reference
友元
friend表示“朋友”可以进来拿private数据
(图内friend后面是函数的声明)
相同class的各个objects(对象)互为friends(友元)
class body 外的各种定义
运算外结果会改变,如果空间存在(有地方放)则使用return by reference
如果返回c1+c2但没有空间存在(没有地方放这个值)那就不能使用reference
方法调用完就相当于本体死亡,不能把内部得出的值使用传引用传出去
有地方放就传引用
操作符重载与临时对象
成员函数是面向对象的概念,所谓的成员函数,是指一个函数作为类的成员,公有成员、私有成员或者保护成员。
普通函数一般有两种传递方式,按类型传递和按值传递,也就是传指针和传返回值两种情况。成员函数一般是按类型传递,也即是传指针地址
普通函数可以随便调用,并且无法继承和封装,成员函数根据类的不同,可以进行继承,根据公有私有的不同,调用方式也不同
不是在函数本体内创建出来的即不是local objct,可以使用return by reference
操作符重载-1,成员函数
以+=二元操作符为例,+=是作用在c2上,如果c2有对+=做定义,编译器会找到并调用。c2调用+=,c2在成员函数就就是this
所有成员函数一定带有一个隐藏参数this,谁调用这个函数谁就是this。不必写也不能写this在代码中
__doapl由于其他对象可能会调用此函数,因此把他独立出来
return by reference语法分析
reference是引用
传递者无需知道接收者是以reference形式接受
在第一个函数中,传进来的操作数是一个指针,返回的是指针所指的东西即object,声明却说返回的是一个reference。
我返回的是一个value,接收端怎么接收无须在意
在第二个函数中,c1是一个value,函数用reference来接收c1。
如果只是c2+=c1;无需管返回值声明是什么,c1加到c2就执行完毕没有人管返回什么
但如果是c3+=c2+=c1;c2参与运算结束需要成为c3的运算对象,因此必须声明返回值为reference
class body外的各种定义
这一段里面存在的基本都是函数
类尽量用reference来传递,速度快。
操作符重载之二,非成员函数(无this)
临时对象
三个 都是return by value,在函数里面创建一个东西存放相加后的结果。此结果离开函数就直接死亡了所以不能把reference传出去
complex()相当于int(),就是创建临时对象存在结果然后马上返回,生命很短暂且没有名字,只是为了传递value而存在的。
图中黄色部分的生命在下一行就结束了,它们就是临时对象
图中是正负号
可以将上图函数转成void形式,但是返回值主要是保证可以持续输入例如cout<<c1<<conj(c1);
因为函数返回的并不属于local,所以优先使用return by reference
在上图函数中,可以使用c1<<cout;但是需要改变操作符重载函数的写法。在传入os的过程中,os是会被改变的因此不使用const
如果需要连续的输出,黄色的部分执行完毕后就需要一个能接收endl的输出即再次传回一个ostream对象
因为ostream是属于C++的库中的因此我们需要include这个库