Resumo do conhecimento básico da entrada C++ (acabamento em 2022)

1. Conhecimento básico de entrada C++ O que é C++?

Em 1982, o Dr. Bjarne Stroustrup introduziu e expandiu o conceito de orientação a objetos com base na linguagem C e inventou uma nova linguagem de programação. Para expressar a relação entre a linguagem e a linguagem C, ela é denominada C++. Portanto: C++ é baseado na linguagem C, ele pode não apenas realizar a programação procedural da linguagem C, mas também pode realizar a programação baseada em objetos caracterizada por tipos de dados abstratos, e também pode realizar a programação orientada a objetos .

O conhecimento básico da versão PDF de entrada C++, tutorial de melhoria C++, e-books C++ podem ser obtidos da seguinte forma

Preste atenção na conta pública do WeChat: "C and C plus" Responda à palavra-chave: "C++" para receber

Em segundo lugar, o conhecimento básico da entrada C++ olha para a versão histórica do C++

  • C com classes classes e classes derivadas, membros públicos e privados, construção e destruidor de classes, amigos, funções inline, sobrecarga de operadores de atribuição, etc.

  • C++ 1.0 adiciona o conceito de funções virtuais, sobrecarga de funções e operadores, referências, constantes, etc.

  • C++ 2.0 suporte mais perfeito para orientação a objetos, novos membros protegidos, herança múltipla, inicialização de objetos, classes abstratas, membros estáticos e funções de membro const

  • O C++ 3.0 é aprimorado ainda mais com a introdução de modelos para resolver o problema de ambiguidade causado pela herança múltipla e o processamento da construção e destruição correspondentes

  • A primeira versão do padrão C++98 C++, suportada pela maioria dos compiladores, foi reconhecida pela International Organization for Standardization (ISO) e pela American Standardization Association, reescreveu a biblioteca padrão C++ de uma maneira modelo e introduziu o STL (Standard Biblioteca de modelos)

  • C++03 A segunda versão do padrão C++, os recursos da linguagem não mudaram muito, principalmente: corrigir erros, reduzir a diversidade

  • O C++05 C++ Standards Committee divulgou um Technical Report (TR1), oficialmente renomeado C++0x, ou seja: planejado para ser lançado em algum momento da primeira década deste século

  • O C++ 11 adiciona muitos recursos que tornam o C++ mais parecido com uma nova linguagem, como: expressões regulares, loops for baseados em intervalo, palavra-chave automática, novos contêineres, inicialização de lista, biblioteca de encadeamento padrão, etc.

  • A extensão de C++14 para C++11 é principalmente para corrigir as vulnerabilidades e melhorias em C++11, como: expressões lambda genéricas, dedução de tipo de valor de retorno automático, constantes literais binárias, etc.

  • O C++17 fez algumas pequenas melhorias no C++11, adicionando 19 novos recursos, como: informações de texto opcionais para static_assert(), expressões Fold para modelos de variáveis, inicializadores de instruções if e switch etc.

Três palavras-chave de conhecimento básico de C++

Há um total de 63 palavras-chave em C++:

Os circulados são as palavras-chave da linguagem C.这里要注意了:false和true并不是C语言的关键字。

Quarto, o namespace C++ da base de entrada C++

Em C/C++, variáveis, funções e classes existem em grande número, e os nomes dessas variáveis, funções e classes serão aplicados ao escopo global, o que pode levar a muitos conflitos de nomenclatura.

A finalidade de usar namespaces é localizar identificadores e nomes para evitar conflitos de nomenclatura ou poluição de nomes.A palavra-chave namespace parece resolver esse problema.

Para definir um namespace, você precisa usar a palavra-chave namespace, seguida pelo nome do namespace e, em seguida, um par de {}, onde {} é o nome

membros do espaço.

Nota: Um namespace define um novo escopo e tudo no namespace é limitado a esse namespace

1. Definição comum de namespace

2. Os namespaces podem ser aninhados

3. Vários namespaces com o mesmo nome são permitidos no mesmo projeto, e o compilador eventualmente os sintetizará no mesmo namespace.

ele será mesclado com o namespace xjt acima

Cinco, o uso do namespace básico de entrada C++

Obviamente, é impossível imprimir printf diretamente, porque você chama o endereço de printf assim, então este resultado aparecerá.Os métodos de chamada positivos são os três seguintes.

1. Adicione o nome do namespace e o qualificador de escopo

