一.绪论:
1.1 C++简史:
与C的关系:
被设计为C语言的继任者,C语言是一种过程型语言,程序员使用它定义执行特定操作的函数,而C++是一种面向对象的语言,实现了继承、抽象、多态和封装等概念。C++支持类,而类包含成员数据及操作数的成员方法(方法类似于C语言的函数)。
C++优点:
C++是一种中级变成语言,这意味着使用它既可以高级编程方式编写应用程序,又可以低级变成方式编写与硬件紧密协作的库。在很多程序员看来,C++既是一种高级语言,让他们能够开发复杂的应用程序,又提供了极大的灵活性,让开发人员能够控制资源的使用和可用性,从而最大限度地提高性能。
1.2 编写C++应用程序 :
生成可执行文件的步骤:
C++代码(通常包含在.CPP文本文件中)被转换为处理器能够处理的字节码。编译器每次转换一个代码文件,生成一个扩展名为.o或.obj的目标文件,并忽略这个CPP文件可能对其他文件中代码的依赖。解析这些依存关系的工作由链接程序负责。除将各种目标文件组合起来外,链接程序还建立依存关系,如链接成功,则创建一个可执行文件,供程序员执行和分发。
C++11新增的功能:
auto能够定义这样的变量,即编译器将自动推断其类型,这简化变量声明,同时又不影响类型安全。Lambda函数是没有名称的函数,能够编写紧凑的函数对象,而无需提供冗长的类定义,从而极大地减少了代码。C++11让程序能够编写可移植的多线程C++应用程序,同时确保它们遵守标准。这些程序支持并行执行范式,在用户升级到多核CPU以改善硬件配置时,其性能将相应提升。
二、C++程序组成部分:
C++程序由类、函数、变量及其他元素组成。
预处理器编译指令#include:
预处理器编译指令时向预处理器发出命令,总是以符号#打头。尖括号(<>)通常包含标准头文件(#include<iostream>)。
名称空间概念:
为避免添加限定符,可使用using namespace。
#include "test.h"
#include <iostream>
int test::main1() {
using namespace std;
cout << "Hello World"<< endl;
return 0;
}
int test::main2() {
std::cout << "Hello World" << std::endl;
return 0;
}
int test::main3() {
using std::cout;
using std::endl;
cout << "Hello World" << endl;
return 0;
}
C++函数:
C++函数与C语言函数相同。函数可将应用程序划分多个功能单元,并按选择顺序调用。函数被调用时,通常将一个值返回调用它的函数。
三、使用变量和常量:
变量能够将数据临时存储一段时间,而常量能够定义不允许修改的东西。
编译器支持的常见C++变量类型: 
使用sizeof确定变量的长度:
变量长度指的是,声明变量时,编译器将预留多少内存,用于存储赋给该变量的数据。变量的长度随类型而异。
使用typedef替换变量类型:
typedef unsigned int STRICTY_POSITIVE_INTEGER;
int test::main1() {
STRICTY_POSITIVE_INTEGER positiveInteger = 55555;
return 0;
}
常量:
常量类似于变量,只是不能修改。与变量一样,常量也是占用内存空间,并使用名称标识为其预留空间的地址,但是不能覆盖该空间的内容。
- 字面常量;
- 使用关键字const声明的常量;
- 使用关键字constexpr声明的常量表达式(C++11新增的);
- 使用关键enum声明的枚举常量;
- 使用#defind定义的常量(已屏蔽,不推荐)。
四、管理数组和字符串:
什么是数组:
- 数组是以系列元素;
- 数据中所有元素的类型都相同;
- 这组元素形成一个完整的集合。
动态数组:
#include <vector>
int test::main1() {
std::vector<int> dynArr(3);
dynArr[0] =365;
dynArr[1] =36;
dynArr[2] =35;
dynArr.push_back(20);
return 0;
}
五、使用表达式、语句和运算:
从本质上说,程序是一组按顺序执行的命令。这些命令的表达式和语句,使用运算符执行特定的计算或操作。
使用运算符:
运算福是C++提供的工具,能够使用数据对其进行变换、处理甚至根据数据做决策。
- 赋值运算符(=),左值通常是内存单元,右值可以使内存单元的内容;
- 加法运算符(+)、减法运算符(-)、乘法运算符(*)、除法运算符(/)和求模运算符(%);
- 递增运算符(++)和递减运算符(--):放在操作数时称为前缀递增或递减运算符;而放在操作数时,称为后缀递增或递减运算符。
- 相等运算符(==)和不等运算符(!=);
- 关系运算符:
- 逻辑运算符NOT、AND、OR、XOR:逻辑NOT运算用运算符!表示,用于单个操作数,将提供的布尔标记反转;逻辑AND运算用运算符&&表示,仅当两个操作数都为true时结果才为true;逻辑OR运算用||符号表示,只要有一个操作数为true,则结果为true;逻辑XOR(异或)有且只有一个操作数为true时,结果才为true,符号为^表示。
- 按位运算符NOT(~)、AND(&)、OR(|)、XOR(^):逻辑运算符和按位运算符之间的差别在于,按位运算符返回的并非布尔值,而是对操作数对应位执行指定运算的结果。
- 按位右移运算符(>>)和左移运算符(<<):移位运算符将整个位序列向左或向右移动,其用途之一是将数据乘以或除以2的N次方;
- 复合赋值运算符:
- 运算符sizeof确定变量占用的内存量:指出特定类型或变量的内存量,单位位字节。sizeof(variable)或sizeof(type)。
- 运算符的优先级:
六、控制程序流程:
- if...else条件控制;
- switch-case条件控制;
- 三目运算符?:条件控制;
- 不成熟的goto循环:将指令指针移到代码的特定位置,使用goto回过头再去执行特定语句。不推荐使用goto。
void test::main3() {
JumpToPoint:
std::vector<int> dynArr(3);
dynArr[0] =365;
dynArr[1] =36;
dynArr[2] =35;
dynArr.push_back(20);
goto JumpToPoint;
}
- while循环;
- do...while循环:需要将代码放在循环中,并确保至少执行一次;
- for循环;
- continue和break修改循环的行为。
七、使用函数组织代码:
1.函数原型是什么:
函数原型指出了函数的名称、函数接受的参数列表以及返回值的类型。
函数调用和实参:
函数声明中包含形参,调用函数时必须提供实参。
带默认值的函数参数:
参数包含默认值的函数,这种默认值可被用户提供的值覆盖。可以给出多个参数指定默认值,但这些参数必须位于参数列表的末尾。
递归函数——调用自己的函数:
递归函数必须有明确的退出条件,满足这种条件后,函数将返回,而不再调用自己。
2. 使用函数处理不同类型的数据:
并非只能每次给函数传递一个值,还可将数组传递给函数。可创建多个名称和返回值类型相同,但参数不同的函数。也可创建其参数不是在函数内部创建和销毁的;为此可使用在函数退出后还可用的引用,这样搞可在函数中操纵更多数据或参数。
函数重载:
名称和返回类型相同,但参数不同的函数被称为重载函数。
- 将数组传递给函数;
- 按引用传递参数;
微处理如何处理函数调用:
函数调用意味着微处理器跳转到属于被调用函数的下一条指令处执行。执行完函数的指令后,将返回到最初离开的地方。为实现这种逻辑,编译器将函数调用转换为一条供微处理器执行CALL指令,该指令指出了接下来要获取的指令所在的地址,该地址归函数所有。编译函数本身时,编译器将return语句转换为一条供微处理器的RET指令。
遇到CALL指令时,微处理器将调用函数后将执行的指令的位置保存到栈中,再跳转到CALL指令包含的内存单元处。
该内存单元包含属于函数的指令。微处理器执行它们,直到到达RET语句。 RET语句导致微处理器从栈中弹出执行CALL指令时存储的地址。该地址包含调用函数中接下来要执行的雨具的位置。这样微处理器将返回到调用函数,从离开的地方继续执行。
内联函数:
常规函数调用转换为CALL指令,这会导致栈操作、微处理器跳转到函数处执行等。而inline函数被调用时就地展开。将函数声明为内联的会导致代码急剧膨胀,在声明为内联的函数做了大量复杂处理时尤其如此。应尽可能少用关键字inline,仅当函数非常简单,需要降低其开销时,才使用该关键字。
lambda函数:
八、阐述指针和引用:
指针:
指针是存储内存地址的变量,与所有变量一样,指针也占用内存空间。指针的特殊之处在