侯捷C++面向对象高级开发(上)笔记

1.头文件与类声明

1.1头文件声明

库中自带头文件 #include <xxx>
自定义头文件 #include "xxx"
在这里插入图片描述

1.2 防卫式声明

1.ifndef表示在文件内第一次没有定义时候,进行声明定义
2.在一个大的软件工程里面,可能会有多个文件同时包含一个头文件,当这些文件编译链接成一个可执行文件上时,就会出现大量“重定义”错误。
3.在头文件中使用#define、#ifndef、#endif能避免头文件重定义。
在这里插入图片描述

1.3 类声明

数据尽可能放在private中,函数绝大部分要放在public中
pubilc > protected > private(所有的数据都应该放在 private,打算被外界调用的函数应该是public)

1.4 inline内联函数

在这里插入图片描述
函数在class body本体里定义就是inline,在外面定义就不是inline,函数是inline function会速度很快,但有些function即使写上inline,编译器也不会做成inline,也没有能力做成inline,如果函数太复杂,就没有办法inline,函数简单,编译器就可能做成inline,程序员的inline只是对编译器的建议,是不是真的inline要由编译器决定,
inline关键字用来定义一个类的内联函数,解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题。

2.构造函数

2.1构造函数初始化

在这里插入图片描述

构造函数名与类名相同,可以有参数,参数也可以有默认值,没有返回类型,用于创建对象
构造函数和其他函数都可以有参数的默认值,初始列初值列只有构造函数有此功能,
构造函数中,成员变量初始化中使用":"函数方式列表初始化性能比直接在构造函数中赋值要快,建议使用这种方式。
因为一个变量的数值的设定有两个阶段,一个是初始化,第二个是赋值, 初值列属于初始化阶段,在大括号里赋值则表示放弃了初始化阶段,效率下降,

不带指针的类class大多不用写析构函数(内存泄漏)

2.2构造函数的重载

在这里插入图片描述
可以有很多重名的构造函数,即构造函数重载
编译器会把函数的名称,函数里的参数有几个以及参数的类型,编译成只有编译器可以看懂的内容,所以实际上不会有两个完全相同名称的函数同时存在,
重载real函数时,其实编译器会编译成两个函数,虽然同名但不重载
黄色标注的构造函数定义将出现问题,与上面的构造函数存在冲突,因为上面的构造函数有默认参数,有默认值,在无参初始化该类对象时,因为第一个构造函数已经有参数默认初始化列表了,定义该类对象时可以不加入参数,这就产生了冲突。

4参数传递与返回值

在这里插入图片描述
构造函数通常不能放在private里,因为不能被外界调用但是创建对象的时候又会调用,产生冲突,但是设计模式中的单例模式可以把构造函数放在private里,
单例模式表示外界只能有一份A,所以不允许外界创建,那一份A在static修饰的地方,外界调用的时候不能用传统的创建的方式,要通过A::的class 的函数getInstance去取得里面的他自己的那一份,

4.2 常量成员函数

在这里插入图片描述
在函数小括号的后面,大的花括号的前面加const,上图real()和imag()两个函数是要取得复数的实部虚部,所以这两个函数不会改变对象里的数据,只是拿出来而已,如果是写进去则改变了数据,
类class里面的函数分为会改变数据的和不会改变数据的这两种,不会改变数据内容的函数要加上const,const函数的意思是不改变数据的内容
const关键字:成员函数中没有改变成员变量的操作,如get函数,建议在该方法声明处加入const关键字
初始化类时,如果加入了const关键字,则该类不能被修改,只能读取属性,相应的,所调用的成员方法在定义时应该加上const关键字,否则编译器可能会报错,因为调用者用const修饰不能修改的创建的对象,但是调用的函数里可能修改值,

4.3 参数传递

在这里插入图片描述
引用在底部就是一个指针,所以传引用就相当于传递指针,速度很快,调用+=相当于把复数c1放入(const complex&)里,
最好所有的参数传递都传递引用,尽量不要传值,
传过去并且不希望对方改动,可以加const,如+=(const complex&)表示传一个复数过去,是引用的传递方式,但是在函数里不能修改这个内容,因为改动就会影响原来的部分,函数改了就会编译出错,

4.4 返回值传递

在这里插入图片描述
返回值的传递也尽量(如果可以)用引用,

4.5 友元

在这里插入图片描述
设计一个类:1.数据一定放在private里,2.参数尽可能以reference来传递,具体分析是否要加const,3.返回值尽量以reference来传递,4.在类的body里的函数应该加const修饰函数就应该加,如果不加const,使用者调用函数的时候编译器可能会报错 5.构造函数有初始化列表的语法,尽量用这个语法,

在这里插入图片描述
一个函数的运算结果,结果放的位置,情况1.函数创建一个地方让它放,情况2.放到某个已经存在的参数上,情况1返回的就是新创建出来的东西,会在函数结果后生命周期结束,此时不能返回引用reference

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值