O símbolo "::" é chamado de qualificador de escopo em C++, e podemos acessar os membros correspondentes no namespace por meio de "namespace name::namespace member"

2. Introduzir usando o namespace namespace name

Mas há algumas desvantagens nesse método: se definirmos uma variável chamada printf no namespace, se introduzirmos o namespace xjt posteriormente, isso causará poluição de nomenclatura.

Para resolver este problema, surgiu um terceiro método de introdução.

3. Use using para introduzir membros no namespace

Essa abordagem evita a poluição de nomes, uma vez que apenas introduz parte dela.

6. Entrada e saída de conhecimentos básicos de entrada C++

Existem funções padrão de entrada e saída scanf e printf na linguagem C, enquanto em C++ existem entradas padrão cin e saída padrão cout. Para usar as funções scanf e printf na linguagem C, o arquivo de cabeçalho stdio.h precisa ser incluído. Para usar cin e cout em C++, você precisa incluir o arquivo de cabeçalho iostream e o namespace padrão std.

O método de entrada e saída de C++ é mais conveniente que a linguagem C, pois a entrada e saída de C++ não precisam controlar o formato, por exemplo: o tipo inteiro é %d e o tipo caractere é %c.

Nota: endl, o l neste não é o algarismo arábico 1, mas o l de 26 letras inglesas, o que equivale a uma nova linha.

Aqui também devemos prestar atenção às características do cin. É semelhante ao gets na linguagem C. Obtém paradas quando encontra uma nova linha, enquanto cin usa um espaço, tab ou nova linha como separador, então digite hello world aqui. são separados por espaços.

Aqui eu insiro hello world, mas como há um espaço ao inserir, o conteúdo depois disso não será lido, então hello é armazenado em arr.

7. Conhecimento básico de entrada C++ - parâmetros padrão

Um parâmetro padrão é quando uma função é declarada ou definida para especificar um valor padrão para os parâmetros de uma função. Ao chamar a função, o
valor padrão é usado se nenhum argumento for especificado, caso contrário, os argumentos especificados serão usados.

1. Todos padrão

Todos os parâmetros padrão, ou seja, todos os parâmetros formais da função são definidos como parâmetros padrão.

2. Parâmetros semi-padrão

Perceber: 

  • Os parâmetros semi-padrão devem ser fornecidos sequencialmente da direita para a esquerda e não podem ser fornecidos em intervalos.

  • Os parâmetros padrão não podem aparecer na declaração e definição da função

Porque: se a declaração e a definição ocorrerem ao mesmo tempo e os dois locais fornecerem valores diferentes, o compilador não poderá determinar qual valor padrão usar.

  • O valor padrão deve ser uma constante ou uma variável global.

Oito, noções básicas de C++ - sobrecarga de função C++

1. Sobrecarga de funções

A sobrecarga de funções é um caso especial de funções. C++ permite que várias funções de mesmo nome com funções semelhantes sejam declaradas no mesmo escopo . As listas formais de parâmetros (número ou tipo ou ordem de parâmetros) dessas funções com o mesmo nome devem ser diferente . Implementação de funções semelhantes com diferentes tipos de dados

Nota: Se apenas o valor de retorno for diferente e todo o resto for o mesmo, isso não constitui sobrecarga de função.

2. O princípio da sobrecarga de funções C++

Por que o C++ oferece suporte à sobrecarga de funções, mas a linguagem C não?

Aqui vamos rever o conhecimento anterior. Antes de correr para o arquivo executável, temos que passar por: pré-compilar, compilar, montar, vincular essas etapas

Na verdade, o problema está na etapa de montagem após a compilação, pois as linguagens C++ e C são um pouco diferentes aqui. Vamos dar uma olhada:

Depois de compilar com o compilador da linguagem C

Depois de compilar com o compilador C++

Resumir:

  • Na verdade, em última análise, é porque o compilador C e o compilador C++ decoram nomes de funções de forma diferente. As regras de modificação no gcc são: [_Z + comprimento da função + nome da função +
    primeira letra do tipo].

  • Isso realmente nos diz por que o tipo de retorno da função é diferente e não constitui sobrecarga de função, porque as regras de decoração não são afetadas pelo valor de retorno.

3、externo “C”

Às vezes, em um projeto C++, pode ser necessário compilar algumas funções de acordo com o estilo C, adicionando extern "C" antes da função, o que significa dizer ao compilador,

