[Coleção de problemas C++ - atualização contínua]

0. Ordem de inclusão do arquivo de cabeçalho

Usar um arquivo de cabeçalho padrão inclui ordem melhora a legibilidade e evita dependências ocultas.
A ordem recomendada de "C++ Programming Ideas": (para xxx.cpp) do mais especial ao mais geral.

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

Ordem recomendada do "Guia de estilo do Google C++": (para xxx.cpp)

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

A mesma coisa entre os dois é colocar xxx.h no início para evitar dependências ocultas. Esperamos que cada arquivo de cabeçalho possa ser compilado independentemente.

1. Violação de acesso à memória

Quando a contagem de membros da classe não é inicializada, ocorrem erros de corrupção de heap e violação de acesso à memória. O principal motivo é que quando se trata do uso deste membro posteriormente, ele recebe um valor atribuído aleatoriamente pelo sistema (relativamente grande), e quando a memória é indexada de acordo com este parâmetro, é causado pelo acesso à memória que não pertence a si mesmo.
Lição: Todos os membros da classe devem ser inicializados antes do uso
insira a descrição da imagem aqui
insira a descrição da imagem aqui

2. Variáveis ​​globais

Visível desde o início da declaração até o final do arquivo, é armazenado na área global/estática. (Variáveis ​​locais geralmente são apenas variáveis ​​locais dentro da função)
(1) Um único arquivo
pode ser definido fora da função
(2) Vários arquivos: irrelevantes e relacionados (referindo-se a arquivos de cabeçalho)
a. Relacionados (referindo-se ao arquivo de definições de variáveis ​​globais)
declaração de variáveis ​​globais:

extern int g_a;

Definição de variáveis ​​globais:

g_a = 0;

Observação: pode haver várias declarações da mesma variável ou função, mas apenas uma definição.
Evite de todas as formas: coloque a declaração e a definição juntas, de modo que quando o arquivo de cabeçalho for incluído, haverá um erro de definição repetido extern int g_a=0.
b. Declarações e definições irrelevantes
estão no mesmo arquivo, como extern int g_a=0 em test1.h,
test1.h não está incluído em test2 e a declaração extern int g_a é necessária para usar esta variável global;

3. Precauções para os tipos Float e Double

Ao realizar a adição, devido ao número limitado de dígitos efetivos, a adição será finalizada.
Para o tipo float, quando o valor for maior que 1*10^7, evite o uso de adição;
insira a descrição da imagem aqui
insira a descrição da imagem aqui

Para o tipo double, quando o valor for maior que 1*10^16, evite o uso de adição.
insira a descrição da imagem aqui
insira a descrição da imagem aqui

-------------------------------------------------- ------------------------Atualização de 23/02/2023---------------------- -------------------------------------------------- --

4. O problema de truncamento da conversão de ponto flutuante para número inteiro

A conversão float para o tipo int causará truncamento, como armazenar 400, o tipo float é 399,99998 e 399 após a conversão de truncamento. Portanto, ao converter um tipo de ponto flutuante em um tipo inteiro, é melhor converter após o arredondamento, float(round(a)).

5. A diferença entre NULL e nullptr

Em C++, NULL e nullptr, na linguagem C, NULL significa um ponteiro nulo, enquanto em C++, NULL significa 0 ou um ponteiro nulo, e nullptr está após C++11, o que significa um ponteiro nulo. Portanto, o uso de ponteiros nulos em C++ é recomendado para usar nullptr uniformemente.

6. Converta entre string e char

string para char

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

string para char *

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

7. Converta entre string e int

string para int, primeiro para char e depois para int

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

int para string (o padrão c++11 adiciona a função global 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);

Acho que você gosta

Origin blog.csdn.net/qq_44924694/article/details/127939724
Recomendado
Clasificación