查漏补缺随意版

—— 有些记得住有些靠记录,至于看不看...

额。。兜兜转转感觉对安全之类的兴趣一般,还是又回头重拾c++了,说来也惭愧,c++倒是还记得点,qt框架因为当时b站只弄过一个翻金币的小游戏,所以经验不足。
先花点时间把c++重新过一遍,然后找qt项目练手~ 不然工作要g了。


强制类型转换

语言 转换过程 举例
c++ static_cast(value) int a = static_cast(a+b)
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
2
3
4
5
//举个例子
std::cout << std::fixed;
std::cout << 3.14 << std::endl;

//输出结果就是3.14000

叼猫优先级

1
2
3
4
c = b+++a;
c = b---a;
c = 3*-b+++a;
c = 2*-b---a;

后缀优先原则,当出现多个+或者-的时候自动先匹配两个。
如c=b+++a; 换做c = (b++)+a;

当然这种叼毛写法谁写谁哈皮,也就是无聊的考试官会出。不理解的可以通过vs去反汇编看执行顺序。


二进制流输出

引入头文件bitset
然后std::cout << std::bitset<位数>(变量)


c++ for

众所周知,在c语言里面,循环打印数组需要:

1
2
3
4
5
6
int main(){
int num[] = {1,2,3,4,5,6,7,8};
for(int i = 0; i < sizof(num)/sizof(int); i++){
printf("%d\t",num[i]);
}
}

当然c++也能用上述的办法,但是还有一种更简洁的:

1
2
3
4
5
6
int main(){
int num[] = {1,2,3,4,5,6,7,8};
for(int i : num){
std::cout << i << std::endl;
}
}

与常用的c语言循环不同,cpp这种是用i作为变量挨个读取数组num的值,并且打印,而不再是用i做数组的索引

当然需要注意i的类型是和数组类型一致的,如果不想操心,可以设置i为auto i,自适应相对而言省去不少烦恼了,但是如果要求严谨那么久严格遵循即可。

哦还要注意多维数组的情况,其实基本道理一样,只能在内嵌最深处使用auto type: 数组这样的操作

1
2
3
4
5
6
7
8
9
10
11
12
13
int main(){
int num[3][3] = {
{1,2,3},
{1,2,3},
{1,2,3}
}

for(int i = 0 ; i < 3; i++){
for(int j:num[i]){
std::cout << j << std::endl;
}
}
}

列表初始化

传统赋值初始化的时候都是用=号完成
c++其实可以用{}代替,

二者相比之下{}会相对更加严谨一点。

1
2
int a = 1;
int b{1};

第一感观上就会像是给class赋值初始化,但是也并非只能给class用。

列表初始化也是c++11起的特性。
参考链接

这里只是简单提一下,要详细理解的阅读一下参考链接的内容。


c/c++ 声明和定义的问题

在C语言中,变量声明但是不定义是不占用内存空间的。如果调用了一个未初始化的变量,编译器会分配到一个垃圾值的问题。

而c++,局部变量是必须要有定义的。除非使用extern做声明,这样才不用初始化。


UB

UB全称undefined behaviour.,也就是常说的未定义行为