Esta função é compilada de acordo com as regras da linguagem C. Por exemplo: tcmalloc é um projeto implementado pelo google em C++, que fornece tcmallc() e tcfree

Duas interfaces são usadas, mas se for um projeto C, ele não pode ser usado, então ele usa "C" externo para resolvê-lo.

Nove, o básico da entrada C++ - referência

1. Cotação

A referência não é para definir uma nova variável, mas para obter um alias para a variável existente.O compilador não abrirá espaço de memória para a variável de referência, ele compartilha o mesmo espaço de memória com
a variável referenciada .

tipo e nome da variável de referência (nome do objeto) = entidade de referência;

Observação: o tipo de referência deve ser do mesmo tipo que a entidade de referência

2. Características de referência

  • As referências devem ser inicializadas quando são definidas

  • Uma variável pode ter várias referências

  • Uma vez que uma referência se refere a uma entidade, ela não pode se referir a outra entidade

Mas o efeito real é que o valor de c é de fato atribuído a b, e porque b é uma referência a a, o valor de a se torna 20.

3. Frequentemente citado

Conforme mencionado acima, o tipo de referência deve ser do mesmo tipo que a entidade de referência. Mas apenas o mesmo tipo não garante que a referência possa ser bem sucedida.Aqui também precisamos prestar atenção à questão de saber se ela pode ser modificada.

Aqui a, b, d são todas constantes, e constantes não podem ser modificadas, mas se você usar int&ra para se referir a a, o a referenciado pode ser modificado, então haverá problemas.
Vejamos este pedaço de código:

Esta citação está correta? Para entender este problema, devemos primeiro entender o problema da promoção do tipo eremita. Aqui, há uma promoção do tipo eremita de int para duplo, e durante o processo de promoção, o sistema criará uma área constante para armazenar o resultado do tipo promoção . Então aqui, este código está errado à primeira vista, porque a é armazenado na área constante quando seu tipo de eremita é promovido, e a área constante não pode ser modificada, e você usa double&ra para se referir a ela, a referência de ra pode ser modificada .

Adicionar um const pode resolver esse problema.

Nota: Não é possível referir-se a uma quantidade não modificável como uma quantidade legível e gravável, mas o inverso é possível, e é possível referir-se a uma quantidade legível e gravável como uma quantidade legível.

4. Cenários de uso de referência

  • referência como parâmetro

    Lembre-se da função de troca na linguagem C. Ao aprender a linguagem C, a função de troca é frequentemente usada para ilustrar a diferença entre passagem por valor e passagem por referência. Agora que aprendemos sobre referências, podemos usar ponteiros como parâmetros. Como aqui a e b são referências aos argumentos de entrada, trocamos os valores de a e b, o que equivale a trocar os dois argumentos de entrada.

  • referência como valor de retorno

    É claro que referências também podem ser usadas como valores de retorno, mas devemos prestar atenção especial ao fato de que os dados que retornamos não podem ser variáveis ​​locais comuns criadas dentro da função, pois variáveis ​​locais comuns definidas dentro da função serão destruídas com o final da chamada da função. Os dados que retornamos devem ser modificados estaticamente ou criados dinamicamente ou variáveis ​​globais e outros dados que não serão destruídos com o final da chamada da função.

    Consequências de não adicionar estática

Você está se perguntando por que imprime 7 em vez de 2?

Isso é ainda mais estranho, por que adicionar um printf no meio para imprimir valores aleatórios?
Vejamos a análise:

Por que o valor aleatório aparece? Porque a variável que você define na função é uma variável temporária, e a função será destruída quando sair da função. Neste momento, ela aponta aleatoriamente para um espaço na memória . Portanto, é melhor adicionar static às variáveis ​​definidas na função ao fazer referência ao valor de retorno da função.

Neste ponto você acha que realmente entende este código?

Talvez você fique curioso? Por que é 3 aqui? Vejamos a análise

Na verdade, se você alterar a forma de escrever, o resultado aqui será alterado para 7. O motivo também é muito simples, que é o motivo mencionado na figura acima.

Nota: Caso a função retorne fora do escopo da função e o objeto retornado não tenha retornado ao sistema, você pode utilizar a referência para retornar; caso tenha retornado ao sistema, deve-se utilizar o retorno por valor.
Esta frase diz o seguinte exemplo:

Você sente que esse retorno de passagem por referência é estranho de usar, vamos analisar como ele é retornado.

