b站cherno的C++笔记

b站cherno的C++笔记

5-7 c++原理

  1. 重载运算符:相当于一个函数
  2. cin/cout 是输入/输出对象
  3. 解决方案配置:debug会比release运行速度更慢,但是二者编译出来的结果差别不大。
  4. 解决目标平台:编译的代码的目标平台,X86指的是windows32位,X64指的是windows64位
  5. GCC汇编的四个阶段是,预处理、编译、汇编、链接。compile就是检查语法的,检查没错了,将它们生成相应的二进制文件(OBJ)。build则是指compile和link一起做。link是将obj文件链接起来,并检查它们是否具备真正可执行的条件。如果检查通过,则将obj文件链接为exe或dll文件。
  6. c++项目的编译中,每一个cpp文件都会被编译,但是头文件不会被编译,头文件的内容在预处理时包含进来了
  7. 函数的声明和定义,函数的声明是通知编译器函数名称、参数数量和类型以及函数返回类型;函数的定义是为函数分配内存。
  8. 编译(compile)生成obj文件,分为两个过程:一是预处理(.cpp to .i的过程),#include(等价于直接复制粘贴);#define(等价于直接替换名称);# if #endif(包含或者排除基于给定条件的代码)。 https://zhuanlan.zhihu.com/p/372004972
  9. 预处理是不参与编译的,如果把预处理输出文件,将生成.i文件。
  10. 报错:output中的error是C开头,表示编译过程出错;error是LNK开头,表示链接出错 。
  11. 要想生成.exe文件,要先给文件一个入口设置,即入口点,可以在属性的高级设置里去设置,不一定是main函数。main()函数是程序入口,包含程序的主要逻辑。
  12. link这一章节可以参考 link

【8】c++变量

数据类型

int类型是指在一定范围内存储整数,有4个byte,即32位,有符号,32个bit中必须有一个bit表示+或者-
unsigned int 无符号的int类型, 可以储存一个更大范围的数字。
char 1个byte,储存字符,字符型变量中字符与数字的转换关系:link
short 2个byte
int 4个byte
long 4个byte
long long 8个byte
double 8个byte 可以储存小数
float 4个byte 可以储存小数,在定义时如果是float类型,可以写成a=5.5f
bool 类型的值非 0 即 1,理论上只需要 1bit 的内存空间,但是在内存中寻址无法寻找只有 1bit 的内存,因此,声明一个 bool 类型变量时,依旧会占用 1 个字节的内存。注意,一个类型到底有多大,这取决于编译器,但我们可以使用 sizeof 操作符查询类型大小。

sizeof(int);

【9】c++函数

函数就是我们要写的代码块,被设计用来执行特定的任务的。在class中这些代码块则被成为方法method。
函数的目的是减少重复,不要为频繁地创建函数,因为每次调用函数,编译器都会生成一个 call 指令。编译器需要为每个函数创建一个栈结构,然后把返回地址和函数参数等压入栈。然后运行时就会跳转到二进制执行文件的不同部分,以执行我们的函数命令。

main 函数没有返回值这是现代 C++ 的一个特性,编译器会为你在末尾处添加一行 return 0; 这只是为了让你的代码更加干净。但别的函数如果没有返回值,在 Release 模式下是不会报错的,如果真的调用这个函数,依旧会报 “未定义的行为” 的错误,在 Debug 模式下,就会直接提示你没有返回值。
declaration : 头文件里
definition : translate units=cpp files

【10】.h头文件

.h写声明、.cpp写功能,main里面实现功能

下面来说#pargma once
任何以#开头的东西,都被称为预处理器命令或者预处理器指令,这意味着在实际编译至此文件之前它将被先处理。
pragma本质上是一个被发送到编译器或预处理器的预处理指令。pargma once阻止我们单个头文件多次被包含,并转换为单个翻译单元。
原因是如果我们不小心多次包含了一个文件,并转换为一个翻译单元,我们会得到duplicate复制错误,因为我们会复制粘贴整个头文件多次。
头文件保护符(监督、警卫)的东西——#ifndef #define #endif,在过去被广泛使用。但是现在我们有了这个新的预处理语句叫做pragma once. 几乎现在每个编译器都支持pragma once,所以它不止visual studio——GCC、Clang、MSVC都支持。
#include 后面有的接<>,有的接’',表示不同的涵义;如果我们要包含的文件是在其中的一个文件夹里(在包含路径文件夹里),我们可以使用尖括号来告诉编译器搜索包含路径文件夹; 而引号则通常用于包含相对于当前文件的文件。
所以尖括号只用于编译器包含路径,引号可以做一切。不过cherno一般引号中都是只用当前路径,即不用…/啥的,其他都是用尖括号。
建议:如果包含了一些visual studio 解决方案之外的东西,就会用尖括号,也就是一些完全与项目无关的外部依赖项。

【11】 debug

断点和读取内存------是调试的两大部分。当然会同时使用。换句话说设置端点就是为了读取内存。

  1. step into F11 进入到这行代码上的函数里面(如果这一行有一个函数的话)
  2. step into F10 从当前函数跳到下一行代码
  3. step out shift+F11 跳出当前函数,回到调用这个函数的位置
    在debug的界面有三个窗口,自动窗口、局部变量、监视;可以在监视中添加变量名,查看调试过程中变量的变化。
    在菜单栏的debug中选择窗口—内存,可以查看内存的状态,在搜索中输入 &<变量名> 可以查看其内存地址。
    在内存窗口中,最左边是内存地址以十六进制格式表示的实际值,在中间为实际的数据,右边为ASCII码对这些数字的解释。
    ASCII码与16进制对照表:link

2个16进制数=1个byte

【12】if语句

运行时检测汇编(debug时,鼠标右键->go to disassembly),进入反汇编界面,可以查看每一行代码对应的汇编,比如int x = 6就对应那一行汇编 mov xxx,而下面那一句就对应一块汇编。

【13】VS设置

平台和配置全选all:
Output Directory写为: ( S o l u t i o n D I r ) b i n (SolutionDIr)bin (SolutionDIr)bin(Platform) ( C o n f i g u r a t i o n ) I n t e r m e d i a t e D i r e c t o r y 写为: (Configuration) Intermediate Directory写为: (Configuration)IntermediateDirectory写为:(SolutionDIr)bin\intermediates ( P l a t f o r m ) (Platform) (Platform)(Configuration)
顺便一提,我们经常会使用到宏$(SolutionDir),其代表着与sln所在的路径,且自动在结尾有反斜杠
vcxproj文件,我们的项目文件。其实只是一个XML文件。sln文件实际上是一个文本文件夹,就像是某种目录。

【14】循环(for、while)

【15】控制流 (continue、break、return)

continue 只能在循环中使用,表示进入这个循环的下一个迭代
break 表示跳出循环
return 表示跳出整个函数,不止用在循环中、可以用在程序的任何一个地方。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值