Diretório de artigos
-
- 0. Ordem de inclusão do arquivo de cabeçalho
- 1. Violação de acesso à memória
- 2. Variáveis globais
- 3. Precauções para os tipos Float e Double
- 4. O problema de truncamento da conversão de ponto flutuante para número inteiro
- 5. A diferença entre NULL e nullptr
- 6. Converta entre string e char
- 7. Converta entre string e int
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
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;
Para o tipo double, quando o valor for maior que 1*10^16, evite o uso de adição.
-------------------------------------------------- ------------------------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);