Resumir:
传值的过程中会产生一个拷贝,而传引用的过程中不会,其实在做函数参数时也具有这个特点。

5. Diferença entre referência e ponteiro

Em termos de sintaxe, uma referência é um alias, que não possui espaço independente e compartilha o mesmo espaço com sua entidade de referência.

Na verdade, há espaço na implementação subjacente, porque as referências são implementadas como ponteiros.

Vamos dar uma olhada na comparação de código assembly de referências e ponteiros

Diferença entre referência e ponteiro

  • As referências devem ser inicializadas quando são definidas, os ponteiros não são necessários.

  • Depois que uma referência se refere a uma entidade quando é inicializada, ela não pode se referir a outras entidades e um ponteiro pode apontar para qualquer entidade do mesmo tipo a qualquer momento.

  • Não há referências NULL, mas existem ponteiros NULL.

  • O significado em sizeof é diferente: o resultado da referência é o tamanho do tipo de referência, mas o ponteiro é sempre o número de bytes ocupados pelo espaço de endereço (4 bytes em uma plataforma de 32 bits).

  • A operação de autoincremento da referência é equivalente a aumentar a entidade em 1, e a operação de autoincremento do ponteiro é que o ponteiro é deslocado pelo tamanho de um tipo.

  • Existem vários níveis de ponteiros, mas não há vários níveis de referências.

  • As entidades são acessadas de maneira diferente, os ponteiros precisam ser desreferenciados explicitamente e as referências são tratadas pelo próprio compilador.

  • As referências são relativamente mais seguras de usar do que os ponteiros.

10. Conhecimento básico de entrada C++ - funções inline

1. Conceito

Uma função decorada com inline é chamada de função inline.Ao compilar, o compilador C++ expandirá o local onde a função inline é chamada , sem a sobrecarga do empilhamento de funções,
e a função inline melhora a eficiência da operação do programa. (Quando você vê a parte em negrito, seus amigos definitivamente pensarão, isso é muito semelhante à macro na linguagem c?)

Se você adicionar a palavra-chave inline antes da função acima para alterá-la para uma função inline, o compilador substituirá a chamada da função pelo corpo da função durante a compilação

2. Recursos

  • Inline é uma forma de trocar espaço por tempo, eliminando a sobrecarga de chamar funções. Portanto, código longo/funções recursivas não são adequadas para uso como funções inline.

  • Inline é apenas uma sugestão para o compilador, e o compilador irá otimizá-lo automaticamente.Se o código do corpo da função definida como inline for relativamente longo/recursivo, etc., o compilador irá ignorar o inline ao otimizar.

  • O Inline não recomenda a separação de declarações e definições, a separação levará a erros de link. Como o inline é expandido, não há endereço de função e o link não será encontrado.

Quais são as técnicas para c++ substituir macros

  • Substituir definição constante por const

  • Substituir definições de função por funções inline

Onze, palavra-chave automática (C++11)

Nos primeiros dias de C/C++, o significado de auto era: uma variável decorada com auto é uma variável local com armazenamento automático, mas infelizmente ninguém nunca a usou.

No C++11, o comitê padrão deu a auto um novo significado: auto não é mais um indicador de tipo de armazenamento, mas como um novo indicador de tipo para instruir o compilador de que as variáveis ​​declaradas por auto devem ser compiladas pelo compilador. Você pode não entender apenas lendo esta frase, vamos dar alguns exemplos.

#include<iostream>

using namespace std;

int TestAuto()

{

return 10;

}

int main()

{

int a = 10;

auto b = a;

auto c = 'a';

auto d = TestAuto();



cout << typeid(b).name() << endl; //这个地方要学到后面类的时候才可以解释,这里打印出的是类型名

cout << typeid(c).name() << endl;

cout << typeid(d).name() << endl;



cout << a << endl;

cout << b<< endl;

cout << c << endl;

cout << d << endl;



//auto e; 无法通过编译,使用auto定义变量时必须对其进行初始化

return 0;

}

Nota: Ao usar auto para definir uma variável, ela deve ser inicializada.Durante a fase de compilação, o compilador precisa deduzir o tipo real de auto de acordo com a expressão de inicialização. Portanto, auto não é uma declaração de "tipo", mas um "espaço reservado" quando um tipo é declarado.O compilador substituirá auto pelo
tipo real da variável em tempo de compilação.

1. Regras para o uso do automóvel

  • auto é usado em conjunto com ponteiros e referências

