上次学C++还是在大一的时候,一直都想好好的温习一下C++。刚好最后被隔离在宿舍了,出不去,正好有时间有耐心好好重温下C++。
其实很久之前就想重温一下C++了,因为秋招拿到的视觉算法的offer,而且后面的工作可能会偏向应用,所以重温c++还是很有必要的,很多算法部署都需要C++。之后自己也想学习一下点云和SLAM相关的知识,所以学好C++是必须的~
没打算看视频学习,因为很多基础的东西还是有的,所以这次希望可以通过书籍系统性的学习一下。在书籍选择上,有《C++ Primer》和《C++ Primer Plus》两本书,后者比较基础,适合没有编程经验的初学者,前者适合有一定C++编程经验的。所以,这里我选择《C++ Primer》。
800多页的书籍,可能需要很长的时间才能看完,我不求快,但求细致。我会记录下每一点代码细节和书籍中的编程案例和练习题。
我敲的C++ Primer练习题代码:
Github: https://github.com/HuKai97/Cpp-Primer
int main()
{return 0;
}
源文件通过编译可以生成可执行文件。
windows + vscode,编译指令:
g++ 源文件
例子:
#include int main()
{std::cout << "Enter two number: " << std::endl;int v1 = 0, v2 = 0;std::cin >> v1 >> v2;std::cout << "The sum of " << v1 << " and " << v2 << " is " << v1 + v2 << std::endl; return 0;
}
iostream标准库有两个基本类型:输入流istream和输出流ostream;流表示随着时间的推移,字符是按顺序生成或者消耗的;
iostream标准库有4个IO对象:istream类型的对象:cin(标准输入);ostream类型的对象:cout(标准输出)、cerr(标准错误)、clog(标准日志);
cout 还可以重定向(比如输出到文件),通过缓冲区。cerr 不可以重定向(只能输出到显示器),不通过缓冲区。cerr的作用是在一些特殊的紧急情况下还可以输出(比如调用栈用完了,没有出口的递归等)。
std::endl可以刷新缓冲区,缓冲区的目的是减少刷屏的次数,多个字符同时输出到显示器。
引入头文件的两种方式:<>引入标准头文件,系统的头文件;""引入非标准头文件,自定义的头文件;
std:标准库的命名空间,std::cout和std::endl指cout和endl是定义在名为std的命名空间中的,标准库中的所有名字都是定义在std命名空间的。命名空间可以帮助我们避免命名冲突;其实可以使用using namespace std;以更简单的方式访问标准库中的方法;
输出运算符<<,接受两个运算对象,左侧的运算对象必须是一个ostream对象,即cout,右侧是需要打印的值;std::cout << "Hello World"表示把字符流"Hello World"写给ostream对象std::cout,后半句表示操作符std::endl输入到ostream对象std::cout,系统识别特殊操作符std::endl就知道这句输出程序结束了,于是结束在内存中等待写入流,将目前程序所产生的所有输出都真正的写入输出流中;
std::cout << "Hello World" << std::endl;
等价于
std::cout << "Hello World";std::cout << std::endl;
输入运算符>>,同样接受两个运算对象,左侧对象必须是istream对象cin,从std::cin >> v1表示将非空输入字符流存入v1变量中;此时如果输入的是空白字符,则当前赋值完毕;再碰到新的非空字符流存入v2变量中;
std::cin >> v1 >> v2;
等价于
std::cin >> v1;std::cin >> v2;
所以两种输入方式都是有效的:
两种注释方式:
/* /**/ */
【while循环】
只要condition为真就一直执行statement语句,直到condition为假,则继续执行while语句外的第一条语句。
while (condition)statement
【for循环】
for语句 = 循环头 + 循环体
循环头 = 初始化语句 + 循环条件 + 表达式
例子:
#include int main()
{int val = 1, sum1 = 0;while (val <= 10){sum1 += val;val += 1;}std::cout << "while: " << sum1 << std::endl;int sum2 = 0;for (int val = 1; val <= 10; val ++){sum2 += val;}std::cout << "For: " << sum2 << std::endl;return 0;
}
例子:实现对用户输入的一组数求和
#include int main()
{int sum = 0, val = 0;while (std::cin >> val) {sum += val;}std::cout << sum << std::endl;return 0;
}
std::cin >> val会从标准输入中读取一个数,保存在val中。这里放在while中其实是在检测流的状态,如果流是有效的,正确的字符,则为True,当遇到无效输入字符或文件结束符时(Ctrl+Z + Enter),返回False。
condition = True执行statement1,condition = False执行statement2;
if (condition){statement1
}else{statement2
}
例子:
#include int main()
{int curVal = 0, val = 0;if (std::cin >> curVal){int count = 1;while (std::cin >> val){if (curVal == val){count += 1;}else{std::cout << curVal << " occurs " << count << " times." << std::endl;curVal = val;count = 1;}}std::cout << curVal << " occurs " << count << " times." << std::endl;}return 0;
}
类是 c++ 最重要的特性之一。
类定义了行为。类的作者决定了类类型对象上可以使用的所有操作.
成员函数是定义为类的一部分的函数,也被称为方法。
通常以类对象的名义来调用成员函数:Item.isbn()。即使用点运算符(.)
这一块把书中几个经典例题和课后习题敲一敲,就明白了。
知乎: 《C++Primer》全书学习笔记(详细)
Github: applenob/Cpp_Primer_Practice
CSDN: 【笔记】C++ Prime
CSDN: C++学习路线(最全资源整合)