Toda variável segue esse formato: tipo nome da variavel = inicialização (opcional) Ex.:
![[Pasted image 20230827112516.png]]
O tipo char pode ser utilizado para armazenar caracteres
Você pode representar qualquer letra que encaixe em 8 bits em um caractere.
Podemos representar string como uma lista de caracteres
Esses tipos de string terminam com um binario 0
como valor em caracter. Adicionar mais caracteres nesta string é perigoso pois podera sobreescrever memória em outros locais. Por isso é recomendado não utilizar ela além de valores literais.
O compilador C++ distingue entre aspas simples e duplas: 'a'
é o caractere
“a” (tem o tipo char ) e "a"
é um array com um binário 0 como terminação (ou seja, seu tipo é const char[2]
).
A forma mais conveniente para trabalhar com string é utilizando a class string
A classe string
utiliza memória dinamica e gerencia por ela mesma. Portanto se precisamos adicionar mais texto em uma string não precisamos nos preocupar com corrupção de memória ou erro na adicição do texto.
Constantes são variáveis com atributo const
como não podem ser modificadas é obrigatório inicializa-las ao serem declaradas.
![[Pasted image 20230827134904.png]]
Existem 4 motivos principais do porque devemos tomar cuidado aos tipos de literais;
Apartir do C++14 podemos criar uma string diretamente ao adicionar um s
:
O código acima compila e funciona normalmente, porém o valor pode ser cortado em plataformas 32bits. C++11 introduz uma inicialização que garante que o valor não sera cortado:
Nesse caso o compilador irá verificar se na arquietura do sistema o valor será mantido. Garantindo que o valor não irá perder precisão.
O escopo determina o tempo de vida e visibilidade (variaveis não estaticas) e constantes e contribuem para estabelecer uma estrutura para o programa
No escopo global variaveis podem ser acessadas e modificadas em qualquer parte do programa. É recomendado evitar devido as implicações e a quantidade de erros que podem ser gerados quando variaveis forem modificadas dinamicamente.
A disponibilidade e visibilidade de variaveis no escopo local é determinado pelos limites dos colchetes { }
.
![[Pasted image 20230827152803.png]]
![[Pasted image 20230827153704.png]]
Existem keyword representando cada uma dessas expressões, porém são pouco utilizadas com exceção do not
![[Pasted image 20230827160503.png]]
![[Pasted image 20230827161457.png]]
Se os tipos da variaveis não são iguais, expr
é convertido para o tipo do object
se possivel.
A operações são realizadas da direita para esquerda
c ? x : y
operador ternario
Comma Operator
Os operadores new
e delete
aloca e desealoca memória respectivamente.
![[Pasted image 20230827161834.png]]
![[Pasted image 20230827161934.png]]
throw
é utilizado para indicar uma exceção na execução de um programa
Em muitas linguagens uma atribuição é considerado uma declaração, mas em c++ uma atribuição é avalida como uma expressão, dessa forma:
É avaliado da direita para a esquerda
O loop consiste em 3 componentes:
break
continue
Variaveis temporaria não podem passadas por referencia
Para evitar que uma variavel passada por referência não seja modificada precisamos adicionar a propiedade const
:
Em contraste parametros constantes permitem que variaveis temporarias sejam passadas na chamada da função por referência
Essa função pode ser chamada com dois ou um parametro
Valores padrões devem ser definidos por ultimo, assim após definir um valor padrão para um paramentro os próximos parametros precisam ter um valor padrão
Chamada de uma função é relativamente custosa, para evitar isso o compilador pode declarar a função inline
Mesmo declarando a função com a keyword inline
o compilador pode não definir a função desta forma.
main
argc: quantidade de argumentos argv: lista de argumentos
A macro assert
que vem do header cassert
é utilizado para avaliar uma expressão e caso o resultado seja false
o programa é finalizado.
Quando a verificação for falsa o programa ira terminar e exibir uma mensagem:
Uma vantagem do asset
é que podemos desaparecer com eles apenas com um parametro ao compilar o código:
Assim podemos apenas adicionar um parametro na compilação para habilitar os assert:
Já que podemos desabilitar o conselho éTestar o maximo de parametros
Em c++ você pode passar qualquer tipo de dados no throw
: string, number e etc.
Porém é melhor definir o tipo da exceção ou utilizar da biblioteca padrão.
<<
insertion operator
endl
produz uma nova linha e faz o flush do buffer
![[Pasted image 20230827201908.png]]
Podemos utilizar os arquivos da mesma forma que utilizamos cin
e cout
:
O código acima cria um arquivo chamado squares.txt
ou sobreescreve caso já exista. Quando definimos o operador « para um novo tipo, ele funcionara para arquivos e para o console (cout
e cin
)
Qualquer classe pode ser utilizada como um stream se for derivada do istream
, ostream
e iostream
. Podemos funções que aceitem qualquer tipo de stream ao aceitrar uma referencia mutável do ostream
.
I/O streams são formatadas por I/O manipulators, que são encontrados no header file <iomanip>
Não é recomendado a utilização do printf
original do C, por dois motivos:
<format>
do C++20 combina a facilidade de formatação com tipagem segura. (Os compiladores nas seguintes versões ainda não tem suporte: GCC 12.0, Clang 13 e Visual Studio 16.9.6)Por padrão streams não lançam erros
Em c++ o tamanho de um array deve ser conhecido em tempo de compilação
Um array não contém explicitamente seu tamanho, como sabemos o tamanho do array antes da compilação podemos encontrar apartir da seguinte divisão
Um ponteiro é uma variavel que contém uma endereço de memória
O programador é o responsável por liberar a memória caso não utilize mais o ponteiro