侯捷C++个人学习笔记Part1以Complex为例(面向对象)

面向对象编程

C++写法复杂非常自由,咱们出手一定要像正规军出战

头文件与类的声明

C++代码基本形式
代码基本形式
C++代码与C代码的区别
C++和C的区别
以complex函数为案例介绍
complex案例1
头文件中的防卫式声明用以防止重复定义,第二次再定义的时候就定义过了不会进入头文件
头文件的布局
complex案例2
template模板介绍
template模板
黄字部分用于告诉编译器类型可能不一样,T代表任意类型

构造函数

类的声明
类的声明
inline(内联)函数
有大括号{}的才是函数
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这个库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值