Ao declarar um tipo de ponteiro com auto, não há diferença entre auto e auto*, mas ao declarar um tipo de referência com auto, você deve adicionar &

Nota: Ao declarar uma referência com auto, você deve adicionar &, caso contrário, ela apenas criará uma variável comum do mesmo tipo da entidade, mas mudará seu nome.

  • Definindo várias variáveis ​​na mesma linha

Ao declarar várias variáveis ​​na mesma linha, essas variáveis ​​devem ser do mesmo tipo, caso contrário o compilador reportará um erro, pois o compilador na verdade apenas
deduz o primeiro tipo e depois define outras variáveis ​​com o tipo deduzido.

2. Cenários que o automático não pode deduzir

  • auto como parâmetro de função

  • auto não pode ser usado diretamente para declarar um array

Para evitar confusão com auto em C++ 98, C++ 11 apenas mantém o uso de auto como um indicador de tipo
. A vantagem mais comum de auto na prática é o novo estilo fornecido pelo C++11, que será discutido mais adiante.For loops, expressões lambda, etc., podem ser usadas juntas.

12. Conhecimento básico de loop for baseado em intervalo de entrada C++ (C++11)

1. A sintaxe de intervalo para

Em C++98, se você quiser percorrer um array, você pode fazer da seguinte forma:

Para uma coleção variada, é redundante e às vezes propenso a erros para o programador especificar o intervalo do loop. Então, em C++11

Um loop baseado em intervalo foi introduzido. Os parênteses após o loop for são divididos em duas partes pelos dois pontos ":": a primeira parte é a variável no intervalo usado para iteração e a segunda parte representa o intervalo a ser iterado.

Observe que ele não pode ser escrito como automático, caso contrário, o array original não pode ser alterado

Pronúncia Correta

Nota: Semelhante aos loops comuns, você pode usar continue para encerrar o loop atual e também pode usar break para sair do loop inteiro.

2. Condições de uso do escopo para

  • O intervalo da iteração do loop for deve ser determinístico

Para um array, é o intervalo do primeiro elemento e do último elemento no array; para uma classe, os
métodos begin e end devem ser fornecidos, e begin e end são o intervalo da iteração do loop for.

Nota: O código a seguir é problemático porque o escopo do for é indeterminado

  • O objeto iterável implementa as operações de ++ e ==.

Sobre o iterador, falarei sobre isso mais tarde, mas agora você pode entendê-lo.

Treze, base de entrada C++ - valor nulo do ponteiro nullptr

1. Valor nulo do ponteiro em C++98

Na boa prática de programação C/C++, ao declarar uma variável, é melhor dar à variável um valor inicial apropriado, caso contrário podem ocorrer erros imprevisíveis. Por exemplo, para ponteiros não inicializados, se um ponteiro não tiver um ponteiro válido, nós o inicializamos basicamente da seguinte forma:

NULL é na verdade uma macro. Você pode ver o seguinte código no arquivo de cabeçalho C tradicional (stddef.h):

Como você pode ver, NULL pode ser definido como uma constante literal 0, ou como uma constante com um ponteiro não tipado (void*). Não importa qual definição você tome, você inevitavelmente encontrará alguns problemas ao usar ponteiros com valores nulos, como:

A intenção original do programa é chamar a versão de ponteiro da função Fun(int* p) por meio de Fun(NULL), mas como NULL é definido como 0, Fun(NULL) finalmente chama a função Fun(int p).

Nota: Em C++98, a constante literal 0 pode ser um número inteiro ou uma constante de ponteiro não tipado (void*), mas o compilador a trata como uma constante de inteiro por padrão. ser lançado.

2. Valor nulo do ponteiro em C++11

Para problemas no C++98, o C++11 introduziu a palavra-chave nullptr.

Ao usar nullptr para representar o ponteiro nulo, nenhum arquivo de cabeçalho precisa ser incluído porque nullptr foi introduzido como uma palavra-chave no C++11.

Em C++11, sizeof(nullptr) e sizeof((void*)0) ocupam o mesmo número de bytes e ambos têm tamanho 4.

finalmente

O conhecimento básico da versão PDF de entrada C++, tutorial de melhoria C++, e-books C++ podem ser obtidos da seguinte forma

Preste atenção na conta pública do WeChat: "C and C plus" Responda à palavra-chave: "C++" para receber

Acho que você gosta

Origin blog.csdn.net/weixin_55305220/article/details/123685978
Recomendado
Clasificación