文章目录
21天学通C++第八版笔记(一)
第三章
-
sizeof返回的是变量的长度,单位为字节。
cout << sizeof(bool) //返回1 << sizeof(char) //返回1 << sizeof(int) //返回4 << sizeof(float) //返回4 << sizeof(double) //返回8 << endl; //C++11中有int8_t和uint8_t,分别用于存储8位的有符号和无符号整数,当然还有16,32,64的整型
-
关键字const和constexpr
const
如果变量的值不应改变,就应将其声明为常量,这是一种良好的编程习惯。
constexpr
通过关键字 constexpr,可让常量声明像函数:
constexpr double GetPi() { return 22.0/7;}
在一个常量表达式中,可使用另一个常量表达式:
constexpr double TwicePi() { return 2 * GetPi();}
常量表达式看起来像函数,但在编译器和应用程序看来,它们提供了优化可能性。只要编译器能够从常量表达式计算出常量,就可在语句和表达式中可使用常量的地方使用它。在前面的示例中, TwicePi()是一个常量表达式,它使用了另一个常量表达式 GetPi()。这可能引发编译阶段优化,即编译 器将所有的 TwicePi()都替换为 6.28571,从而避免在代码执行时计算 2×22/7 的值。
GetPi()和 TwicePi()看起来像函数,但其实不是函数。函数在程序执行期间被调用,但 GetPi()和 TwicePi()是函数表达式,编译器将每个GetPi()都替换成了 3.14286,并将每个 TwicePi()都替换成了 6.28571。通过在编译阶段对 TwicePi()进行解析,程序的执行速度比将这些计算放在函数中时更快。
-
typedef
systax: 如将int指定为 myInt
typedef int myInt
-
#define定义常量
#define pi 3.14286 //#define 是一个预处理器宏,让预处理器将随后出现的所有 pi 都替换为 3.14286。预处理器将进行文本替换,而不是智能替换。编译器既不知道也不关心常量的类型。
Warning : 使用#define 定义常量的做法已被摒弃,因此不应采用这种做法。
第四章
1. C风格字符串
-
字符串与字符数组
std::cout << "Hello World";
等价于
char sayHello[] = { 'H','e','l','l','o',' ','W','o','r','l','d', '\0'}; std::cout << sayHello << std::endl;
请注意,该数组的最后一个字符为空字符‘\0’。这也被称为字符串结束字符,因为它告诉编译器, 字符串到此结束。这种 C 风格字符串是特殊的字符数组,因为总是在最后一个字符后加上空字符‘\0’。 您在代码中使用字符串字面量时,编译器将负责在它后面添加‘\0’。
在数组中间插入‘\0’并不会改变数组的长度,而只会导致将该数组作为输入的字符串处理将到这个位置结束。
‘\0’看起来像两个字符。使用键盘输入它时,确实需要输入两个字符,但反斜杆是编译器 能够理解的特殊转义编码, \0 表示空,即它让编译器插入空字符或零。不能将其写做‘0’,因为它表示字符 0,其 ASCII 编码为 48。
-
分析C风格字符串中的终止控制符
char sayHello[] = { 'H','e','l','l','o',' ','W','o','r','l','d','\0' }; cout << sayHello << endl; cout << sizeof(sayHello) << endl; sayHello[5] = '\0'; cout << sayHello << endl; cout << sizeof(sayHello) << endl;
最后的结果是:
Hello World 12 Hello 12
将数组sayHello中的下标为5的’ ‘换为’\0’,数组的大小(字节)没有变,但是打印出来的变了。
-
字符数组的存储大小
char userInput[21] = { '\0'}; //userInput最大只能存储20个字符,因为最后一个字符必须是终止符'\0'
第五章
-
int和short的大小(在x64(86位)和x86(32位)下运行,结果一样)
int 4个字节,32位
short 2个字节,16位
第七章 函数
1. 用栈理解函数调用
2. lambda函数速览
lambda 函数是 C++11 引入的,有助于使用 STL 算法对数据进行排序或处理。排序函数要求您提供一个二元谓词,以帮助确定元素的顺序。二元谓词是一个这样的函数,即对两个参数进行比较,并在一个小于另一个时返回 true,否则返回 false。这种谓词通常被实现为类中的运算符,这导致编码工作非常烦琐。使用 lambda 函数可简化谓词的定义。
下面给出个例子:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void DisplayNums(vector<int>& dynArray) {
for_each(dynArray.begin(), dynArray.end(),
[](int Element) {
cout << Element << " "; });
cout << endl;
}
int main() {
vector<int> myNums;
myNums.push_back(501);
myNums.push_back(-1);
myNums.push_back(25);
myNums.push_back(-35);
//打印vector
DisplayNums(myNums);
cout << "Sorting them in descending order" << endl;
sort(myNums.begin(), myNums.end(),
[](int num1, int num2) {
return num1 > num2;