目标:
培养正规的、大气的编程习惯
以良好的方式编写C++ class 【Object Based(基于对象)】
学习Classes 之间的关系 【Object Oriented(面向对象)】
继承(inheritance)
复合(composition)
委托(delegation)
侯捷C++全套视频链接:/s/19PnDq2VuyonB0USk2ghXVA
提取码:xfr0
–来自百度网盘超级会员V1的分享
推荐书籍:C++ primer、Effective C++、STL源码剖析
文章目录
1.C++编程简介2.头文件与类声明2.1头文件声明2.2 防卫式声明2.3 类声明2.4 inline内联函数 3. 构造函数3.1构造函数初始化3.2构造函数的重载3.3模板简介 4.参数传递与返回值4.1单例简介4.2 常量成员函数4.3 参数传递 传值/传引用4.4 返回值传递 传值/传引用4.5 友元 5. 操作符重载与临时对象5.1 操作符重载5.2 临时对象 6.复习complex类实现1.C++编程简介
侯捷C++全套视频链接:/s/19PnDq2VuyonB0USk2ghXVA
提取码:xfr0
–来自百度网盘超级会员V1的分享
推荐书籍:C++ primer、Effective C++、STL源码剖析
2.头文件与类声明
2.1头文件声明
库中自带头文件#include <xxx>
自定义头文件#include "xxx"
2.2 防卫式声明
1.ifndef表示在文件内第一次没有定义时候,进行声明定义
2.在一个大的软件工程里面,可能会有多个文件同时包含一个头文件,当这些文件编译链接成一个可执行文件上时,就会出现大量“重定义”错误。
3.在头文件中使用#define、#ifndef、#ifdef、#endif能避免头文件重定义。
2.3 类声明
数据尽可能放在private中,函数绝大部分要放在public中
pubilc > protected > private(所有的数据都应该放在 private,打算被外界调用的函数应该是public)
2.4 inline内联函数
inline关键字用来定义一个类的内联函数,解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题。函数定义在构造函数body内部,自动声明为inline,即类中的成员函数缺省都是内联的,但能否内联要看编译器,在构造函数外部声明内联函数要加inline关键字
限制:inline只适合函数体内代码简单的函数,不能包含复杂的结构控制语句例如while、switch,并且不能内联递归函数。
inline函数仅仅是一个对编译器的建议,所以最后能否真正内联,看编译器的意思,它如果认为函数不复杂,能在调用点展开,就会真正内联,并不是说声明了内联就会内联,声明内联只是一个建议而已。
3. 构造函数
3.1构造函数初始化
构造函数名与类名相同,可以有参数,参数也可以有默认值,没有返回类型,用于创建对象
构造函数中,成员变量初始化中使用":"函数方式列表初始化性能比直接在构造函数中赋值要快,建议使用这种方式。
public:complex (double r = 0, double i = 0): re (r), im (i) //将构造函数的参数赋值给私有成员变量 初始化的过程中就赋值{ }//相当于public:complex (double r = 0, double i = 0){re = rim = i}
不带指针的类大多不用写析构函数(内存泄漏)
3.2构造函数的重载
可以有很多重名的构造函数,即构造函数重载重载real函数时,其实编译器会编译成两个函数,虽然同名但不重载黄色标注的构造函数定义将出现问题,与上面的构造函数存在冲突,在无参初始化该类对象时,因为第一个构造函数已经有参数默认初始化列表了,定义该类对象时可以不加入参数,这就产生了冲突。3.3模板简介
先不声明数据类型,调用的时候再全部替换,提高代码的复用性
4.参数传递与返回值
4.1单例简介
不允许被外界调用类,当需要调用的时候,用类里面声明的函数
采用关键字static,将构造函数ctor放在private中:设计模式-单例
4.2 常量成员函数
const关键字:成员函数中没有改变成员变量的操作,如get函数,建议在该方法声明处加入const关键字初始化类时,如果加入了const关键字,则该类不能被修改,只能读取属性,相应的,所调用的成员方法在定义时应该加上const关键字4.3 参数传递 传值/传引用
函数参数传递,如果不需要改变参数值,建议使用 const + 引用 减小开销,速度快尽量选择传引用作为函数参数构造函数初始化的特殊写法
能加const的地方 就需要加
数据尽可能放在private中,函数绝大部分要放在public中
参数尽量考虑用reference来传(
类型 名称&/名称&
) 也需要考虑是否加const返回值尽量考虑用reference来传(
名称&
)
4.4 返回值传递 传值/传引用
返回值的参数传递也建议尽量传引用
好处:传返回值时,无论是传值还是传引用,返回值只接收引用,即传参时无需关心是传引用还是值
不能传reference的情况:返回值是在函数内部新创建的变量,其引用是该函数的一个指向堆局部变量指针,该变量的地址会在函数调 用完成后销毁,则此时返回值不应使用传地址
对于临时变量也不能返回引用:例如 + 运算符的重载
创建临时对象:typename( xxx )
->int(i)
4.5 友元
友元函数可以自由取得private成员,不声明为friend的话,也可以通过函数来取得私有变量相同类的各个实例对象互为友元,可以通过彼此的内部方法调用传入参数的内部私有成员变量。
5. 操作符重载与临时对象
5.1 操作符重载
任何一个成员函数都有一个隐藏的this指针,不需要显式声明,但是可以使用,指向调用者,C2是调用者如上图所所示,在运算符重载过程中隐藏了this指针,该指针编译器会处理,使用者不能显式声明操作符重载时,返回值不能是void,单个操作时不会报错,但连续操作是由于没有返回值会出现问题如果使用point指针,传递者必须知道是用point指针类型
5.2 临时对象
没有开辟新的对象让虚数和实数相加,直接用临时对象返回,不能用引用传递
6.复习complex类实现
具体可看源码