cpp查漏补缺
查漏补缺随意版
—— 有些记得住有些靠记录,至于看不看...
额。。兜兜转转感觉对安全之类的兴趣一般,还是又回头重拾c++了,说来也惭愧,c++倒是还记得点,qt框架因为当时b站只弄过一个翻金币的小游戏,所以经验不足。
先花点时间把c++重新过一遍,然后找qt项目练手~ 不然工作要g了。
强制类型转换
语言 | 转换过程 | 举例 |
---|---|---|
c++ | static_cast |
int a = static_cast |
c | type(value) | int a = int(a+b) |
字符
类型 | 占用 | 说明 |
---|---|---|
char | 1 | ascii字符 |
wchar_t | 2 | 宽字节字符 |
char16_t | 2 | utf_16字符 |
char32_t | 4 | utf_18字符 |
输入wchar_t变量时需要使用wcout输出,定义时需加L
16和32目前输出都是数字,区别在于占用的内存
推断类型
auto |
---|
auto 变量名{初始值} |
大多情况不会使用auto,因为c和c++都是强语言,他对变量的声明还是要求较为严格的
1 | typeid(变量).name(); //用于查看变量类型 |
格式化输出
std::格式化输出 | |
---|---|
Dec | 以十进制格式显示后续数字 |
endl | 写入新行并冲刷输出流 |
fixed | 输出浮点数,例如3.1415926 |
flush | 冲刷输出流 |
hex | 以十六进制输入或输出 |
left | 左对齐输出 |
oct | 以八进制输入或输出 |
right | 右对齐输出 |
scientific | 使用科学表示法表示浮点数 |
setfill(ch) | 使用 ch 填充字符 |
setprecision(n) | 将浮点精度设置为n |
setw(n) | 将输出字段的宽度设置为n |
showbase | 打印数字时显示基数(进制) |
noshowbase | 打印数字时不要显示基数(进制) |
showpoint | 强制显示小数点和尾随零 |
noshowpoint | 如果可能的话,不打印结尾零和小数点 |
showpos | 在非负数前面打印一个加号 |
noshowpos | 在非负数前面不打印加号 |
defaultfloat | 恢复之前修改的浮点数计数方法和科学计数方法 |
个别如setprecision、setw、setfill使用时需要使用头文件iomanip
1 | //举个例子 |
叼猫优先级
1 | c = b+++a; |
后缀优先原则,当出现多个+或者-的时候自动先匹配两个。
如c=b+++a; 换做c = (b++)+a;
当然这种叼毛写法谁写谁哈皮,也就是无聊的考试官会出。不理解的可以通过vs去反汇编看执行顺序。
二进制流输出
引入头文件bitset
然后std::cout << std::bitset<位数>(变量)
c++ for
众所周知,在c语言里面,循环打印数组需要:
1 | int main(){ |
当然c++也能用上述的办法,但是还有一种更简洁的:
1 | int main(){ |
与常用的c语言循环不同,cpp这种是用i作为变量挨个读取数组num的值,并且打印,而不再是用i做数组的索引
当然需要注意i的类型是和数组类型一致的,如果不想操心,可以设置i为auto i
,自适应相对而言省去不少烦恼了,但是如果要求严谨那么久严格遵循即可。
哦还要注意多维数组的情况,其实基本道理一样,只能在内嵌最深处使用auto type: 数组
这样的操作
1 | int main(){ |
列表初始化
传统赋值初始化的时候都是用=号完成
c++其实可以用{}代替,
二者相比之下{}会相对更加严谨一点。
1 | int a = 1; |
第一感观上就会像是给class赋值初始化,但是也并非只能给class用。
列表初始化也是c++11起的特性。
参考链接
这里只是简单提一下,要详细理解的阅读一下参考链接的内容。
c/c++ 声明和定义的问题
在C语言中,变量声明但是不定义是不占用内存空间的。如果调用了一个未初始化的变量,编译器会分配到一个垃圾值的问题。
而c++,局部变量是必须要有定义的。除非使用extern做声明,这样才不用初始化。
UB
UB全称undefined behaviour.
,也就是常说的未定义行为