1 C++编程简介
目标
- 培养正规的、大气的编程习惯
- 以良好的方式编写C++ class,Object Based(基于对象)(面对的是单一class的设计)
class without pointer members - Complex
class with pointer members - String - 学习Classes之间的关系,Object Oriented(面向对象)(面对的是多重classes的设计,classes和classes之间的关系)
继承(inheritance)
复合(composition)
委托(delegation)
C++的历史
- B语言
- C语言
- C++语言(1983)
(new C -> C with Class -> C++)
C++演化(成为标准)
- C++ 98 (1.0)
- C++ 03 (TR1, Technical Report 1)
- C++ 11 (2.0)
- C++ 14
书籍推荐
语言基础:
《C++ Primer(5th)》《The C++ Programming Language(4th)》
专家经验:
《Effective C++ 55 - Specific Ways to Improve Your Programs and Designs(3th)》
标准库:
《The C++ Standard Library》 《STL源码剖析》
2 头文件与类的声明
2.1 C vc C++,关于数据和函数
C语言中数据是全局的,各个函数都可以访问数据,有可能出现问题;
C++思路是将数据和处理数据的函数封装在一起成为class。
函数来处理数据。
2.2 C++ program代码基本形式
包含标准库使用尖括号,不必关注头文件路径
不同平台的后缀名可能不同
2.3 Header(头文件)中的防卫式声明
受过正规训练 😃 进入业界做大东西好东西 😃
头文件可能被多个文件包含可能被包含多次
2.4 Header(头文件)的布局
2.5 class的声明(declaration)
- 实部和虚部类型为double
- class template(模板),避免因类成员不同导致写多个重复的类(如成员为int的类、成员为double的类、成员为float的类),其中的T可以为任何字母一般为T
2.6 inline (内联)函数
内联速度会更快(???)
某些情况下即使写成inline,编译器也不会处理为inline,如函数很复杂。写成inline只是“建议”,是否inline由编译器决定。class body内的函数定义会自动inline(候选),class body外的函数内联需要加inline。
2.7 access level(访问级别)
数据部分为private
2.8 constructor(ctor,构造函数)
变量的设置有两个阶段,一个是初始化,一个是赋值,构造函数函数体中对成员变量进行赋值(assignments)错过了初始化的阶段,时机更晚效率更低。
像复数这样不带指针的类中大多不需要写析构函数。
- 构造函数可以有很多个 - overloading(重载 )(多个相同名称的函数,参数不同)
编译器会把同名的重载函数编译成不同名称的符号
参数有默认值的构造函数会和默认构造函数发生冲突,不能同时存在(complex(double r = 0, double i = 0)
和complex()
),因为不给参数的构造方式(complex c1;
和complex c2();
)会存在问题。
- 构造函数可以放在private区域
不允许外界通过构造函数创建对象
SIngleton(单例模式) - 设计模式
2.9 member functions (成员函数)
- const member functions(常量成员函数),在函数后加const
不会改变类的数据 vs 会改变类的数据, 前者则需要将函数声明为常量成员函数。
不会改变数据的成员函数如果不加const,那么常量类型的对象访问该成员函数时编译会出错(const对象调用非const函数)。
2.10 参数传递:pass by value vs pass by reference (to const)
传值,整个数据传过去,压栈,尽量避免传值减少开销
C语言可以传指针
C++规定了传引用(类似于传指针速度,但是比指针更漂亮:-)),尽量传引用(字符类型(1byte)可以直接传值)
参数传引用并且用const修饰,避免函数修改该参数,如果函数内部修改了该函数编译器会报错。
如果不用const修改,那就是希望函数能够修改该参数。
2.11 返回值传递:return by value vs return by reference (to const)
返回值的传递也尽量传引用(如果可以)
2.12 friend(友元)
朋友可以来拿我的“钱”(数据)😃
朋友打开封装的大门,但是如果通过函数间接访问数据速度会慢一些
- 相同class的各个objects互为friends(友元)
截图中在类外部直接访问数据,看似打破了封装,但是成立
一个好的类 - 构造函数初始化列表
- 数据private
- 引用方式传参数
- 引用方式返回(如果可以)
- 成员函数加const
- …