【C++问题集锦——持续更新中】

0. 头文件包含顺序

使用标准的头文件包含顺序可增强可读性, 避免隐藏依赖。
《C++编程思想》推荐顺序:(对xxx.cpp)从最特殊到最一般。

xxx.h
本项目内 .h 文件
其他库的 .h 文件
C++ 系统文件
C 系统文件

《Google C++ Style Guide》推荐顺序:(对xxx.cpp)

xxx.h
C 系统文件
C++ 系统文件
其他库的 .h 文件
本项目内 .h 文件

两者相同之处是将xxx.h放在开始,避免隐藏依赖,我们希望每一个头文件都可以独立编译。

1. 内存访问冲突

类成员counts未进行初始化时,出现了堆损坏以及内存访问冲突的错误。其主要原因是后面涉及到该成员的使用时得到的是系统随机分配的一个值(比较大),在根据该参数索引内存时出现了访问不属于自己的内存导致的。
教训: 所有类成员在使用前务必进行初始化
在这里插入图片描述
在这里插入图片描述

2. 全局变量

从声明开始到文件末尾都是可见的,其存储在全局/静态区。(局部变量一般只函数内部的局部变量)
(1)单文件
在函数外面定义即可
(2)多文件:不相关和相关的(引用头文件的)
a.相关的(引用了全局变量定义的文件)
全局变量的声明:

extern int g_a;

全局变量的定义:

g_a = 0;

注意: 对同一个变量或函数的声明可以有多次,而定义只能有一次。
切忌: 将声明和定义一起,这样在包含头文件时会出现重复定义的错误extern int g_a=0。
b.不相关的
声明和定义在同一个文件,如test1.h中extern int g_a=0;
在test2中不包含test1.h,使用该全局变量是需要进行声明extern int g_a;

3. Float和double型注意事项

在进行加法时,由于有效位数有限,因此会加法截止的情况。
对于float型,当数值大于1*10^7时,避免使用加法;
在这里插入图片描述
在这里插入图片描述

对于double型,当数值大于1*10^16时,避免使用加法。
在这里插入图片描述
在这里插入图片描述

--------------------------------------------------------------------------2023.02.23更新--------------------------------------------------------------------------

4. 浮点型转整型的截断问题

float转int型会出现截断现象,如存储400,float型为399.99998,截断转换后为399。因此,在将浮点型转换为整型时最好四舍五入后转换,float(round(a))。

5. NULL和nullptr的区别

C++中,NULL和nullptr,在C语言中NULL表示空指针,而在C++中NULL表示0或者空指针,nullptr为C++11之后的,表示空指针。因此在C++中使用空指针建议统一使用nullptr。

6. string 与 char互转

string 转 char

char ch[20];
string s="123456";
strcpy(ch,s.c_str());

string 转 char*

const char* p=a.data();
const char* p=a.c_str();
char* p=const_cast<char*>(a_str());
char转string直接赋值即可

7. string 与 int互转

string 转 int,先转char然后再转int

string str1 = s_Value.toStdString();
int value = atoi(str1.c_str());
float value = atof(str1.c_str()); //转float

int转string(c++11标准增加了全局函数std::to_string)

string to_string (int val);
string to_string (long val);
string to_string (long long val);
string to_string (unsigned val);
string to_string (unsigned long val);
string to_string (unsigned long long val);
string to_string (float val);
string to_string (double val);
string to_string (long double val);
std::string pi = "pi is " + std::to_string(3.1415926);

猜你喜欢

转载自blog.csdn.net/qq_44924694/article/details/127939724