131
Página anterior Próxima página Guia rápido de C ++ Anúncios Visão Geral do C ++ C ++ é uma linguagem de programação de forma livre, tipificada estaticamente, compilada, de propósito geral, sensível a maiúsculas e minúsculas que suporta programação procedural, orientada a objeto e programação genérica. O C ++ é considerado uma linguagem de nível médio , pois compreende uma combinação de recursos de linguagem de alto nível e de baixo nível. O C ++ foi desenvolvido por Bjarne Stroustrup a partir de 1979 no Bell Labs em Murray Hill, New Jersey, como um aprimoramento da linguagem C e originalmente chamado C com Classes, mas posteriormente foi renomeado como C ++ em 1983. C ++ é um superconjunto de C e virtualmente qualquer programa C legal é um programa C ++ legal. Nota - Diz-se que uma linguagem de programação usa tipagem estática quando a verificação de tipo é executada durante o tempo de compilação, em oposição ao tempo de execução. C ++ suporta totalmente programação orientada a objetos, incluindo os quatro pilares do desenvolvimento orientado a objetos - Encapsulamento Esconder dados Herança Polimorfismo O padrão C ++ consiste em três partes importantes - A linguagem principal fornece todos os blocos de construção, incluindo variáveis, tipos de dados e literais, etc. Programação Orientada a Objetos Bibliotecas Padrão

Guia rápido da linguagem C++(JN)

Embed Size (px)

Citation preview

Page 1: Guia rápido da linguagem C++(JN)

Página anterior Próxima página

Guia rápido de C ++Anúncios

Visão Geral do C ++C ++ é uma linguagem de programação de forma livre, tipificada estaticamente,compilada, de propósito geral, sensível a maiúsculas e minúsculas que suportaprogramação procedural, orientada a objeto e programação genérica.

O C ++ é considerado uma linguagem de nível médio , pois compreende umacombinação de recursos de linguagem de alto nível e de baixo nível.

O C ++ foi desenvolvido por Bjarne Stroustrup a partir de 1979 no Bell Labs em MurrayHill, New Jersey, como um aprimoramento da linguagem C e originalmente chamado Ccom Classes, mas posteriormente foi renomeado como C ++ em 1983.

C ++ é um superconjunto de C e virtualmente qualquer programa C legal é umprograma C ++ legal.

Nota - Diz-se que uma linguagem de programação usa tipagem estática quando averificação de tipo é executada durante o tempo de compilação, em oposição ao tempode execução.

C ++ suporta totalmente programação orientada a objetos, incluindo os quatro pilaresdo desenvolvimento orientado a objetos -

Encapsulamento

Esconder dados

Herança

Polimorfismo

O padrão C ++ consiste em três partes importantes -

A linguagem principal fornece todos os blocos de construção, incluindovariáveis, tipos de dados e literais, etc.

Programação Orientada a Objetos

Bibliotecas Padrão

Page 2: Guia rápido da linguagem C++(JN)

A C ++ Standard Library fornece um rico conjunto de funções que manipulamarquivos, strings, etc.

A Standard Template Library (STL) fornece um rico conjunto de métodos quemanipulam estruturas de dados, etc.

O padrão ANSI é uma tentativa de garantir que o C ++ seja portátil; Esse código quevocê escreve para o compilador da Microsoft irá compilar sem erros, usando umcompilador em um Mac, UNIX, uma caixa do Windows ou um Alpha.

O padrão ANSI está estável há algum tempo e todos os principais fabricantes decompiladores C ++ suportam o padrão ANSI.

O mais importante ao aprender C ++ é focar nos conceitos.

O propósito de aprender uma linguagem de programação é se tornar um programadormelhor; isto é, tornar-se mais efetivo em projetar e implementar novos sistemas e emmanter os antigos.

C ++ suporta uma variedade de estilos de programação. Você pode escrever no estilode Fortran, C, Smalltalk, etc., em qualquer idioma. Cada estilo pode atingir seusobjetivos de forma eficaz, mantendo a eficiência em tempo de execução e espaço.

C ++ é usado por centenas de milhares de programadores em praticamente todos osdomínios de aplicação.

O C ++ está sendo muito usado para gravar drivers de dispositivos e outros softwaresque dependem da manipulação direta de hardware sob restrições em tempo real.

O C ++ é amplamente utilizado para ensino e pesquisa porque é suficientemente limpopara o ensino bem-sucedido de conceitos básicos.

Qualquer pessoa que tenha usado um Apple Macintosh ou um PC executando oWindows usou indiretamente o C ++, porque as interfaces de usuário primárias dessessistemas são escritas em C ++.

Configuração do ambiente C ++

Se você ainda estiver disposto a configurar seu ambiente para C ++, precisará ter osdois softwares a seguir em seu computador.

O padrão ANSI

Aprendendo C ++

Uso de C ++

Configuração do ambiente local

Editor de texto

Page 3: Guia rápido da linguagem C++(JN)

Isso será usado para digitar seu programa. Exemplos de alguns editores incluem oWindows Notepad, o comando OS Edit, Brief, Epsilon, EMACS e vim ou vi.

O nome e a versão do editor de texto podem variar em diferentes sistemasoperacionais. Por exemplo, o Bloco de Notas será usado no Windows e o vim ou o vipoderão ser usados no Windows, bem como no Linux ou UNIX.

Os arquivos criados com o editor são chamados de arquivos de origem e, para o C ++,geralmente são nomeados com a extensão .cpp, .cp ou .c.

Um editor de texto deve estar pronto para iniciar sua programação em C ++.

Este é um compilador C ++ real, que será usado para compilar seu código fonte noprograma executável final.

A maioria dos compiladores C ++ não se importam com a extensão que você dá ao seucódigo-fonte, mas se você não especificar de outra forma, muitos usarão .cpp porpadrão.

O compilador mais freqüentemente usado e gratuito é o compilador GNU C / C ++, casocontrário você pode ter compiladores da HP ou Solaris se você tiver os respectivossistemas operacionais.

Se você estiver usando Linux ou UNIX , verifique se o GCC está instalado em seusistema, digitando o seguinte comando a partir da linha de comando -

$ g++ -v

Se você instalou o GCC, ele deverá imprimir uma mensagem como a seguinte -

Using built-in specs.

Target: i386-redhat-linux

Configured with: ../configure --prefix=/usr .......

Thread model: posix

gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)

Se o GCC não estiver instalado, você deverá instalá-lo usando as instruções detalhadasdisponíveis em https://gcc.gnu.org/install/

Se você usa o Mac OS X, a maneira mais fácil de obter o GCC é baixar o ambiente dedesenvolvimento do Xcode do site da Apple e seguir as instruções de instalaçãosimples.

O Xcode está atualmente disponível em developer.apple.com/technologies/tools/ .

Compilador C ++

Instalando o compilador GNU C / C ++Instalação UNIX / Linux

Instalação Mac OS X

Instalação do Windows

Page 4: Guia rápido da linguagem C++(JN)

Para instalar o GCC no Windows, você precisa instalar o MinGW. Para instalar o MinGW,acesse a página do MinGW, www.mingw.org , e siga o link para a página dedownload do MinGW. Faça o download da versão mais recente do programa deinstalação do MinGW, que deve ser denominado MinGW- <version> .exe.

Ao instalar o MinGW, no mínimo, você deve instalar o gcc-core, o gcc-g ++, o binutils eo tempo de execução do MinGW, mas você pode querer instalar mais.

Adicione o subdiretório bin de sua instalação do MinGW à sua variável de ambientePATH para que você possa especificar essas ferramentas na linha de comandos porseus nomes simples.

Quando a instalação estiver concluída, você poderá executar gcc, g ++, ar, ranlib,dlltool e várias outras ferramentas GNU a partir da linha de comando do Windows.

Sintaxe Básica de C ++Quando consideramos um programa C ++, ele pode ser definido como uma coleção deobjetos que se comunicam por meio da invocação dos métodos um do outro. Vamosagora examinar brevemente o que uma classe, objeto, métodos e variáveis instantâneas significam.

Objeto - Objetos possuem estados e comportamentos. Exemplo: Um cão temestados - cor, nome, raça, bem como comportamentos - abanar, latir, comer.Um objeto é uma instância de uma classe.

Classe - Uma classe pode ser definida como um template / blueprint quedescreve os comportamentos / estados que o objeto de seu tipo suporta.

Métodos - Um método é basicamente um comportamento. Uma classe podeconter muitos métodos. É nos métodos onde as lógicas são escritas, os dadossão manipulados e todas as ações são executadas.

Variáveis de instância - cada objeto tem seu conjunto exclusivo de variáveis de instância. O estado de um objeto é criado pelos valores atribuídos a essasvariáveis de instância.

Vamos ver um código simples que imprimiria as palavras Hello World .

#include <iostream> using namespace std; // main() is where program execution begins. int main() { cout << "Hello World"; // prints Hello World return 0; }

Vamos olhar as várias partes do programa acima -

Estrutura do Programa C ++

Demonstração ao vivo

Page 5: Guia rápido da linguagem C++(JN)

A linguagem C ++ define vários cabeçalhos, que contêm informaçõesnecessárias ou úteis para o seu programa. Para este programa, o cabeçalho<iostream> é necessário.

A linha usando o namespace std; diz ao compilador para usar o namespacestd. Namespaces são uma adição relativamente recente ao C ++.

A próxima linha ' // main () é onde a execução do programa começa. 'éum comentário de linha única disponível em C ++. Comentários de linha únicacomeçam com // e param no final da linha.

A linha int main () é a principal função onde a execução do programa éiniciada.

A próxima linha cout << "Hello World"; faz com que a mensagem "HelloWorld" seja exibida na tela.

A próxima linha retorna 0; termina a função main () e faz com que ela retorneo valor 0 para o processo de chamada.

Vamos ver como salvar o arquivo, compilar e executar o programa. Por favor, siga ospassos abaixo -

Abra um editor de texto e adicione o código como acima.

Salve o arquivo como: hello.cpp

Abra um prompt de comando e vá para o diretório em que você salvou oarquivo.

Digite 'g ++ hello.cpp' e pressione enter para compilar seu código. Se nãohouver erros no seu código, o prompt de comando o levará para a próxima linhae gerará o arquivo executável a.out.

Agora, digite 'a.out' para executar seu programa.

Você poderá ver "Hello World" impresso na janela.

$ g++ hello.cpp

$ ./a.out

Hello World

Certifique-se de que g ++ esteja no seu caminho e que você o esteja executando nodiretório que contém o arquivo hello.cpp.

Você pode compilar programas C / C ++ usando makefile. Para mais detalhes, vocêpode conferir nosso 'Tutorial Makefile' .

Compile e execute o programa C ++

Ponto e vírgula e blocos em C ++

Page 6: Guia rápido da linguagem C++(JN)

Em C ++, o ponto e vírgula é um terminador de instrução. Isto é, cada afirmaçãoindividual deve terminar com um ponto e vírgula. Indica o fim de uma entidade lógica.

Por exemplo, seguem três declarações diferentes -

x = y;

y = y + 1;

add(x, y);

Um bloco é um conjunto de instruções logicamente conectadas que são cercadas porchaves de abertura e fechamento. Por exemplo -

{

cout << "Hello World"; // prints Hello World

return 0;

}

C ++ não reconhece o fim da linha como um terminador. Por este motivo, não importaonde você coloca uma declaração em uma linha. Por exemplo -

x = y;

y = y + 1;

add(x, y);

é o mesmo que

x = y; y = y + 1; add(x, y);

Um identificador de C ++ é um nome usado para identificar uma variável, função,classe, módulo ou qualquer outro item definido pelo usuário. Um identificador começacom uma letra A a Z ou a a z ou um sublinhado (_) seguido por zero ou mais letras,sublinhados e dígitos (0 a 9).

C ++ não permite caracteres de pontuação como @, $ e% em identificadores. C ++ éuma linguagem de programação sensível a maiúsculas e minúsculas. Assim,Manpower e mão de obra são dois identificadores diferentes em C ++.

Aqui estão alguns exemplos de identificadores aceitáveis -

mohd zara abc move_name a_123

myname50 _temp j a23b9 retVal

A lista a seguir mostra as palavras reservadas em C ++. Essas palavras reservadas nãopodem ser usadas como constantes ou variáveis ou quaisquer outros nomes deidentificadores.

asm outro Novo isto

Identificadores C ++

Palavras-chave C ++

Page 7: Guia rápido da linguagem C++(JN)

auto enum operador lançar

bool explícito privado verdade

pausa exportar protegido experimentar

caso extern público typedef

pegar falso registo typeid

Caracteres flutuador reinterpret_cast Digite o nome

classe para Retorna União

const amigos baixo sem assinatura

const_cast vamos para assinado usando

continuar E se tamanho de virtual

padrão na linha estático vazio

excluir int static_cast volátil

Faz longo struct wchar_t

em dobro mutável interruptor enquanto

dynamic_cast namespace modelo

Alguns caracteres têm uma representação alternativa, chamada de sequência detrigramas. Um trigrama é uma sequência de três caracteres que representa um únicocaractere e a sequência sempre começa com dois pontos de interrogação.

Os trigraphs são expandidos onde quer que apareçam, incluindo em literais de string eliterais de caracteres, em comentários e em diretivas de pré-processador.

A seguir estão as seqüências de trigramas mais usadas -

Trigraph Substituição

?? #

?? \

?? ^

?? ( [

??) ]

??! |

Trigraphs

Page 8: Guia rápido da linguagem C++(JN)

?? {

?? }

?? ~

Todos os compiladores não suportam trigraphs e não são aconselhados a serem usados por causa de sua natureza confusa.

Uma linha contendo apenas espaço em branco, possivelmente com um comentário, éconhecida como uma linha em branco, e o compilador C ++ ignora totalmente isso.

Espaços em branco é o termo usado em C ++ para descrever espaços em branco,tabulações, caracteres de nova linha e comentários. O espaço em branco separa umaparte de uma instrução da outra e habilita o compilador a identificar onde um elementoem uma instrução, como int, termina e o próximo elemento começa.

int age;

Na declaração acima, deve haver pelo menos um caractere de espaço em branco(geralmente um espaço) entre int e age para o compilador ser capaz de distingui-los.

fruit = apples + oranges; // Get the total fruit

Na afirmação 2 acima, não são necessários caracteres de espaço em branco entrefrutas e =, ou entre = e maçãs, embora você esteja livre para incluir alguns, se desejarum propósito de legibilidade.

Comentários em C ++Comentários do programa são instruções explicativas que você pode incluir no código C++. Esses comentários ajudam qualquer pessoa a ler o código-fonte. Todas aslinguagens de programação permitem alguma forma de comentários.

C ++ suporta comentários de linha única e multilinha. Todos os caracteres disponíveisdentro de qualquer comentário são ignorados pelo compilador C ++.

Comentários em C ++ começam com / * e terminam com * /. Por exemplo -

/* This is a comment */

/* C++ comments can also

* span multiple lines

*/

Espaço em branco em C ++

Declaração 1

Declaração 2

Page 9: Guia rápido da linguagem C++(JN)

Um comentário também pode começar com //, estendendo-se até o final da linha. Porexemplo -

#include <iostream> using namespace std; main() { cout << "Hello World"; // prints Hello World return 0; }

Quando o código acima é compilado, ele irá ignorar // imprime Hello World e oexecutável final produzirá o seguinte resultado -

Hello World

Dentro de um comentário / * e * /, // os caracteres não têm significado especial.Dentro de um // comentário, / * e * / não têm significado especial. Assim, você pode"aninhar" um tipo de comentário dentro do outro tipo. Por exemplo -

/* Comment out printing of Hello World:

cout << "Hello World"; // prints Hello World

*/

Tipos de dados C ++Ao escrever o programa em qualquer idioma, você precisa usar várias variáveis paraarmazenar várias informações. Variáveis não são nada além de locais de memóriareservados para armazenar valores. Isto significa que quando você cria uma variávelvocê reserva algum espaço na memória.

Você pode armazenar informações de vários tipos de dados como caractere, caracterelargo, inteiro, ponto flutuante, ponto flutuante duplo, booleano, etc. Com base no tipode dados de uma variável, o sistema operacional aloca memória e decide o que podeser armazenado no arquivo. memória reservada.

O C ++ oferece ao programador uma rica variedade de tipos de dados internos edefinidos pelo usuário. A tabela a seguir lista sete tipos básicos de dados do C ++ -

Tipo Palavra chave

boleano bool

Personagem Caracteres

Inteiro int

Demonstração ao vivo

Tipos incorporados primitivos

Page 10: Guia rápido da linguagem C++(JN)

Ponto flutuante flutuador

Duplo ponto flutuante em dobro

Sem valor vazio

Caráter largo wchar_t

Vários dos tipos básicos podem ser modificados usando um ou mais dessesmodificadores de tipo -

assinado

sem assinatura

baixo

longo

A tabela a seguir mostra o tipo de variável, a quantidade de memória necessária paraarmazenar o valor na memória e o valor máximo e mínimo que pode ser armazenadonesse tipo de variável.

Tipo Largura de Bit Típica Faixa típica

Caracteres 1byte -127 a 127 ou 0 a 255

caracter não identifcado 1byte 0 a 255

caractere assinado 1byte -127 a 127

int 4 bytes -2147483648 a 2147483647

int não assinado 4 bytes 0 a 4294967295

int assinado 4 bytes -2147483648 a 2147483647

int curto 2bytes -32768 a 32767

int curto não assinado Alcance 0 a 65.535

int curto Alcance -32768 a 32767

long int 4 bytes -2,147,483,648 a 2,147,483,647

assinado longo int 4 bytes mesmo que long int

sem assinatura longa int 4 bytes 0 a 4.294.967.295

flutuador 4 bytes +/- 3,4e +/- 38 (~ 7 dígitos)

em dobro 8bytes +/- 1.7e +/- 308 (~ 15 dígitos)

longa dupla 8bytes +/- 1.7e +/- 308 (~ 15 dígitos)

Page 11: Guia rápido da linguagem C++(JN)

wchar_t 2 ou 4 bytes 1 caractere largo

O tamanho das variáveis pode ser diferente das mostradas na tabela acima,dependendo do compilador e do computador que você está usando.

A seguir está o exemplo, que produzirá o tamanho correto de vários tipos de dados noseu computador.

#include <iostream> using namespace std; int main() { cout << "Size of char : " << sizeof(char) << endl; cout << "Size of int : " << sizeof(int) << endl; cout << "Size of short int : " << sizeof(short int) << endl; cout << "Size of long int : " << sizeof(long int) << endl; cout << "Size of float : " << sizeof(float) << endl; cout << "Size of double : " << sizeof(double) << endl; cout << "Size of wchar_t : " << sizeof(wchar_t) << endl; return 0; }

Este exemplo usa endl , que insere um caractere de nova linha após cada linha e ooperador << está sendo usado para passar vários valores para a tela. Também estamosusando o operador sizeof () para obter o tamanho de vários tipos de dados.

Quando o código acima é compilado e executado, ele produz o seguinte resultado, quepode variar de máquina para máquina -

Size of char : 1

Size of int : 4

Size of short int : 2

Size of long int : 4

Size of float : 4

Size of double : 8

Size of wchar_t : 4

Você pode criar um novo nome para um tipo existente usando typedef . A seguir, asintaxe simples para definir um novo tipo usando typedef -

typedef type newname;

Por exemplo, o seguinte diz ao compilador que feet é outro nome para int -

typedef int feet;

Agora, a seguinte declaração é perfeitamente legal e cria uma variável inteira chamadadistance -

feet distance;

Demonstração ao vivo

Declarações typedef

Page 12: Guia rápido da linguagem C++(JN)

Um tipo enumerado declara um nome de tipo opcional e um conjunto de zero ou maisidentificadores que podem ser usados como valores do tipo. Cada enumerador é umaconstante cujo tipo é a enumeração.

Criar uma enumeração requer o uso da palavra-chave enum . A forma geral de um tipode enumeração é -

enum enum-name { list of names } var-list;

Aqui, o enum-name é o nome do tipo da enumeração. A lista de nomes é separada porvírgulas.

Por exemplo, o código a seguir define uma enumeração de cores chamadas cores e avariável c do tipo cor. Finalmente, c é atribuído o valor "azul".

enum color { red, green, blue } c;

c = blue;

Por padrão, o valor do primeiro nome é 0, o segundo nome tem o valor 1 e o terceirotem o valor 2, e assim por diante. Mas você pode dar um nome, um valor específico,adicionando um inicializador. Por exemplo, na enumeração a seguir, verde terá o valor5.

enum color { red, green = 5, blue };

Aqui, o azul terá um valor de 6, porque cada nome será um maior que aquele que oprecede.

Tipos de Variáveis C ++Uma variável nos fornece armazenamento nomeado que nossos programas podemmanipular. Cada variável em C ++ possui um tipo específico, que determina o tamanhoe o layout da memória da variável; o intervalo de valores que podem ser armazenadosnessa memória; e o conjunto de operações que podem ser aplicadas à variável.

O nome de uma variável pode ser composto de letras, dígitos e o caractere desublinhado. Deve começar com uma letra ou um sublinhado. Letras maiúsculas eminúsculas são distintas porque C ++ diferencia maiúsculas de minúsculas -

Existem os seguintes tipos básicos de variáveis em C ++, conforme explicado no últimocapítulo -

Sr.Não

Tipo e Descrição

1bool

Armazena ou valor verdadeiro ou falso.

Tipos enumerados

Page 13: Guia rápido da linguagem C++(JN)

2 Caracteres

Normalmente, um único octeto (um byte). Este é um tipo inteiro.

3int

O tamanho mais natural do inteiro para a máquina.

4flutuador

Um valor de ponto flutuante de precisão única.

5em dobro

Um valor de ponto flutuante de precisão dupla.

6vazio

Representa a ausência de tipo.

7wchar_t

Um tipo de caractere amplo.

O C ++ também permite definir vários outros tipos de variáveis, as quais abordaremosem capítulos subsequentes, como Enumeração, Ponteiro, Matriz, Referência,Estruturas de dados e Classes .

A seção a seguir abordará como definir, declarar e usar vários tipos de variáveis.

Uma definição de variável informa ao compilador onde e quanto armazenamento deveser criado para a variável. Uma definição de variável especifica um tipo de dados econtém uma lista de uma ou mais variáveis desse tipo da seguinte maneira:

type variable_list;

Aqui, tipo deve ser um tipo de dados C ++ válido, incluindo char, w_char, int, float,double, bool ou qualquer objeto definido pelo usuário, etc., e variable_list podeconsistir em um ou mais nomes de identificadores separados por vírgulas. Algumasdeclarações válidas são mostradas aqui -

int i, j, k;

char c, ch;

float f, salary;

double d;

A linha int i, j, k; ambos declaram e definem as variáveis i, j e k; que instrui ocompilador a criar variáveis chamadas i, j e k do tipo int.

Definição Variável em C ++

Page 14: Guia rápido da linguagem C++(JN)

Variáveis podem ser inicializadas (atribuídas a um valor inicial) em sua declaração. Oinicializador consiste em um sinal de igual seguido por uma expressão constante daseguinte maneira -

type variable_name = value;

Alguns exemplos são -

extern int d = 3, f = 5; // declaration of d and f.

int d = 3, f = 5; // definition and initializing d and f.

byte z = 22; // definition and initializes z.

char x = 'x'; // the variable x has the value 'x'.

Para definição sem um inicializador: variáveis com duração de armazenamento estáticosão implicitamente inicializadas com NULL (todos os bytes possuem o valor 0); o valorinicial de todas as outras variáveis é indefinido.

Uma declaração de variável fornece garantia ao compilador de que existe uma variávelexistente com o tipo e nome dado, de modo que o compilador prossiga para compilaçãoadicional sem precisar de detalhes completos sobre a variável. Uma declaração devariável tem seu significado somente no momento da compilação, o compilador precisada definição real da variável no momento da vinculação do programa.

Uma declaração de variável é útil quando você está usando vários arquivos e vocêdefine sua variável em um dos arquivos que estarão disponíveis no momento davinculação do programa. Você usará uma palavra-chave externa para declarar umavariável em qualquer lugar. Embora você possa declarar uma variável várias vezes emseu programa C ++, mas ela pode ser definida apenas uma vez em um arquivo, umafunção ou um bloco de código.

Tente o seguinte exemplo onde uma variável foi declarada no topo, mas foi definidadentro da função principal -

#include <iostream> using namespace std; // Variable declaration: extern int a, b; extern int c; extern float f; int main () { // Variable definition: int a, b; int c; float f; // actual initialization a = 10; b = 20;

Declaração de Variáveis em C ++

Exemplo

Demonstração ao vivo

Page 15: Guia rápido da linguagem C++(JN)

c = a + b; cout << c << endl ; f = 70.0/3.0; cout << f << endl ; return 0; }

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

30

23.3333

O mesmo conceito se aplica na declaração de função, na qual você fornece um nome defunção no momento de sua declaração e sua definição real pode ser dada em qualqueroutro lugar. Por exemplo -

// function declaration

int func();

int main() {

// function call

int i = func();

}

// function definition

int func() {

return 0;

}

Existem dois tipos de expressões em C ++ -

lvalue - Expressões que se referem a um local de memória são chamadas deexpressão "lvalue". Um lvalue pode aparecer como o lado esquerdo ou direitode uma atribuição.

rvalue - O termo rvalue refere-se a um valor de dados que é armazenado emalgum endereço na memória. Um rvalor é uma expressão que não pode ter umvalor atribuído a ela, o que significa que um rvalue pode aparecer no ladodireito, mas não no lado esquerdo de uma atribuição.

As variáveis são lvalores e, portanto, podem aparecer no lado esquerdo de umaatribuição. Os literais numéricos são valores r e, portanto, podem não ser atribuídos enão podem aparecer no lado esquerdo. A seguir, uma declaração válida -

int g = 20;

Mas o seguinte não é uma declaração válida e geraria um erro em tempo de compilação-

Lvalores e Rvalores

Page 16: Guia rápido da linguagem C++(JN)

10 = 20;

Escopo Variável em C ++Um escopo é uma região do programa e, de um modo geral, existem três lugares ondeas variáveis podem ser declaradas -

Dentro de uma função ou um bloco que é chamado de variáveis locais,

Na definição de parâmetros de função, que é chamado de parâmetros formais.

Fora de todas as funções que são chamadas de variáveis globais.

Vamos aprender o que é uma função e é parâmetro nos próximos capítulos. Aqui vamosexplicar o que são variáveis locais e globais.

Variáveis declaradas dentro de uma função ou bloco são variáveis locais. Eles podemser usados apenas por instruções que estão dentro dessa função ou bloco de código. Asvariáveis locais não são conhecidas por funções externas às suas. A seguir, o exemplousando variáveis locais -

#include <iostream> using namespace std; int main () { // Local variable declaration: int a, b; int c; // actual initialization a = 10; b = 20; c = a + b; cout << c; return 0; }

Variáveis globais são definidas fora de todas as funções, geralmente no topo doprograma. As variáveis globais manterão seu valor durante toda a vida útil do seuprograma.

Uma variável global pode ser acessada por qualquer função. Ou seja, uma variávelglobal está disponível para uso em todo o seu programa após sua declaração. A seguirestá o exemplo usando variáveis globais e locais -

#include <iostream> using namespace std;

Variáveis Locais

Demonstração ao vivo

Variáveis globais

Demonstração ao vivo

Page 17: Guia rápido da linguagem C++(JN)

// Global variable declaration: int g; int main () { // Local variable declaration: int a, b; // actual initialization a = 10; b = 20; g = a + b; cout << g; return 0; }

Um programa pode ter o mesmo nome para variáveis locais e globais, mas o valor davariável local dentro de uma função terá preferência. Por exemplo -

#include <iostream> using namespace std; // Global variable declaration: int g = 20; int main () { // Local variable declaration: int g = 10; cout << g; return 0; }

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

10

Quando uma variável local é definida, ela não é inicializada pelo sistema, você deveinicializá-la você mesmo. Variáveis globais são inicializadas automaticamente pelosistema quando você as define da seguinte forma -

Tipo de dados Inicializador

int 0

Caracteres '\ 0'

flutuador 0

em dobro 0

ponteiro NULO

Demonstração ao vivo

Inicializando Variáveis Locais e Globais

Page 18: Guia rápido da linguagem C++(JN)

É uma boa prática de programação inicializar as variáveis adequadamente; casocontrário, às vezes, o programa produziria resultados inesperados.

Constantes / literais em C ++Constantes referem-se a valores fixos que o programa pode não alterar e são chamadosde literais .

Constantes podem ser de qualquer tipo de dados básicos e podem ser divididos emnúmeros inteiros, números de ponto flutuante, caracteres, seqüências de caracteres evalores booleanos.

Novamente, as constantes são tratadas como variáveis regulares, exceto que seusvalores não podem ser modificados após sua definição.

Um literal inteiro pode ser uma constante decimal, octal ou hexadecimal. Um prefixoespecifica a base ou base: 0x ou 0X para hexadecimal, 0 para octal e nada paradecimal.

Um literal inteiro também pode ter um sufixo que é uma combinação de U e L, paraunsigned e long, respectivamente. O sufixo pode ser maiúsculo ou minúsculo e podeestar em qualquer ordem.

Aqui estão alguns exemplos de literais inteiros -

212 // Legal

215u // Legal

0xFeeL // Legal

078 // Illegal: 8 is not an octal digit

032UU // Illegal: cannot repeat a suffix

A seguir estão outros exemplos de vários tipos de literais Integer -

85 // decimal

0213 // octal

0x4b // hexadecimal

30 // int

30u // unsigned int

30l // long

30ul // unsigned long

Um literal de ponto flutuante tem uma parte inteira, um ponto decimal, uma partefracionária e uma parte exponencial. Você pode representar literais de ponto flutuanteno formato decimal ou exponencial.

Literais Inteiros

Literais de ponto flutuante

Page 19: Guia rápido da linguagem C++(JN)

Ao representar usando o formato decimal, você deve incluir o ponto decimal, oexpoente ou ambos e, ao representar usando o formato exponencial, você deve incluira parte inteira, a parte fracionária ou ambas. O expoente assinado é introduzido por eou E.

Aqui estão alguns exemplos de literais de ponto flutuante -

3.14159 // Legal

314159E-5L // Legal

510E // Illegal: incomplete exponent

210f // Illegal: no decimal or exponent

.e55 // Illegal: missing integer or fraction

Existem dois literais booleanos e fazem parte das palavras-chave padrão do C ++ -

Um valor de true representando true.

Um valor de falso representando falso.

Você não deve considerar o valor de true igual a 1 e o valor de false igual a 0.

Literais de caracteres são colocados entre aspas simples. Se o literal começar com L(somente maiúsculo), ele é um literal de caractere largo (por exemplo, L'x ') e deve serarmazenado no tipo de variável wchar_t . Caso contrário, é um literal de caractereestreito (por exemplo, 'x') e pode ser armazenado em uma variável simples do tipochar .

Um literal de caractere pode ser um caractere simples (por exemplo, 'x'), umaseqüência de escape (por exemplo, '\ t') ou um caractere universal (por exemplo, '\u02C0').

Existem certos caracteres em C ++ quando eles são precedidos por uma barra invertidaque terão um significado especial e são usados para representar como newline (\ n) outab (\ t). Aqui, você tem uma lista de alguns desses códigos de seqüência de escape -

Sequência de fuga Significado

\\ \ personagem

\ ' ' personagem

\ " " personagem

\? ? personagem

\uma Alerta ou sino

Literatura Booleana

Literatura de Personagem

Page 20: Guia rápido da linguagem C++(JN)

\ b Backspace

\ f Feed de formulário

\ n Nova linha

\ r Retorno de carro

\ t Guia horizontal

\ v Guia vertical

\ ooo Número octal de um a três dígitos

\ xhh. . . Número hexadecimal de um ou mais dígitos

A seguir está o exemplo para mostrar alguns caracteres de seqüência de escape -

#include <iostream> using namespace std; int main() { cout << "Hello\tWorld\n\n"; return 0; }

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Hello World

Os literais de string são colocados entre aspas duplas. Uma sequência contémcaracteres semelhantes aos literais de caracteres: caracteres simples, seqüências deescape e caracteres universais.

Você pode dividir uma linha longa em várias linhas usando literais de string e separá-lasusando espaços em branco.

Aqui estão alguns exemplos de literais de string. Todas as três formas são seqüênciasidênticas.

"hello, dear"

"hello, \

dear"

"hello, " "d" "ear"

Demonstração ao vivo

Literais de cordas

Definindo Constantes

Page 21: Guia rápido da linguagem C++(JN)

Existem duas maneiras simples em C ++ para definir constantes -

Usando o #define preprocessor.

Usando a palavra-chave const .

A seguir está o formulário para usar o #define preprocessor para definir uma constante-

#define identifier value

O exemplo a seguir explica em detalhes -

#include <iostream> using namespace std; #define LENGTH 10 #define WIDTH 5 #define NEWLINE '\n' int main() { int area; area = LENGTH * WIDTH; cout << area; cout << NEWLINE; return 0; }

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

50

Você pode usar o prefixo const para declarar constantes com um tipo específico daseguinte maneira -

const type variable = value;

O exemplo a seguir explica em detalhes -

#include <iostream> using namespace std; int main() { const int LENGTH = 10; const int WIDTH = 5; const char NEWLINE = '\n'; int area; area = LENGTH * WIDTH; cout << area; cout << NEWLINE; return 0; }

O pré-processador #define

Demonstração ao vivo

A palavra-chave const

Demonstração ao vivo

Page 22: Guia rápido da linguagem C++(JN)

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

50

Note que é uma boa prática de programação definir constantes em CAPITAL.

Tipos de modificadores de C ++C ++ permite que os tipos de dados char, int e double tenham modificadores que osprecedem. Um modificador é usado para alterar o significado do tipo de base para queele se ajuste mais precisamente às necessidades de várias situações.

Os modificadores de tipo de dados estão listados aqui -

assinado

sem assinatura

longo

baixo

Os modificadores assinados, não assinados, longos e curtos podem ser aplicados atipos base inteiros. Além disso, os assinados e não assinados podem ser aplicados aochar e o longo pode ser aplicado ao dobro.

Os modificadores assinados e não assinados também podem ser usados comoprefixo para modificadores longos ou curtos . Por exemplo, insigned long int .

C ++ permite uma notação abreviada para declarar inteiros não assinados, curtos oulongos . Você pode simplesmente usar a palavra sem assinatura, curta ou longa,sem int . Implica automaticamente int . Por exemplo, as duas instruções a seguirdeclaram variáveis inteiras sem sinal.

unsigned x;

unsigned int y;

Para entender a diferença entre o modo como os modificadores inteiros assinados e nãoassinados são interpretados por C ++, você deve executar o seguinte programa curto -

#include <iostream> using namespace std; /* This program shows the difference between * signed and unsigned integers. */ int main() { short int i; // a signed short integer short unsigned int j; // an unsigned short integer j = 50000; i = j; cout << i << " " << j; return 0; }

Demonstração ao vivo

Page 23: Guia rápido da linguagem C++(JN)

Quando este programa é executado, segue a saída -

-15536 50000

O resultado acima é porque o padrão de bits que representa 50.000 como um inteironão assinado curto é interpretado como -15,536 por um curto.

Os qualificadores de tipo fornecem informações adicionais sobre as variáveis que elesprecedem.

Sr.Não

Qualificador e Significado

1

const

Objetos do tipo const não podem ser alterados pelo seu programa durante aexecução.

2

volátil

O modificador volátil informa ao compilador que o valor de uma variável podeser alterado de maneiras não explicitamente especificadas pelo programa.

3

restringir

Um ponteiro qualificado por restrito é inicialmente o único meio pelo qual oobjeto para o qual ele aponta pode ser acessado. Apenas o C99 adiciona umnovo qualificador de tipo chamado restrict.

Classes de armazenamento em C ++Uma classe de armazenamento define o escopo (visibilidade) e o tempo de vida devariáveis e / ou funções dentro de um Programa C ++. Esses especificadores precedemo tipo que eles modificam. Existem as seguintes classes de armazenamento, que podemser usadas em um programa C ++

auto

registo

estático

extern

mutável

Tipo de Qualificadores em C ++

A classe de armazenamento automático

Page 24: Guia rápido da linguagem C++(JN)

A classe de armazenamento automático é a classe de armazenamento padrão paratodas as variáveis locais.

{

int mount;

auto int month;

}

O exemplo acima define duas variáveis com a mesma classe de armazenamento, autosó pode ser usado dentro de funções, isto é, variáveis locais.

A classe de armazenamento de registro é usada para definir variáveis locais quedevem ser armazenadas em um registro em vez de RAM. Isso significa que a variáveltem um tamanho máximo igual ao tamanho do registro (geralmente uma palavra) enão pode ter o operador '&' unário aplicado a ela (pois não tem um local de memória).

{

register int miles;

}

O registrador só deve ser usado para variáveis que requerem acesso rápido, comocontadores. Deve-se notar também que definir 'registrador' não significa que a variávelserá armazenada em um registrador. Isso significa que ele pode ser armazenado em umregistro, dependendo das restrições de hardware e implementação.

A classe de armazenamento estática instrui o compilador a manter uma variável localem existência durante a vida útil do programa, em vez de criá-lo e destruí-lo toda vezque ele entrar e sair do escopo. Portanto, tornar as variáveis locais estáticas permiteque elas mantenham seus valores entre as chamadas de função.

O modificador estático também pode ser aplicado a variáveis globais. Quando isso éfeito, faz com que o escopo da variável seja restrito ao arquivo no qual ela estádeclarada.

Em C ++, quando estática é usada em um membro de dados de classe, faz com queapenas uma cópia desse membro seja compartilhada por todos os objetos de suaclasse.

#include <iostream> // Function declaration void func(void); static int count = 10; /* Global variable */ main() { while(count--) { func();

O registro Storage Class

A classe de armazenamento estática

Demonstração ao vivo

Page 25: Guia rápido da linguagem C++(JN)

} return 0; } // Function definition void func( void ) { static int i = 5; // local static variable i++; std::cout << "i is " << i ; std::cout << " and count is " << count << std::endl; }

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

i is 6 and count is 9

i is 7 and count is 8

i is 8 and count is 7

i is 9 and count is 6

i is 10 and count is 5

i is 11 and count is 4

i is 12 and count is 3

i is 13 and count is 2

i is 14 and count is 1

i is 15 and count is 0

A classe de armazenamento externa é usada para fornecer uma referência de umavariável global que é visível para TODOS os arquivos de programa. Quando você usa'extern' a variável não pode ser inicializada, já que tudo o que ela faz é apontar o nomeda variável em um local de armazenamento que tenha sido definido anteriormente.

Quando você tem vários arquivos e define uma variável ou função global, que tambémserá usada em outros arquivos, o extern será usado em outro arquivo para fornecerreferência de variável ou função definida. Apenas para entender extern é usado paradeclarar uma variável global ou função em outro arquivo.

O modificador externo é mais comumente usado quando há dois ou mais arquivoscompartilhando as mesmas variáveis globais ou funções, conforme explicado abaixo.

#include <iostream> int count ; extern void write_extern(); main() { count = 5; write_extern(); }

A classe de armazenamento externa

Primeiro Arquivo: main.cpp

Segundo arquivo: support.cpp

Page 26: Guia rápido da linguagem C++(JN)

#include <iostream>

extern int count;

void write_extern(void) {

std::cout << "Count is " << count << std::endl;

}

Aqui, a palavra-chave externa está sendo usada para declarar a contagem em outroarquivo. Agora compile esses dois arquivos da seguinte maneira -

$g++ main.cpp support.cpp -o write

Isso produzirá um programa executável de gravação , tentará executar a gravação everificará o resultado da seguinte maneira -

$./write

5

O especificador mutável aplica-se apenas aos objetos de classe, que serão discutidosposteriormente neste tutorial. Permite que um membro de um objeto sobrescreva afunção de membro const. Ou seja, um membro mutável pode ser modificado por umafunção membro const.

Operadores em C ++Um operador é um símbolo que informa ao compilador para executar manipulaçõesmatemáticas ou lógicas específicas. C ++ é rico em operadores integrados e fornece osseguintes tipos de operadores -

Operadores aritméticos

Operadores Relacionais

Operadores lógicos

Operadores bit a bit

Operadores de atribuição

Operadores Diversos

Este capítulo examinará os operadores aritméticos, relacionais, lógicos, bit a bit, deatribuição e outros, um por um.

Existem os seguintes operadores aritméticos suportados pela linguagem C ++ -

Suponha que a variável A detenha 10 e a variável B detenha 20, então -

Mostrar exemplos

A classe de armazenamento mutável

Operadores aritméticos

Page 27: Guia rápido da linguagem C++(JN)

Operador Descrição Exemplo

+ Adiciona dois operandos A + B dará 30

- Subtrai o segundo operando do primeiro A - B vai dar -10

* Multiplica os dois operandos A * B dará 200

/ Divide o numerador por de-numerator B / A vai dar 2

%Operador de módulo e resto depois deuma divisão inteira B% A dará 0

++Incrementar operador , aumentao valor inteiro por um A ++ vai dar 11

-Decrement operador , diminui ovalor inteiro por um A-- vai dar 9

Existem os seguintes operadores relacionais suportados pela linguagem C ++

Suponha que a variável A detenha 10 e a variável B detenha 20, então -

Mostrar exemplos

Operador Descrição Exemplo

==Verifica se os valores de dois operandossão iguais ou não, se sim, a condição setorna verdadeira.

(A == B) não é verdade.

! =

Verifica se os valores de dois operandossão iguais ou não, se os valores nãoforem iguais, a condição se tornaráverdadeira.

(A! = B) é verdade.

>

Verifica se o valor do operandoesquerdo é maior que o valor dooperando direito, se sim, a condição setorna verdadeira.

(A> B) não é verdade.

<

Verifica se o valor do operandoesquerdo é menor que o valor dooperando direito, se sim, a condição setorna verdadeira.

(A <B) é verdade.

> =

Verifica se o valor do operandoesquerdo é maior ou igual ao valor dooperando direito, se sim, a condição setorna verdadeira.

(A> = B) não é verdade.

Operadores Relacionais

Page 28: Guia rápido da linguagem C++(JN)

<= Verifica se o valor do operandoesquerdo é menor ou igual ao valor dooperando direito, se sim, a condição setorna verdadeira.

(A <= B) é verdade.

Existem os seguintes operadores lógicos suportados pela linguagem C ++.

Assuma que a variável A contém 1 e a variável B contém 0, então -

Mostrar exemplos

Operador Descrição Exemplo

&&Chamado Lógico E operador. Se ambosos operandos forem diferentes de zero,a condição se tornará verdadeira.

(A && B) é falso.

||

Chamado Lógico OU Operador. Sealgum dos dois operandos for diferentede zero, a condição se tornaráverdadeira.

(A || B) é verdadeiro.

!

Operador NÃO Lógico Chamado. Usepara reverter o estado lógico de seuoperando. Se uma condição forverdadeira, o operador Lógico NOTtornará falso.

! (A && B) é verdade.

O operador bit a bit trabalha em bits e executa a operação bit a bit. As tabelas deverdade para &, | e ^ são as seguintes -

p q p & q p | q p ^ q

0 0 0 0 0

0 1 0 1 1

1 1 1 1 0

1 0 0 1 1

Assuma se A = 60; e B = 13; agora em formato binário eles serão os seguintes -

A = 0011 1100

B = 0000 1101

Operadores lógicos

Operadores bit a bit

Page 29: Guia rápido da linguagem C++(JN)

-----------------

A & B = 0000 1100

A | B = 0011 1101

A ^ B = 0011 0001

~ A = 1100 0011

Os operadores Bitwise suportados pela linguagem C ++ estão listados na tabela aseguir. Suponha que a variável A detém 60 e a variável B detenha 13, então -

Mostrar exemplos

Operador Descrição Exemplo

EBinary AND Operator copia um poucopara o resultado, se existir em ambosos operandos.

(A & B) vai dar 12, que é 0000 1100

|Operador binário OR copia um bit seexistir em um dos operandos.

(A | B) vai dar 61, que é 0011 1101

^Operador XOR binário copia o bit seestiver definido em um operando, masnão em ambos.

(A ^ B) vai dar 49, que é 0011 0001

~

Binary Ones Complement Operator éunário e tem o efeito de 'flipping' bits.

(~ A) dará -61, que é 1100 0011 noformulário de complemento de 2,devido a um número binárioassinado.

<< <<

Operador Shift Esquerdo. O valor dosoperandos esquerdos é movido para aesquerda pelo número de bitsespecificado pelo operando direito.

Um << 2 vai dar 240, que é 11110000

>>

Operador de deslocamento à direitabinário. O valor dos operandosesquerdos é movido para a direita pelonúmero de bits especificado pelooperando direito.

A >> 2 dará 15, que é 0000 1111

Existem os seguintes operadores de atribuição suportados pela linguagem C ++ -

Mostrar exemplos

Operador Descrição Exemplo

= Operador de atribuição simples, atribuivalores de operandos do lado direito ao

C = A + B atribuirá valor de A +B a C

Operadores de atribuição

Page 30: Guia rápido da linguagem C++(JN)

operando do lado esquerdo.

+ =

Adicionar operador de atribuição E,adiciona o operando à direita ao operandoà esquerda e atribui o resultado aooperando à esquerda.

C + = A é equivalente a C = C +A

- =Subtrair e operador de atribuição Subtrai ooperando direito do operando esquerdo eatribui o resultado ao operando esquerdo.

C - = A é equivalente a C = C - A

* =

Operador Multiply AND assignment,multiplica o operando à direita pelooperando à esquerda e atribui o resultadoao operando à esquerda.

C * = A é equivalente a C = C * A

/ =

Dividir AND operador de atribuição, divideo operando esquerdo pelo operando dadireita e atribui o resultado ao operandoda esquerda.

C / = A é equivalente a C = C / A

% =Operador de módulo e atribuição, levamódulo usando dois operandos e atribui oresultado ao operando esquerdo.

C% = A é equivalente a C = C%A

<< =Esquerda e operador de atribuição. C << = 2 é o mesmo que C = C

<< 2

>> =Operador de deslocamento e atribuição àdireita.

C >> = 2 é o mesmo que C = C>> 2

& = Operador Bitwise AND assignment. C & = 2 é o mesmo que C = C e 2

^ =Operador exclusivo de OR ou de atribuiçãode bits.

C ^ = 2 é o mesmo que C = C ^2

| = Operador OR ou com atribuição de bits. C | = 2 é o mesmo que C = C | 2

A tabela a seguir lista alguns outros operadores que o C ++ suporta.

Sr.Não

Operador e Descrição

1

tamanho de

O operador sizeof retorna o tamanho de uma variável. Por exemplo, sizeof(a), em que 'a' é inteiro e retornará 4.

2 Condição? X: Y

Operadores Diversos

Page 31: Guia rápido da linguagem C++(JN)

Operador condicional (?) . Se Condição for verdadeira, ela retornarávalor de X, caso contrário, retornará valor de Y.

3

,

O operador de vírgula faz com que uma sequência de operações sejaexecutada. O valor da expressão de vírgula inteira é o valor da últimaexpressão da lista separada por vírgulas.

4

. (ponto) e -> (seta)

Os operadores membros são usados para referenciar membrosindividuais de classes, estruturas e sindicatos.

5

Fundida

Os operadores de conversão convertem um tipo de dados em outro. Porexemplo, int (2.2000) retornaria 2.

6

E

Operador de ponteiro e retorna o endereço de uma variável. Por exemplo& a; dará endereço real da variável.

7

*

Operador de ponteiro * é o ponteiro para uma variável. Por exemplo *var; apontará para uma variável var.

A precedência do operador determina o agrupamento de termos em uma expressão.Isso afeta como uma expressão é avaliada. Certos operadores têm precedência maisalta que outros; por exemplo, o operador de multiplicação tem precedência mais altaque o operador de adição -

Por exemplo, x = 7 + 3 * 2; aqui, x é atribuído 13, não 20 porque o operador * temprecedência mais alta que +, então ele primeiro é multiplicado com 3 * 2 e, emseguida, adiciona 7.

Aqui, os operadores com a maior precedência aparecem na parte superior da tabela, eaqueles com os mais baixos aparecem na parte inferior. Dentro de uma expressão, osoperadores de precedência mais alta serão avaliados primeiro.

Mostrar exemplos

Categoria Operador Associatividade

Precedência de operadores em C ++

Page 32: Guia rápido da linguagem C++(JN)

Postfix () [] ->. ++ - - Esquerda para a direita

Unário + -! ~ ++ - - (tipo) * & tamanho do Direita para esquerda

Multiplicativo * /% Esquerda para a direita

Aditivo + - Esquerda para a direita

Mudança << >> Esquerda para a direita

Relacional <=>> = Esquerda para a direita

Igualdade ==! Esquerda para a direita

Bit a bit E E Esquerda para a direita

Bit a bit XOR ^ Esquerda para a direita

Bit a bit OU | Esquerda para a direita

E lógico && Esquerda para a direita

OR lógico || Esquerda para a direita

Condicional ?: Direita para esquerda

Tarefa = + = - = * = / =% = >> = << = & = ^ = | = Direita para esquerda

Vírgula , Esquerda para a direita

Tipos de Loop C ++Pode haver uma situação, quando você precisa executar um bloco de código váriasvezes. Em geral, as instruções são executadas seqüencialmente: a primeira instruçãoem uma função é executada primeiro, seguida pela segunda e assim por diante.

As linguagens de programação fornecem várias estruturas de controle que permitemcaminhos de execução mais complicados.

Uma instrução de loop nos permite executar uma instrução ou grupo de instruçõesvárias vezes e seguir a descrição geral de uma instrução de loop na maioria daslinguagens de programação -

Page 33: Guia rápido da linguagem C++(JN)

A linguagem de programação C ++ fornece o seguinte tipo de loops para lidar com osrequisitos de loop.

Sr.Não

Tipo de loop e descrição

1

enquanto loopRepete uma instrução ou grupo de instruções enquanto uma determinadacondição é verdadeira. Ele testa a condição antes de executar o corpo do loop.

2

para loopExecute uma sequência de instruções várias vezes e abrevie o código quegerencia a variável de loop.

3

fazer ... while loopComo uma instrução 'while', exceto pelo fato de testar a condição no final docorpo do loop.

4

loops aninhadosVocê pode usar um ou mais loop dentro de qualquer outro loop 'while', 'for' ou'do..while'.

As instruções de controle de loop alteram a execução de sua sequência normal. Quandoa execução deixa um escopo, todos os objetos automáticos que foram criados nesseescopo são destruídos.

C ++ suporta as seguintes instruções de controle.

Declarações de controle de loop

Page 34: Guia rápido da linguagem C++(JN)

Sr.Não

Declaração de controle e descrição

1

declaração de quebraEncerra a instrução loop ou switch e transfere a execução para a instruçãoimediatamente após o loop ou comutador.

2

continuar instruçãoFaz com que o loop pule o restante de seu corpo e repita imediatamente suacondição antes de reiterar.

3

declaração gotoTransfere o controle para a instrução rotulada. Embora não seja aconselhávelusar a instrução goto no seu programa.

Um loop se torna loop infinito se uma condição nunca se tornar falsa. O para loop étradicionalmente usado para esta finalidade. Como nenhuma das três expressões queformam o loop 'for' é necessária, você pode fazer um loop infinito deixando a expressãocondicional vazia.

#include <iostream> using namespace std; int main () { for( ; ; ) { printf("This loop will run forever.\n"); } return 0; }

Quando a expressão condicional está ausente, supõe-se que seja verdadeira. Você podeter uma inicialização e expressão de incremento, mas os programadores de C ++ maiscomumente usam a construção 'for (;;)' para significar um loop infinito.

NOTA - Você pode terminar um loop infinito pressionando as teclas Ctrl + C.

Declarações de tomada de decisão em C ++As estruturas de tomada de decisão exigem que o programador especifique uma oumais condições a serem avaliadas ou testadas pelo programa, juntamente com umadeclaração ou instruções a serem executadas se a condição for determinada comoverdadeira e, opcionalmente, outras instruções a serem executadas se a condição estádeterminado a ser falso.

A seguir está a forma geral de uma estrutura de tomada de decisão típica encontradana maioria das linguagens de programação -

O Loop Infinito

Page 35: Guia rápido da linguagem C++(JN)

A linguagem de programação C ++ fornece os seguintes tipos de declarações detomada de decisão.

Sr.Não

Declaração & Descrição

1

se declaraçãoUma instrução 'if' consiste em uma expressão booleana seguida de uma oumais instruções.

2

if ... else statementUma instrução 'if' pode ser seguida por uma instrução 'else' opcional, que éexecutada quando a expressão booleana é falsa.

3

mudar a indicaçãoUma instrução 'switch' permite que uma variável seja testada quanto àigualdade em relação a uma lista de valores.

4

aninhado se instruçõesVocê pode usar uma instrução 'if' ou 'else if' dentro de outra instrução 'if' ou'else if'.

5instruções de troca aninhadasVocê pode usar uma instrução 'switch' dentro de outra instrução 'switch'.

Nós cobrimos o operador condicional “? : " No capítulo anterior, que pode ser usadopara substituir if ... else statements. Tem a seguinte forma geral -

O ? : Operador

Page 36: Guia rápido da linguagem C++(JN)

Exp1 ? Exp2 : Exp3;

Exp1, Exp2 e Exp3 são expressões. Observe o uso e a colocação dos dois pontos.

O valor de um '? a expressão é determinada assim: Exp1 é avaliado. Se for verdade,Exp2 é avaliado e se torna o valor de todo o '? expressão. Se Exp1 for falso, Exp3 seráavaliado e seu valor se tornará o valor da expressão.

Funções C ++Uma função é um grupo de instruções que juntas executam uma tarefa. Todo programaC ++ tem pelo menos uma função, que é main () , e todos os programas mais triviaispodem definir funções adicionais.

Você pode dividir seu código em funções separadas. Como você divide seu código entrediferentes funções depende de você, mas logicamente a divisão geralmente é tal quecada função executa uma tarefa específica.

Uma declaração de função informa ao compilador sobre o nome de uma função, tipode retorno e parâmetros. Uma definição de função fornece o corpo real da função.

A biblioteca padrão C ++ fornece inúmeras funções internas que seu programa podechamar. Por exemplo, função strcat () para concatenar duas strings, função memcpy() para copiar uma localização de memória para outra localização e muitas outrasfunções.

Uma função é conhecida com vários nomes, como um método ou uma sub-rotina ou umprocedimento, etc.

A forma geral de uma definição de função C ++ é a seguinte -

return_type function_name( parameter list ) {

body of the function

}

Uma definição de função C ++ consiste em um cabeçalho de função e um corpo defunção. Aqui estão todas as partes de uma função -

Tipo de retorno - Uma função pode retornar um valor. O return_type é o tipode dados do valor que a função retorna. Algumas funções executam asoperações desejadas sem retornar um valor. Nesse caso, o return_type é apalavra-chave void .

Nome da Função - Este é o nome real da função. O nome da função e a listade parâmetros juntos constituem a assinatura da função.

Parâmetros - Um parâmetro é como um marcador de posição. Quando umafunção é chamada, você passa um valor para o parâmetro. Este valor é referidocomo parâmetro ou argumento real. A lista de parâmetros refere-se ao tipo,

Definindo uma Função

Page 37: Guia rápido da linguagem C++(JN)

ordem e número dos parâmetros de uma função. Parâmetros são opcionais; istoé, uma função pode não conter parâmetros.

Corpo da Função - O corpo da função contém uma coleção de instruções quedefinem o que a função faz.

A seguir está o código-fonte de uma função chamada max () . Esta função usa doisparâmetros num1 e num2 e retorna o maior de ambos -

// function returning the max between two numbers

int max(int num1, int num2) {

// local variable declaration

int result;

if (num1 > num2)

result = num1;

else

result = num2;

return result;

}

Uma declaração de função informa ao compilador sobre um nome de função e comochamar a função. O corpo real da função pode ser definido separadamente.

Uma declaração de função tem as seguintes partes -

return_type function_name( parameter list );

Para a função acima definida max (), segue a declaração da função -

int max(int num1, int num2);

Os nomes dos parâmetros não são importantes na declaração da função, apenas o seutipo é necessário, portanto, também é válida a declaração -

int max(int, int);

A declaração de função é necessária quando você define uma função em um arquivo deorigem e chama essa função em outro arquivo. Nesse caso, você deve declarar a funçãona parte superior do arquivo que está chamando a função.

Exemplo

Declarações de Função

Chamando uma Função

Page 38: Guia rápido da linguagem C++(JN)

Ao criar uma função C ++, você fornece uma definição do que a função deve fazer. Parausar uma função, você terá que chamar ou invocar essa função.

Quando um programa chama uma função, o controle de programa é transferido para afunção chamada. Uma função chamada realiza uma tarefa definida e quando ainstrução de retorno é executada ou quando a chave de fechamento de finalização defunção é atingida, ela retorna o controle de programa de volta ao programa principal.

Para chamar uma função, basta passar os parâmetros necessários junto com o nome dafunção e, se a função retornar um valor, você poderá armazenar o valor retornado. Porexemplo -

#include <iostream> using namespace std; // function declaration int max(int num1, int num2); int main () { // local variable declaration: int a = 100; int b = 200; int ret; // calling a function to get max value. ret = max(a, b); cout << "Max value is : " << ret << endl; return 0; } // function returning the max between two numbers int max(int num1, int num2) { // local variable declaration int result; if (num1 > num2) result = num1; else result = num2; return result; }

Eu mantive a função max () junto com a função main () e compilei o código fonte. Aoexecutar o executável final, ele produziria o seguinte resultado -

Max value is : 200

Se uma função é usar argumentos, ela deve declarar variáveis que aceitam os valoresdos argumentos. Essas variáveis são chamadas de parâmetros formais da função.

Os parâmetros formais se comportam como outras variáveis locais dentro da função esão criados após a entrada na função e destruídos na saída.

Demonstração ao vivo

Argumentos da Função

Page 39: Guia rápido da linguagem C++(JN)

Ao chamar uma função, existem duas maneiras pelas quais os argumentos podem serpassados para uma função -

Sr.Não

Tipo de chamada e descrição

1

Ligue por ValorEste método copia o valor real de um argumento no parâmetro formal dafunção. Nesse caso, as alterações feitas no parâmetro dentro da função nãoafetam o argumento.

2

Chamada por PonteiroEste método copia o endereço de um argumento no parâmetro formal. Dentroda função, o endereço é usado para acessar o argumento real usado nachamada. Isso significa que as alterações feitas no parâmetro afetam oargumento.

3

Chamada por referênciaEste método copia a referência de um argumento no parâmetro formal. Dentroda função, a referência é usada para acessar o argumento real usado nachamada. Isso significa que as alterações feitas no parâmetro afetam oargumento.

Por padrão, o C ++ usa a chamada por valor para passar argumentos. Em geral, issosignifica que o código dentro de uma função não pode alterar os argumentos usados para chamar a função e o exemplo mencionado acima, ao chamar a função max ()usando o mesmo método.

Quando você define uma função, você pode especificar um valor padrão para cada umdos últimos parâmetros. Este valor será usado se o argumento correspondente fordeixado em branco ao chamar a função.

Isso é feito usando o operador de atribuição e atribuindo valores para os argumentos nadefinição da função. Se um valor para esse parâmetro não for passado quando a funçãofor chamada, o valor fornecido padrão será usado, mas se um valor for especificado,esse valor padrão será ignorado e o valor passado será usado. Considere o seguinteexemplo -

#include <iostream> using namespace std; int sum(int a, int b = 20) { int result; result = a + b; return (result);

Valores Padrão para Parâmetros

Demonstração ao vivo

Page 40: Guia rápido da linguagem C++(JN)

} int main () { // local variable declaration: int a = 100; int b = 200; int result; // calling a function to add the values. result = sum(a, b); cout << "Total value is :" << result << endl; // calling a function again as follows. result = sum(a); cout << "Total value is :" << result << endl; return 0; }

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Total value is :300

Total value is :120

Números em C ++Normalmente, quando trabalhamos com o Numbers, usamos tipos de dados primitivos,como int, short, long, float e double, etc. Os tipos de dados numéricos, seus valorespossíveis e intervalos de números foram explicados ao discutir Tipos de Dados C ++.

Você já definiu números em vários exemplos dados nos capítulos anteriores. Aqui estáoutro exemplo consolidado para definir vários tipos de números em C ++ -

#include <iostream> using namespace std; int main () { // number definition: short s; int i; long l; float f; double d; // number assignments; s = 10; i = 1000; l = 1000000; f = 230.47; d = 30949.374; // number printing; cout << "short s :" << s << endl; cout << "int i :" << i << endl; cout << "long l :" << l << endl; cout << "float f :" << f << endl; cout << "double d :" << d << endl;

Definindo números em C ++

Demonstração ao vivo

Page 41: Guia rápido da linguagem C++(JN)

return 0; }

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

short s :10

int i :1000

long l :1000000

float f :230.47

double d :30949.4

Além das várias funções que você pode criar, o C ++ também inclui algumas funçõesúteis que você pode usar. Essas funções estão disponíveis em bibliotecas C e C ++padrão e são chamadas de funções internas. Estas são funções que podem ser incluídasno seu programa e depois usadas.

C ++ tem um rico conjunto de operações matemáticas, que podem ser executadas emvários números. A tabela a seguir lista algumas funções matemáticas internas úteisdisponíveis em C ++.

Para utilizar estas funções você precisa incluir o arquivo de cabeçalho de matemática<cmath> .

Sr.Não

Função e Propósito

1cos duplo (duplo);

Esta função assume um ângulo (como um duplo) e retorna o cosseno.

2duplo pecado (duplo);

Esta função assume um ângulo (como um duplo) e retorna o seno.

3duplo bronzeado (duplo);

Essa função leva um ângulo (como um duplo) e retorna a tangente.

4log duplo (duplo);

Essa função recebe um número e retorna o log natural desse número.

5

pow duplo (duplo, duplo);

O primeiro é um número que você deseja levantar e o segundo é o poder quevocê deseja aumentar

6 hipotenso duplo (duplo, duplo);

Operações matemáticas em C ++

Page 42: Guia rápido da linguagem C++(JN)

Se você passar essa função o comprimento de dois lados de um triânguloretângulo, ele retornará o comprimento da hipotenusa.

7sqrt duplo (duplo);

Você passa esta função um número e lhe dá a raiz quadrada.

8int abs (int);

Esta função retorna o valor absoluto de um inteiro que é passado para ela.

9

fábricas duplas (duplas);

Esta função retorna o valor absoluto de qualquer número decimal passado paraela.

10andar duplo (duplo);

Encontra o inteiro que é menor ou igual ao argumento passado para ele.

A seguir, um exemplo simples para mostrar algumas das operações matemáticas -

#include <iostream> #include <cmath> using namespace std; int main () { // number definition: short s = 10; int i = -1000; long l = 100000; float f = 230.47; double d = 200.374; // mathematical operations; cout << "sin(d) :" << sin(d) << endl; cout << "abs(i) :" << abs(i) << endl; cout << "floor(d) :" << floor(d) << endl; cout << "sqrt(f) :" << sqrt(f) << endl; cout << "pow( d, 2) :" << pow(d, 2) << endl; return 0; }

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

sign(d) :-0.634939

abs(i) :1000

floor(d) :200

sqrt(f) :15.1812

pow( d, 2 ) :40149.7

Demonstração ao vivo

Números Aleatórios em C ++

Page 43: Guia rápido da linguagem C++(JN)

Existem muitos casos em que você desejará gerar um número aleatório. Na verdade,existem duas funções que você precisa saber sobre a geração de números aleatórios. Oprimeiro é rand () , esta função só retornará um número pseudo-aleatório. A maneirade corrigir isso é primeiro chamar a função srand () .

A seguir, um exemplo simples para gerar alguns números aleatórios. Este exemplo fazuso da função time () para obter o número de segundos na hora do seu sistema, paradistribuir aleatoriamente a função rand () -

#include <iostream> #include <ctime> #include <cstdlib> using namespace std; int main () { int i,j; // set the seed srand( (unsigned)time( NULL ) ); /* generate 10 random numbers. */ for( i = 0; i < 10; i++ ) { // generate actual random number j = rand(); cout <<" Random Number : " << j << endl; } return 0; }

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Random Number : 1748144778

Random Number : 630873888

Random Number : 2134540646

Random Number : 219404170

Random Number : 902129458

Random Number : 920445370

Random Number : 1319072661

Random Number : 257938873

Random Number : 1256201101

Random Number : 580322989

Matrizes C ++C ++ fornece uma estrutura de dados, a matriz , que armazena uma coleçãosequencial de tamanho fixo de elementos do mesmo tipo. Uma matriz é usada paraarmazenar uma coleção de dados, mas geralmente é mais útil pensar em uma matrizcomo uma coleção de variáveis do mesmo tipo.

Em vez de declarar variáveis individuais, como number0, number1, ... e number99,você declara uma variável de matriz, como números, e usa números [0], números [1] e

Demonstração ao vivo

Page 44: Guia rápido da linguagem C++(JN)

..., números [99] para representar variáveis individuais. Um elemento específico emuma matriz é acessado por um índice.

Todas as matrizes consistem em locais de memória contíguos. O endereço mais baixocorresponde ao primeiro elemento e o endereço mais alto ao último elemento.

Para declarar um array em C ++, o programador especifica o tipo dos elementos e onúmero de elementos requeridos por um array como segue -

type arrayName [ arraySize ];

Isso é chamado de matriz unidimensional. O arraySize deve ser uma constante inteiramaior que zero e o tipo pode ser qualquer tipo de dado C ++ válido. Por exemplo, paradeclarar uma matriz de 10 elementos chamada equilíbrio do tipo double, use estainstrução -

double balance[10];

Você pode inicializar elementos de matriz C ++, um por um ou usando uma únicainstrução da seguinte maneira -

double balance[5] = {1000.0, 2.0, 3.4, 17.0, 50.0};

O número de valores entre chaves {} não pode ser maior que o número de elementosque declaramos para o array entre colchetes []. A seguir é um exemplo para atribuir umúnico elemento da matriz -

Se você omitir o tamanho da matriz, será criada uma matriz grande o suficiente paramanter a inicialização. Portanto, se você escrever -

double balance[] = {1000.0, 2.0, 3.4, 17.0, 50.0};

Você criará exatamente o mesmo array que no exemplo anterior.

balance[4] = 50.0;

A declaração acima atribui número elemento 5 th

na matriz um valor de 50,0. O array

com o 4º

índice será o 5º

, ou seja, o último elemento porque todos os arrays têm 0como o índice do primeiro elemento, que também é chamado de índice de base. Segue-se a representação pictórica da mesma matriz que discutimos acima -

Declarando Matrizes

Inicializando matrizes

Acessando Elementos da Matriz

Page 45: Guia rápido da linguagem C++(JN)

Um elemento é acessado pela indexação do nome da matriz. Isso é feito colocando oíndice do elemento dentro de colchetes após o nome da matriz. Por exemplo -

double salary = balance[9];

A declaração acima levará 10 th

elemento da matriz e atribuir o valor a variável salário.A seguir, um exemplo, que usará todos os três conceitos acima mencionados, viz.declaração, atribuição e acesso a matrizes -

#include <iostream> using namespace std; #include <iomanip> using std::setw; int main () { int n[ 10 ]; // n is an array of 10 integers // initialize elements of array n to 0 for ( int i = 0; i < 10; i++ ) { n[ i ] = i + 100; // set element at location i to i + 100 } cout << "Element" << setw( 13 ) << "Value" << endl; // output each array element's value for ( int j = 0; j < 10; j++ ) { cout << setw( 7 )<< j << setw( 13 ) << n[ j ] << endl; } return 0; }

Este programa faz uso da função setw () para formatar a saída. Quando o códigoacima é compilado e executado, ele produz o seguinte resultado -

Element Value

0 100

1 101

2 102

3 103

4 104

5 105

6 106

7 107

8 108

9 109

Matrizes são importantes para o C ++ e devem precisar de mais detalhes. Existemalguns conceitos importantes a seguir, que devem ser claros para um programador de C++ -

Demonstração ao vivo

Matrizes em C ++

Page 46: Guia rápido da linguagem C++(JN)

Sr.Não

Conceito e Descrição

1

Matrizes multidimensionaisC ++ suporta matrizes multidimensionais. A forma mais simples do arraymultidimensional é o array bidimensional.

2

Ponteiro para um arrayVocê pode gerar um ponteiro para o primeiro elemento de uma matrizsimplesmente especificando o nome da matriz, sem nenhum índice.

3

Passando matrizes para funçõesVocê pode passar para a função um ponteiro para uma matriz, especificando onome da matriz sem um índice.

4Retornar matriz de funçõesC ++ permite que uma função retorne uma matriz.

Cordas C ++C ++ fornece os seguintes dois tipos de representações de string -

A cadeia de caracteres de estilo C.

O tipo de classe de string introduzido com o padrão C ++.

A cadeia de caracteres de estilo C é originada na linguagem C e continua sendosuportada no C ++. Esta cadeia é, na verdade, uma matriz unidimensional decaracteres que é terminada por um caractere nulo '\ 0'. Portanto, uma cadeiaterminada com nulo contém os caracteres que compõem a cadeia, seguidos de um nulo.

A declaração e inicialização a seguir criam uma string consistindo da palavra "Hello".Para manter o caractere nulo no final da matriz, o tamanho da matriz de caracteres quecontém a seqüência de caracteres é um mais do que o número de caracteres na palavra"Hello".

char saudação [6] = {'H', 'e', 'l', 'l', 'o', '\ 0'};

Se você seguir a regra de inicialização de array, então você pode escrever a declaraçãoacima da seguinte forma -

char saudação [] = "Olá";

A seguir está a apresentação da memória da string acima definida em C / C ++ -

A cadeia de caracteres de estilo C

Page 47: Guia rápido da linguagem C++(JN)

Na verdade, você não coloca o caractere nulo no final de uma constante de string. Ocompilador C ++ coloca automaticamente o '\ 0' no final da string quando inicializa amatriz. Vamos tentar imprimir a string acima mencionada -

#include <iostream> usando namespace std ; int main () { char saudação [ 6 ] = { 'H' , 'e' , 'l' , 'l' , 'o' , '\ 0' }; cout << "Mensagem de saudação:" ; cout << saudação << endl ; return 0 ; }

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Mensagem de saudação: Olá

C ++ suporta uma ampla gama de funções que manipulam strings terminadas em null -

Sr.Não

Função e Propósito

1strcpy (s1, s2);

Copia a cadeia s2 na cadeia s1.

2strcat (s1, s2);

Concatena a string s2 no final da string s1.

3strlen (s1);

Retorna o tamanho da string s1.

4

strcmp (s1, s2);

Retorna 0 se s1 e s2 forem iguais; menor que 0 se s1 <s2; maior que 0 ses1> s2.

5 strchr (s1, ch);

Demonstração ao vivo

Page 48: Guia rápido da linguagem C++(JN)

Retorna um ponteiro para a primeira ocorrência do caractere ch na strings1.

6strstr (s1, s2);

Retorna um ponteiro para a primeira ocorrência da string s2 na string s1.

O exemplo a seguir faz uso de algumas das funções acima mencionadas -

#include <iostream> #include <cstring> usando namespace std ; int main () { char str1 [ 10 ] = "Olá" ; char str2 [ 10 ] = "mundo" ; char str3 [ 10 ]; int len ; // copia str1 no str3 strcpy ( str3 , str1 ); cout << "strcpy (str3, str1):" << str3 << endl ; // concatena str1 e str2 strcat ( str1 , str2 ); cout << "strcat (str1, str2):" << str1 << endl ; // comprimento total de str1 após concatenação len = strlen ( str1 ); cout << "strlen (str1):" << len << endl ; return 0 ; }

Quando o código acima é compilado e executado, ele produz resultado como segue -

strcpy (str3, str1): Olá

strcat (str1, str2): HelloWorld

strlen (str1): 10

A biblioteca C ++ padrão fornece um tipo de classe de string que suporta todas asoperações mencionadas acima, além de muito mais funcionalidade. Vamos verificar oseguinte exemplo -

#include <iostream> #include <string> usando namespace std ; int main () { string str1 = "Olá" ; string str2 = "mundo" ; string str3 ; int len ;

Demonstração ao vivo

A classe String em C ++

Demonstração ao vivo

Page 49: Guia rápido da linguagem C++(JN)

// copia str1 em str3 str3 = str1 ; cout << "str3:" << str3 << endl ; // concatena str1 e str2 str3 = str1 + str2 ; cout << "str1 + str2:" << str3 << endl ; // comprimento total de str3 após concatenação len = str3 . tamanho (); cout << "str3.size ():" << len << endl ; return 0 ; }

Quando o código acima é compilado e executado, ele produz resultado como segue -

str3: olá

str1 + str2: HelloWorld

str3.size (): 10

Ponteiros C ++Os ponteiros C ++ são fáceis e divertidos de aprender. Algumas tarefas do C ++ sãoexecutadas mais facilmente com ponteiros e outras tarefas do C ++, como a alocaçãode memória dinâmica, não podem ser executadas sem elas.

Como você sabe, cada variável é uma localização de memória e cada localização dememória tem seu endereço definido que pode ser acessado usando o operador Ecomercial (&) que denota um endereço na memória. Considere o seguinte que iráimprimir o endereço das variáveis definidas -

#include <iostream> using namespace std; int main () { int var1; char var2[10]; cout << "Address of var1 variable: "; cout << &var1 << endl; cout << "Address of var2 variable: "; cout << &var2 << endl; return 0; }

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Address of var1 variable: 0xbfebd5c0

Address of var2 variable: 0xbfebd5b6

Demonstração ao vivo

O que são ponteiros?

Page 50: Guia rápido da linguagem C++(JN)

Um ponteiro é uma variável cujo valor é o endereço de outra variável. Como qualquervariável ou constante, você deve declarar um ponteiro antes de poder trabalhar comele. A forma geral de uma declaração de variável de ponteiro é -

type *var-name;

Aqui, type é o tipo base do ponteiro; deve ser um tipo válido de C ++ e var-name é onome da variável de ponteiro. O asterisco que você usou para declarar um ponteiro é omesmo asterisco que você usa para multiplicação. No entanto, nesta declaração, oasterisco está sendo usado para designar uma variável como um ponteiro. A seguir, adeclaração válida do ponteiro -

int *ip; // pointer to an integer

double *dp; // pointer to a double

float *fp; // pointer to a float

char *ch // pointer to character

O tipo de dados real do valor de todos os ponteiros, seja inteiro, flutuante, caractere ounão, é o mesmo, um número hexadecimal longo que representa um endereço dememória. A única diferença entre ponteiros de diferentes tipos de dados é o tipo dedados da variável ou constante para o qual o ponteiro aponta.

Há poucas operações importantes, que faremos com os ponteiros com muitafrequência. (a) Definimos uma variável de ponteiro. (b) Atribua o endereço de umavariável a um ponteiro. (c) Finalmente, acesse o valor no endereço disponível navariável do ponteiro. Isso é feito usando o operador unário * que retorna o valor davariável localizada no endereço especificado pelo seu operando. O exemplo a seguir fazuso dessas operações -

#include <iostream> using namespace std; int main () { int var = 20; // actual variable declaration. int *ip; // pointer variable ip = &var; // store address of var in pointer variable cout << "Value of var variable: "; cout << var << endl; // print the address stored in ip pointer variable cout << "Address stored in ip variable: "; cout << ip << endl; // access the value at the address available in pointer cout << "Value of *ip variable: "; cout << *ip << endl; return 0; }

Usando ponteiros em C ++

Demonstração ao vivo

Page 51: Guia rápido da linguagem C++(JN)

Quando o código acima é compilado e executado, ele produz resultado como segue -

Value of var variable: 20

Address stored in ip variable: 0xbfc601ac

Value of *ip variable: 20

Os ponteiros possuem muitos conceitos, mas são muito importantes para aprogramação em C ++. Existem alguns conceitos de ponteiro importantes que devemser claros para um programador de C ++ -

Sr.Não

Conceito e Descrição

1

Ponteiros nulosC ++ suporta ponteiro nulo, que é uma constante com um valor zero definidoem várias bibliotecas padrão.

2

Aritmética de ponteiroExistem quatro operadores aritméticos que podem ser usados em ponteiros:++, -, +, -

3Ponteiros vs ArraysExiste uma relação estreita entre ponteiros e matrizes.

4Matriz de ponteirosVocê pode definir matrizes para manter um número de ponteiros.

5Ponteiro para ponteiroC ++ permite que você tenha ponteiro em um ponteiro e assim por diante.

6

Passando Ponteiros para FunçõesPassar um argumento por referência ou por endereço permite que oargumento transmitido seja alterado na função de chamada pela funçãochamada.

7

Retornar ponteiro de funçõesC ++ permite que uma função retorne um ponteiro para a variável local,variável estática e memória alocada dinamicamente também.

Referências C ++Uma variável de referência é um alias, ou seja, outro nome para uma variável jáexistente. Uma vez que uma referência é inicializada com uma variável, o nome da

Ponteiros em C ++

Page 52: Guia rápido da linguagem C++(JN)

variável ou o nome da referência pode ser usado para se referir à variável.

Referências são freqüentemente confundidas com ponteiros, mas três grandesdiferenças entre referências e ponteiros são -

Você não pode ter referências NULL. Você deve sempre ser capaz de assumirque uma referência está conectada a uma parte legítima de armazenamento.

Uma vez que uma referência é inicializada para um objeto, ela não pode seralterada para se referir a outro objeto. Os ponteiros podem ser apontados paraoutro objeto a qualquer momento.

Uma referência deve ser inicializada quando é criada. Os ponteiros podem serinicializados a qualquer momento.

Pense em um nome de variável como um rótulo anexado à localização da variável namemória. Você pode então pensar em uma referência como um segundo rótuloanexado a esse local de memória. Portanto, você pode acessar o conteúdo da variávelatravés do nome da variável original ou da referência. Por exemplo, suponha quetenhamos o seguinte exemplo -

int i = 17;

Podemos declarar variáveis de referência para i da seguinte maneira.

int& r = i;

Leia o & nestas declarações como referência . Assim, leia a primeira declaração como"r é uma referência de inteiro inicializada para i" e leia a segunda declaração como "s éuma referência dupla inicializada para d.". O exemplo a seguir faz uso de referênciasem int e double -

#include <iostream> using namespace std; int main () { // declare simple variables int i; double d; // declare reference variables int& r = i; double& s = d; i = 5; cout << "Value of i : " << i << endl; cout << "Value of i reference : " << r << endl; d = 11.7;

Referências vs ponteiros

Criando referências em C ++

Demonstração ao vivo

Page 53: Guia rápido da linguagem C++(JN)

cout << "Value of d : " << d << endl; cout << "Value of d reference : " << s << endl; return 0; }

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Value of i : 5

Value of i reference : 5

Value of d : 11.7

Value of d reference : 11.7

Referências são geralmente usadas para listas de argumentos de função e valores deretorno de função. Seguem-se dois assuntos importantes relacionados a referências C++ que devem ser claros para um programador C ++ -

Sr.Não

Conceito e Descrição

1

Referências como parâmetrosC ++ suporta referências de passagem como parâmetro de função com maissegurança que parâmetros.

2

Referência como Valor de RetornoVocê pode retornar referência de uma função C ++ como qualquer outro tipode dados.

Data e Hora do C ++A biblioteca padrão C ++ não fornece um tipo de data adequado. C ++ herda asestruturas e funções para manipulação de data e hora de C. Para acessar funções eestruturas relacionadas a data e hora, você precisaria incluir o arquivo de cabeçalho<ctime> em seu programa C ++.

Existem quatro tipos relacionados ao tempo: clock_t, time_t, size_t e tm . Os tipos -relógio_t, tamanho_t e tempo_t são capazes de representar a hora e a data do sistemacomo algum tipo de inteiro.

O tipo de estrutura tm contém a data e hora na forma de uma estrutura C com osseguintes elementos -

struct tm {

int tm_sec; // seconds of minutes from 0 to 61

int tm_min; // minutes of hour from 0 to 59

int tm_hour; // hours of day from 0 to 24

int tm_mday; // day of month from 1 to 31

int tm_mon; // month of year from 0 to 11

int tm_year; // year since 1900

int tm_wday; // days since sunday

Page 54: Guia rápido da linguagem C++(JN)

int tm_yday; // days since January 1st

int tm_isdst; // hours of daylight savings time

}

A seguir estão as funções importantes, que usamos ao trabalhar com data e hora em Cou C ++. Todas essas funções fazem parte da biblioteca C e C ++ padrão e você podeverificar seus detalhes usando a referência à biblioteca padrão C ++ fornecida abaixo.

Sr.Não

Função e Propósito

1

time_t time (time_t * time);

Isso retorna a hora atual do calendário do sistema em número de segundostranscorridos desde 1º de janeiro de 1970. Se o sistema não tiver tempo, 0,1será retornado.

2

char * ctime (const time_t * time);

Isso retorna um ponteiro para uma string do dia do formulário mês ano horas:minutos: segundos ano \ n \ 0 .

3struct tm * localtime (tempo de const_t * tempo);

Isso retorna um ponteiro para a estrutura tm representando a hora local.

4

clock_t clock (void);

Isso retorna um valor que se aproxima da quantidade de tempo que oprograma de chamada está sendo executado. Um valor de 0,1 será retornadose a hora não estiver disponível.

5

char * asctime (const struct tm * tempo);

Isso retorna um ponteiro para uma string que contém as informaçõesarmazenadas na estrutura apontada pelo tempo convertido para o formato: diamês data horas: minutos: segundos ano \ n \ 0

6

struct tm * gmtime (tempo de const_t * tempo);

Isso retorna um ponteiro para o tempo na forma de uma estrutura tm. A horaé representada no tempo universal coordenado (UTC), que é essencialmente otempo médio de Greenwich (GMT).

7

time_t mktime (struct tm * tempo);

Isso retorna o equivalente no tempo da agenda do tempo encontrado naestrutura apontada pelo tempo.

Page 55: Guia rápido da linguagem C++(JN)

8 double difftime (time_t time2, time_t time1);

Esta função calcula a diferença em segundos entre time1 e time2.

9

size_t strftime ();

Essa função pode ser usada para formatar data e hora em um formatoespecífico.

Suponha que você deseja recuperar a data e a hora atuais do sistema, como hora localou Hora Universal Coordenada (UTC). A seguir é o exemplo para conseguir o mesmo -

#include <iostream> #include <ctime> using namespace std; int main() { // current date/time based on current system time_t now = time(0); // convert now to string form char* dt = ctime(&now); cout << "The local date and time is: " << dt << endl; // convert now to tm struct for UTC tm *gmtm = gmtime(&now); dt = asctime(gmtm); cout << "The UTC date and time is:"<< dt << endl; }

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

The local date and time is: Sat Jan 8 20:07:41 2011

The UTC date and time is:Sun Jan 9 03:07:41 2011

A estrutura tm é muito importante ao trabalhar com data e hora em C ou C ++. Essaestrutura contém a data e a hora na forma de uma estrutura C, como mencionadoacima. A maioria das funções relacionadas ao tempo faz uso da estrutura tm. A seguir,um exemplo que faz uso de várias funções relacionadas a data e hora e estrutura tm -

Ao usar a estrutura neste capítulo, estou supondo que você tenha uma compreensãobásica sobre a estrutura C e como acessar os membros da estrutura usando o operadorarrow ->.

#include <iostream> #include <ctime>

Data e hora atuais

Demonstração ao vivo

Formatar o tempo usando o struct tm

Demonstração ao vivo

Page 56: Guia rápido da linguagem C++(JN)

using namespace std; int main() { // current date/time based on current system time_t now = time(0); cout << "Number of sec since January 1,1970:" << now << endl; tm *ltm = localtime(&now); // print various components of tm structure. cout << "Year" << 1970 + ltm->tm_year<<endl; cout << "Month: "<< 1 + ltm->tm_mon<< endl; cout << "Day: "<< ltm->tm_mday << endl; cout << "Time: "<< 1 + ltm->tm_hour << ":"; cout << 1 + ltm->tm_min << ":"; cout << 1 + ltm->tm_sec << endl; }

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Number of sec since January 1, 1970:1294548238

Year: 2011

Month: 1

Day: 8

Time: 22: 44:59

Entrada / Saída Básica C ++As bibliotecas padrão C ++ fornecem um extenso conjunto de recursos de entrada /saída, que veremos nos capítulos subseqüentes. Este capítulo discutirá as operações deE / S mais básicas e mais comuns necessárias para a programação em C ++.

C ++ E / S ocorre em fluxos, que são seqüências de bytes. Se os bytes fluírem de umdispositivo como um teclado, uma unidade de disco ou uma conexão de rede etc. para amemória principal, isso é chamado de operação de entrada e se os bytes fluem damemória principal para um dispositivo como uma tela, uma impressora, uma unidadede disco ou uma conexão de rede, etc., isso é chamado de operação de saída .

Existem os seguintes arquivos de cabeçalho importantes para os programas C ++ -

Sr.Não

Arquivo de Cabeçalho e Função e Descrição

1

<iostream>

Esse arquivo define os objetos cin, cout, cerr e clog , que correspondem aofluxo de entrada padrão, ao fluxo de saída padrão, ao fluxo de erro padrão sembuffer e ao fluxo de erro padrão armazenado em buffer, respectivamente.

2 <iomanip>

Arquivos de cabeçalho de biblioteca de E / s

Page 57: Guia rápido da linguagem C++(JN)

Este arquivo declara serviços úteis para executar E / S formatada com oschamados manipuladores de fluxo parametrizados, como setw e setprecision.

3

<fstream>

Este arquivo declara serviços para o processamento de arquivos controladopelo usuário. Discutiremos isso detalhadamente no capítulo relacionado aarquivos e fluxos.

O objeto predefinido cout é uma instância da classe ostream . Diz-se que o objetocout está "conectado" ao dispositivo de saída padrão, que geralmente é a tela deexibição. O cout é usado em conjunto com o operador de inserção de fluxo, que éescrito como <<, que são dois sinais menores que os mostrados no exemplo a seguir.

#include <iostream> using namespace std; int main() { char str[] = "Hello C++"; cout << "Value of str is : " << str << endl; }

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Value of str is : Hello C++

O compilador C ++ também determina o tipo de dados da variável a ser emitida eseleciona o operador de inserção de fluxo apropriado para exibir o valor. O operador <<está sobrecarregado para enviar itens de dados de tipos inteiros, flutuantes, duplos,sequências e valores de ponteiro.

O operador de inserção << pode ser usado mais de uma vez em uma única instruçãocomo mostrado acima e endl é usado para adicionar uma nova linha no final da linha.

O objeto predefinido cin é uma instância da classe istream . Diz-se que o objeto cinestá conectado ao dispositivo de entrada padrão, que geralmente é o teclado. O cin éusado em conjunto com o operador de extração de fluxo, que é escrito como >>, quesão dois maiores que os sinais, conforme mostrado no exemplo a seguir.

#include <iostream> using namespace std;

O fluxo de saída padrão (cout)

Demonstração ao vivo

O fluxo de entrada padrão (cin)

Demonstração ao vivo

Page 58: Guia rápido da linguagem C++(JN)

int main() { char name[50]; cout << "Please enter your name: "; cin >> name; cout << "Your name is: " << name << endl; }

Quando o código acima é compilado e executado, ele solicitará que você digite umnome. Você insere um valor e, em seguida, pressiona enter para ver o resultado aseguir -

Please enter your name: cplusplus

Your name is: cplusplus

O compilador C ++ também determina o tipo de dados do valor inserido e seleciona ooperador de extração de fluxo apropriado para extrair o valor e armazená-lo nasvariáveis fornecidas.

O operador de extração de fluxo >> pode ser usado mais de uma vez em uma únicainstrução. Para solicitar mais de um dado, você pode usar o seguinte -

cin >> name >> age;

Isso será equivalente às duas instruções a seguir -

cin >> name;

cin >> age;

O objeto predefinido cerr é uma instância da classe ostream . Diz-se que o objeto cerrestá ligado ao dispositivo de erro padrão, que também é uma tela de exibição, mas oobjeto cerr é não-bufferizado e cada inserção de fluxo em cerr faz com que sua saídaapareça imediatamente.

O cerr também é usado em conjunto com o operador de inserção de fluxo, conformemostrado no exemplo a seguir.

#include <iostream> using namespace std; int main() { char str[] = "Unable to read...."; cerr << "Error message : " << str << endl; }

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Error message : Unable to read....

O fluxo de erro padrão (cerr)

Demonstração ao vivo

O fluxo de registro padrão (entupimento)

Page 59: Guia rápido da linguagem C++(JN)

O entupimento de objeto predefinido é uma instância da classe ostream . Diz-se queo objeto clog está anexado ao dispositivo de erro padrão, que também é uma tela deexibição, mas o entupimento do objeto é armazenado em buffer. Isso significa quecada inserção para entupir poderia causar sua saída para ser mantida em um buffer atéque o buffer seja preenchido ou até que o buffer seja liberado.

O entupimento também é usado em conjunto com o operador de inserção de fluxo,conforme mostrado no exemplo a seguir.

#include <iostream> using namespace std; int main() { char str[] = "Unable to read...."; clog << "Error message : " << str << endl; }

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Error message : Unable to read....

Você não seria capaz de ver qualquer diferença em cout, cerr e entupir com essespequenos exemplos, mas ao escrever e executar programas grandes, a diferença setorna óbvia. Portanto, é uma boa prática exibir mensagens de erro usando o streamcerr e, ao exibir outras mensagens de log, o entupimento deve ser usado.

Estruturas de Dados C ++Arrays C / C ++ permitem que você defina variáveis que combinam vários itens dedados do mesmo tipo, mas a estrutura é outro tipo de dados definido pelo usuário quepermite combinar itens de dados de diferentes tipos.

As estruturas são usadas para representar um registro, suponha que você queiraacompanhar seus livros em uma biblioteca. Você pode acompanhar os seguintesatributos sobre cada livro:

Título

Autor

Sujeito

ID do livro

Para definir uma estrutura, você deve usar a instrução struct. A instrução struct defineum novo tipo de dados, com mais de um membro, para o seu programa. O formato dadeclaração struct é isso -

Demonstração ao vivo

Definindo uma Estrutura

Page 60: Guia rápido da linguagem C++(JN)

struct [structure tag] {

member definition;

member definition;

...

member definition;

} [one or more structure variables];

A tag de estrutura é opcional e cada definição de membro é uma definição de variávelnormal, como int i; ou float f; ou qualquer outra definição de variável válida. No final dadefinição da estrutura, antes do ponto-e-vírgula final, você pode especificar uma oumais variáveis de estrutura, mas é opcional. Aqui está a maneira como você declarariaa estrutura do livro -

struct Books {

char title[50];

char author[50];

char subject[100];

int book_id;

} book;

Para acessar qualquer membro de uma estrutura, usamos o operador de acesso demembro (.) . O operador de acesso de membro é codificado como um período entre onome da variável de estrutura e o membro da estrutura que desejamos acessar. Vocêusaria a palavra-chave struct para definir variáveis do tipo de estrutura. A seguir, oexemplo para explicar o uso da estrutura -

#include <iostream> #include <cstring> using namespace std; struct Books { char title[50]; char author[50]; char subject[100]; int book_id; }; int main() { struct Books Book1; // Declare Book1 of type Book struct Books Book2; // Declare Book2 of type Book // book 1 specification strcpy( Book1.title, "Learn C++ Programming"); strcpy( Book1.author, "Chand Miyan"); strcpy( Book1.subject, "C++ Programming"); Book1.book_id = 6495407; // book 2 specification strcpy( Book2.title, "Telecom Billing"); strcpy( Book2.author, "Yakit Singha"); strcpy( Book2.subject, "Telecom");

Acessando Membros da Estrutura

Demonstração ao vivo

Page 61: Guia rápido da linguagem C++(JN)

Book2.book_id = 6495700; // Print Book1 info cout << "Book 1 title : " << Book1.title <<endl; cout << "Book 1 author : " << Book1.author <<endl; cout << "Book 1 subject : " << Book1.subject <<endl; cout << "Book 1 id : " << Book1.book_id <<endl; // Print Book2 info cout << "Book 2 title : " << Book2.title <<endl; cout << "Book 2 author : " << Book2.author <<endl; cout << "Book 2 subject : " << Book2.subject <<endl; cout << "Book 2 id : " << Book2.book_id <<endl; return 0; }

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Book 1 title : Learn C++ Programming

Book 1 author : Chand Miyan

Book 1 subject : C++ Programming

Book 1 id : 6495407

Book 2 title : Telecom Billing

Book 2 author : Yakit Singha

Book 2 subject : Telecom

Book 2 id : 6495700

Você pode passar uma estrutura como um argumento de função de maneira muitosemelhante à de qualquer outra variável ou ponteiro. Você acessaria variáveis deestrutura da mesma maneira que acessou no exemplo acima -

#include <iostream> #include <cstring> using namespace std; void printBook( struct Books book ); struct Books { char title[50]; char author[50]; char subject[100]; int book_id; }; int main() { struct Books Book1; // Declare Book1 of type Book struct Books Book2; // Declare Book2 of type Book // book 1 specification strcpy( Book1.title, "Learn C++ Programming"); strcpy( Book1.author, "Chand Miyan"); strcpy( Book1.subject, "C++ Programming"); Book1.book_id = 6495407; // book 2 specification strcpy( Book2.title, "Telecom Billing");

Estruturas como Argumentos da Função

Demonstração ao vivo

Page 62: Guia rápido da linguagem C++(JN)

strcpy( Book2.author, "Yakit Singha"); strcpy( Book2.subject, "Telecom"); Book2.book_id = 6495700; // Print Book1 info printBook( Book1 ); // Print Book2 info printBook( Book2 ); return 0; } void printBook( struct Books book ) { cout << "Book title : " << book.title <<endl; cout << "Book author : " << book.author <<endl; cout << "Book subject : " << book.subject <<endl; cout << "Book id : " << book.book_id <<endl; }

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Book title : Learn C++ Programming

Book author : Chand Miyan

Book subject : C++ Programming

Book id : 6495407

Book title : Telecom Billing

Book author : Yakit Singha

Book subject : Telecom

Book id : 6495700

Você pode definir ponteiros para estruturas de maneira muito semelhante ao definir oponteiro para qualquer outra variável da seguinte maneira -

struct Books *struct_pointer;

Agora, você pode armazenar o endereço de uma variável de estrutura na variável deponteiro definida acima. Para encontrar o endereço de uma variável de estrutura,coloque o operador & antes do nome da estrutura da seguinte forma -

struct_pointer = &Book1;

Para acessar os membros de uma estrutura usando um ponteiro para essa estrutura,você deve usar o operador -> da seguinte maneira -

struct_pointer->title;

Vamos reescrever acima exemplo usando o ponteiro de estrutura, espero que isso sejafácil para você entender o conceito -

#include <iostream> #include <cstring> using namespace std; void printBook( struct Books *book );

Ponteiros para Estruturas

Demonstração ao vivo

Page 63: Guia rápido da linguagem C++(JN)

struct Books { char title[50]; char author[50]; char subject[100]; int book_id; }; int main() { struct Books Book1; // Declare Book1 of type Book struct Books Book2; // Declare Book2 of type Book // Book 1 specification strcpy( Book1.title, "Learn C++ Programming"); strcpy( Book1.author, "Chand Miyan"); strcpy( Book1.subject, "C++ Programming"); Book1.book_id = 6495407; // Book 2 specification strcpy( Book2.title, "Telecom Billing"); strcpy( Book2.author, "Yakit Singha"); strcpy( Book2.subject, "Telecom"); Book2.book_id = 6495700; // Print Book1 info, passing address of structure printBook( &Book1 ); // Print Book1 info, passing address of structure printBook( &Book2 ); return 0; } // This function accept pointer to structure as parameter. void printBook( struct Books *book ) { cout << "Book title : " << book->title <<endl; cout << "Book author : " << book->author <<endl; cout << "Book subject : " << book->subject <<endl; cout << "Book id : " << book->book_id <<endl; }

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Book title : Learn C++ Programming

Book author : Chand Miyan

Book subject : C++ Programming

Book id : 6495407

Book title : Telecom Billing

Book author : Yakit Singha

Book subject : Telecom

Book id : 6495700

Existe uma maneira mais fácil de definir estruturas ou você pode criar "alias". Porexemplo -

typedef struct {

char title[50];

char author[50];

A palavra-chave typedef

Page 64: Guia rápido da linguagem C++(JN)

char subject[100];

int book_id;

} Books;

Agora, você pode usar o Books diretamente para definir variáveis do tipo Books semusar a palavra-chave struct. A seguir está o exemplo -

Books Book1, Book2;

Você pode usar a palavra-chave typedef para não-estruturas, assim como segue -

typedef long int *pint32;

pint32 x, y, z;

x, yez são todos ponteiros para longos inteiros.

Classes e Objetos C ++O principal objetivo da programação em C ++ é adicionar orientação a objetos àlinguagem de programação em C e classes são o recurso central do C ++ que suportaprogramação orientada a objetos e são freqüentemente chamados de tipos definidospelo usuário.

Uma classe é usada para especificar a forma de um objeto e combina representação dedados e métodos para manipular esses dados em um pacote puro. Os dados e funçõesdentro de uma classe são chamados de membros da classe.

Quando você define uma classe, você define um blueprint para um tipo de dados. Issonão define realmente nenhum dado, mas define o que o nome da classe significa, istoé, em que um objeto da classe consistirá e quais operações podem ser executadas emtal objeto.

Uma definição de classe começa com a classe de palavra-chave seguida pelo nome daclasse; e o corpo da classe, cercado por um par de chaves. Uma definição de classedeve ser seguida por um ponto-e-vírgula ou por uma lista de declarações. Por exemplo,definimos o tipo de dados Box usando a classe de palavras-chave da seguinte forma:

class Box {

public:

double length; // Length of a box

double breadth; // Breadth of a box

double height; // Height of a box

};

A palavra-chave public determina os atributos de acesso dos membros da classe que asegue. Um membro público pode ser acessado de fora da classe em qualquer lugardentro do escopo do objeto de classe. Você também pode especificar os membros deuma classe como privados ou protegidos, os quais discutiremos em uma subseção.

Definições de Classe C ++

Page 65: Guia rápido da linguagem C++(JN)

Uma classe fornece os blueprints para objetos, portanto, basicamente, um objeto écriado a partir de uma classe. Nós declaramos objetos de uma classe exatamente com omesmo tipo de declaração que declaramos variáveis de tipos básicos. As seguintesdeclarações declaram dois objetos da classe Box -

Box Box1; // Declare Box1 of type Box

Box Box2; // Declare Box2 of type Box

Ambos os objetos Box1 e Box2 terão sua própria cópia dos membros de dados.

Os membros de dados públicos de objetos de uma classe podem ser acessados usandoo operador de acesso de membro direto (.). Vamos tentar o seguinte exemplo paratornar as coisas claras -

#include <iostream> using namespace std; class Box { public: double length; // Length of a box double breadth; // Breadth of a box double height; // Height of a box }; int main() { Box Box1; // Declare Box1 of type Box Box Box2; // Declare Box2 of type Box double volume = 0.0; // Store the volume of a box here // box 1 specification Box1.height = 5.0; Box1.length = 6.0; Box1.breadth = 7.0; // box 2 specification Box2.height = 10.0; Box2.length = 12.0; Box2.breadth = 13.0; // volume of box 1 volume = Box1.height * Box1.length * Box1.breadth; cout << "Volume of Box1 : " << volume <<endl; // volume of box 2 volume = Box2.height * Box2.length * Box2.breadth; cout << "Volume of Box2 : " << volume <<endl; return 0; }

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Definir objetos C ++

Acessando os Membros de Dados

Demonstração ao vivo

Page 66: Guia rápido da linguagem C++(JN)

Volume of Box1 : 210

Volume of Box2 : 1560

É importante observar que membros privados e protegidos não podem ser acessados diretamente usando o operador de acesso de membro direto (.). Vamos aprender comomembros privados e protegidos podem ser acessados.

Até agora, você tem uma idéia muito básica sobre C ++ Classes and Objects. Existemoutros conceitos interessantes relacionados a Classes e Objetos C ++ que serãodiscutidos em várias subseções listadas abaixo -

Sr.Não

Conceito e Descrição

1

Funções dos membros da classeUma função de membro de uma classe é uma função que tem sua definição ouseu protótipo dentro da definição de classe como qualquer outra variável.

2

Modificadores de Acesso de ClasseUm membro da turma pode ser definido como público, privado ou protegido.Por padrão, os membros seriam assumidos como privados.

3

Construtor e DestrutorUm construtor de classe é uma função especial em uma classe que é chamadaquando um novo objeto da classe é criado. Um destruidor também é umafunção especial que é chamada quando o objeto criado é excluído.

4

Copiar ConstrutorO construtor de cópia é um construtor que cria um objeto, inicializando-o comum objeto da mesma classe, que foi criada anteriormente.

5

Funções de amigoUma função de amigo é permitida acesso total a membros privados eprotegidos de uma classe.

6

Funções InlineCom uma função inline, o compilador tenta expandir o código no corpo dafunção no lugar de uma chamada para a função.

7este ponteiroCada objeto tem um ponteiro especial esta que aponta para o próprio objeto.

8 Ponteiro para Classes C ++

Classes e Objetos em Detalhe

Page 67: Guia rápido da linguagem C++(JN)

Um ponteiro para uma classe é feito exatamente da mesma maneira que umponteiro para uma estrutura. Na verdade, uma classe é apenas uma estruturacom funções.

9

Membros estáticos de uma classeOs membros de dados e membros da função de uma classe podem serdeclarados como estáticos.

Herança C ++Um dos conceitos mais importantes na programação orientada a objetos é o daherança. A herança nos permite definir uma classe em termos de outra classe, o quefacilita a criação e manutenção de um aplicativo. Isso também oferece umaoportunidade de reutilizar a funcionalidade do código e o tempo de implementaçãorápido.

Ao criar uma classe, em vez de escrever membros de dados e funções de membrocompletamente novos, o programador pode designar que a nova classe deve herdar osmembros de uma classe existente. Essa classe existente é chamada de classe base e anova classe é referida como a classe derivada .

A ideia de herança implementa o é um relacionamento. Por exemplo, mamífero animalIS-A, cão IS-A mamífero, portanto cão IS-A animal, e assim por diante.

Uma classe pode ser derivada de mais de uma classe, o que significa que ela podeherdar dados e funções de várias classes base. Para definir uma classe derivada,usamos uma lista de derivação de classe para especificar a (s) classe (s) base. Umalista de derivação de classes nomeia uma ou mais classes base e tem o formulário -

class derived-class: access-specifier base-class

Onde o especificador de acesso é um dos públicos, protegidos ou privados , e aclasse base é o nome de uma classe previamente definida. Se o especificador de acessonão for usado, ele será privado por padrão.

Considere uma classe de base Shape e seu Rectangle de classe derivada da seguintemaneira -

#include <iostream> using namespace std; // Base class class Shape { public: void setWidth(int w) { width = w; }

Classes Base e Derivadas

Demonstração ao vivo

Page 68: Guia rápido da linguagem C++(JN)

void setHeight(int h) { height = h; } protected: int width; int height; }; // Derived class class Rectangle: public Shape { public: int getArea() { return (width * height); } }; int main(void) { Rectangle Rect; Rect.setWidth(5); Rect.setHeight(7); // Print the area of the object. cout << "Total area: " << Rect.getArea() << endl; return 0; }

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Total area: 35

Uma classe derivada pode acessar todos os membros não particulares de sua classebase. Portanto, os membros da classe base que não devem ser acessíveis para asfunções de membro de classes derivadas devem ser declarados como privados naclasse base.

Podemos resumir os diferentes tipos de acesso de acordo com - quem pode acessá-losda seguinte maneira -

Acesso público protegido privado

Mesma classe sim sim sim

Classes Derivadas sim sim não

Fora das aulas sim não não

Uma classe derivada herda todos os métodos de classe base com as seguintes exceções-

Construtores, destrutores e construtores de cópia da classe base.

Operadores sobrecarregados da classe base.

Controle de Acesso e Herança

Page 69: Guia rápido da linguagem C++(JN)

As funções de amigo da classe base.

Ao derivar uma classe de uma classe base, a classe base pode ser herdada por meio deherança pública, protegida ou privada . O tipo de herança é especificado peloespecificador de acesso, conforme explicado acima.

Quase não usamos herança protegida ou privada , mas a herança pública écomumente usada. Ao usar diferentes tipos de herança, as seguintes regras sãoaplicadas -

Herança Pública - Ao derivar uma classe de uma classe base pública , osmembros públicos da classe base se tornam membros públicos da classederivada e os membros protegidos da classe base se tornam membrosprotegidos da classe derivada. Os membros privados de uma classe basenunca são acessíveis diretamente de uma classe derivada, mas podem seracessados por meio de chamadas para os membros públicos e protegidos daclasse base.

Herança protegida - Ao derivar de uma classe base protegida , os membrospúblicos e protegidos da classe base se tornam membros protegidos daclasse derivada.

Herança Privada - Ao derivar de uma classe base privada , membrospúblicos e protegidos da classe base se tornam membros privados da classederivada.

Uma classe C ++ pode herdar membros de mais de uma classe e aqui está a sintaxeestendida -

class derived-class: access baseA, access baseB....

Onde o acesso é um dos públicos, protegidos ou privados e seria dado para cadaclasse base e eles serão separados por vírgula como mostrado acima. Vamos tentar oseguinte exemplo -

#include <iostream> using namespace std; // Base class Shape class Shape { public: void setWidth(int w) { width = w; } void setHeight(int h) { height = h; }

Tipo de herança

Herança Múltipla

Demonstração ao vivo

Page 70: Guia rápido da linguagem C++(JN)

protected: int width; int height; }; // Base class PaintCost class PaintCost { public: int getCost(int area) { return area * 70; } }; // Derived class class Rectangle: public Shape, public PaintCost { public: int getArea() { return (width * height); } }; int main(void) { Rectangle Rect; int area; Rect.setWidth(5); Rect.setHeight(7); area = Rect.getArea(); // Print the area of the object. cout << "Total area: " << Rect.getArea() << endl; // Print the total cost of painting cout << "Total paint cost: $" << Rect.getCost(area) << endl; return 0; }

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Total area: 35

Total paint cost: $2450

Sobrecarga C ++ (Operador e Função)C ++ permite que você especifique mais de uma definição para um nome de função ouum operador no mesmo escopo, o que é chamado de sobrecarga de função esobrecarga de operador, respectivamente.

Uma declaração sobrecarregada é uma declaração que é declarada com o mesmo nomeque uma declaração declarada anteriormente no mesmo escopo, exceto que ambas asdeclarações possuem argumentos diferentes e obviamente uma definição diferente(implementação).

Quando você chama uma função ou operador sobrecarregado , o compiladordetermina a definição mais apropriada a ser usada, comparando os tipos de argumentoque você usou para chamar a função ou operador com os tipos de parâmetro

Page 71: Guia rápido da linguagem C++(JN)

especificados nas definições. O processo de seleção da função ou operadorsobrecarregado mais apropriado é chamado de resolução de sobrecarga .

Você pode ter várias definições para o mesmo nome de função no mesmo escopo. Adefinição da função deve diferir uma da outra pelos tipos e / ou pelo número deargumentos na lista de argumentos. Você não pode sobrecarregar as declarações defunção que diferem apenas pelo tipo de retorno.

A seguir, o exemplo em que a mesma função print () está sendo usada para imprimirdiferentes tipos de dados -

#include <iostream> using namespace std; class printData { public: void print(int i) { cout << "Printing int: " << i << endl; } void print(double f) { cout << "Printing float: " << f << endl; } void print(char* c) { cout << "Printing character: " << c << endl; } }; int main(void) { printData pd; // Call print to print integer pd.print(5); // Call print to print float pd.print(500.263); // Call print to print character pd.print("Hello C++"); return 0; }

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Printing int: 5

Printing float: 500.263

Printing character: Hello C++

Você pode redefinir ou sobrecarregar a maioria dos operadores internos disponíveis emC ++. Assim, um programador também pode usar operadores com tipos definidos pelousuário.

Sobrecarga de função em C ++

Demonstração ao vivo

Sobrecarga de operadores em C ++

Page 72: Guia rápido da linguagem C++(JN)

Os operadores sobrecarregados são funções com nomes especiais: a palavra-chave"operador" seguida do símbolo para o operador que está sendo definido. Como qualqueroutra função, um operador sobrecarregado possui um tipo de retorno e uma lista deparâmetros.

Box operator+(const Box&);

declara o operador de adição que pode ser usado para adicionar dois objetos Box eretorna o objeto Box final. A maioria dos operadores sobrecarregados pode ser definidacomo funções comuns de não membros ou como funções de membros de classes. Casodefinamos a função acima como função não-membro de uma classe, então teríamosque passar dois argumentos para cada operando da seguinte forma -

Box operator+(const Box&, const Box&);

A seguir, o exemplo para mostrar o conceito de operador sobre carregamento usandouma função de membro. Aqui um objeto é passado como um argumento cujaspropriedades serão acessadas usando este objeto, o objeto que irá chamar esteoperador pode ser acessado usando este operador como explicado abaixo -

#include <iostream> using namespace std; class Box { public: double getVolume(void) { return length * breadth * height; } void setLength( double len ) { length = len; } void setBreadth( double bre ) { breadth = bre; } void setHeight( double hei ) { height = hei; } // Overload + operator to add two Box objects. Box operator+(const Box& b) { Box box; box.length = this->length + b.length; box.breadth = this->breadth + b.breadth; box.height = this->height + b.height; return box; } private: double length; // Length of a box double breadth; // Breadth of a box double height; // Height of a box }; // Main function for the program int main() { Box Box1; // Declare Box1 of type Box Box Box2; // Declare Box2 of type Box Box Box3; // Declare Box3 of type Box double volume = 0.0; // Store the volume of a box here

Demonstração ao vivo

Page 73: Guia rápido da linguagem C++(JN)

// box 1 specification Box1.setLength(6.0); Box1.setBreadth(7.0); Box1.setHeight(5.0); // box 2 specification Box2.setLength(12.0); Box2.setBreadth(13.0); Box2.setHeight(10.0); // volume of box 1 volume = Box1.getVolume(); cout << "Volume of Box1 : " << volume <<endl; // volume of box 2 volume = Box2.getVolume(); cout << "Volume of Box2 : " << volume <<endl; // Add two object as follows: Box3 = Box1 + Box2; // volume of box 3 volume = Box3.getVolume(); cout << "Volume of Box3 : " << volume <<endl; return 0; }

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Volume of Box1 : 210

Volume of Box2 : 1560

Volume of Box3 : 5400

A seguir, a lista de operadores que podem ser sobrecarregados -

+ - * / % ^

E | ~ ! , =

< > <= > = ++ -

<< << >> == ! = && ||

+ = - = / = % = ^ = & =

| = * = << = >> = [] ()

-> - * Novo Novo [] excluir delete []

A seguir é a lista de operadores, que não podem ser sobrecarregados -

:: . * . ?:

Sobrecarregável / não-sobrecarregávelOperadores

Page 74: Guia rápido da linguagem C++(JN)

Aqui estão vários exemplos de sobrecarga do operador para ajudá-lo a entender oconceito.

Sr. Não Operadores e Exemplo

1 Sobrecarregamento de operadores unários

2 Sobrecarga de operadores binários

3 Sobrecarga de operadores relacionais

4 Sobrecarga de operadores de entrada / saída

5 ++ e - Sobrecarga de Operadores

6 Sobrecarga de operadores de atribuição

7 Chamada de função () Sobrecarga de operador

8 Sobrecarregando [] Sobrecarga do Operador

9 Operador de acesso a membros da classe -> Sobrecarga

Polimorfismo em C ++A palavra polimorfismo significa ter muitas formas. Normalmente, o polimorfismoocorre quando há uma hierarquia de classes e elas são relacionadas por herança.

O polimorfismo C ++ significa que uma chamada para uma função-membro fará comque uma função diferente seja executada, dependendo do tipo de objeto que invoca afunção.

Considere o seguinte exemplo em que uma classe base foi derivada por outras duasclasses -

#include <iostream> using namespace std; class Shape { protected: int width, height; public: Shape( int a = 0, int b = 0){ width = a; height = b; } int area() { cout << "Parent class area :" <<endl; return 0; } }; class Rectangle: public Shape {

Exemplos de sobrecarga do operador

Demonstração ao vivo

Page 75: Guia rápido da linguagem C++(JN)

public: Rectangle( int a = 0, int b = 0):Shape(a, b) { } int area () { cout << "Rectangle class area :" <<endl; return (width * height); } }; class Triangle: public Shape { public: Triangle( int a = 0, int b = 0):Shape(a, b) { } int area () { cout << "Triangle class area :" <<endl; return (width * height / 2); } }; // Main function for the program int main() { Shape *shape; Rectangle rec(10,7); Triangle tri(10,5); // store the address of Rectangle shape = &rec; // call rectangle area. shape->area(); // store the address of Triangle shape = &tri; // call triangle area. shape->area(); return 0; }

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Parent class area :

Parent class area :

O motivo da saída incorreta é que a chamada da área de função () está sendo definidauma vez pelo compilador como a versão definida na classe base. Isso é chamado deresolução estática da chamada de função ou de ligação estática - a chamada defunção é corrigida antes de o programa ser executado. Isso às vezes também échamado de ligação antecipada porque a função area () é definida durante acompilação do programa.

Mas agora, vamos fazer uma ligeira modificação no nosso programa e preceder adeclaração de area () na classe Shape com a palavra-chave virtual para que fiqueassim -

class Shape {

protected:

int width, height;

Page 76: Guia rápido da linguagem C++(JN)

public:

Shape( int a = 0, int b = 0) {

width = a;

height = b;

}

virtual int area() {

cout << "Parent class area :" <<endl;

return 0;

}

};

Após essa pequena modificação, quando o código de exemplo anterior é compilado eexecutado, ele produz o seguinte resultado -

Rectangle class area

Triangle class area

Desta vez, o compilador olha o conteúdo do ponteiro em vez do tipo. Portanto, como osendereços dos objetos das classes tri e rec são armazenados na forma *, a respectivafunção area () é chamada.

Como você pode ver, cada uma das classes filhas possui uma implementação separadapara a área de função (). É assim que o polimorfismo é geralmente usado. Você temclasses diferentes com uma função de mesmo nome e até mesmo os mesmosparâmetros, mas com implementações diferentes.

Uma função virtual é uma função em uma classe base que é declarada usando apalavra-chave virtual . Definindo em uma classe base uma função virtual, com outraversão em uma classe derivada, sinaliza ao compilador que não queremos ligaçãoestática para esta função.

O que queremos é a seleção da função a ser chamada em qualquer ponto do programapara ser baseada no tipo de objeto para o qual ela é chamada. Esse tipo de operação échamado de ligação dinâmica ou ligação tardia .

É possível que você queira incluir uma função virtual em uma classe base para que elapossa ser redefinida em uma classe derivada para se adequar aos objetos dessa classe,mas que não haja nenhuma definição significativa que você possa dar para a função naclasse base. .

Podemos mudar a área de função virtual () na classe base para o seguinte -

class Shape {

protected:

Função virtual

Funções virtuais puras

Page 77: Guia rápido da linguagem C++(JN)

int width, height;

public:

Shape(int a = 0, int b = 0) {

width = a;

height = b;

}

// pure virtual function

virtual int area() = 0;

};

O = 0 informa ao compilador que a função não tem corpo e que a função virtual acimaserá chamada de função virtual pura .

Abstração de dados em C ++A abstração de dados refere-se a fornecer apenas informações essenciais para o mundoexterno e ocultar seus detalhes de segundo plano, ou seja, representar as informaçõesnecessárias no programa sem apresentar os detalhes.

Abstração de dados é uma técnica de programação (e design) que depende daseparação entre interface e implementação.

Vamos dar um exemplo da vida real de uma TV, que você pode ligar e desligar, alterar ocanal, ajustar o volume e adicionar componentes externos, como alto-falantes,videocassetes e DVD players, mas você não sabe seus detalhes internos, que é, vocênão sabe como recebe sinais através do ar ou através de um cabo, como os traduz e,finalmente, os exibe na tela.

Assim, podemos dizer que uma televisão separa claramente sua implementação internade sua interface externa e você pode brincar com suas interfaces como o botão liga /desliga, o trocador de canais e o controle de volume sem ter conhecimento zero desuas partes internas.

Em C ++, as classes fornecem um ótimo nível de abstração de dados . Eles fornecemmétodos públicos suficientes para o mundo exterior para brincar com a funcionalidadedo objeto e manipular dados de objeto, ou seja, estado sem realmente saber como aclasse foi implementada internamente.

Por exemplo, seu programa pode fazer uma chamada para a função sort () sem saberqual algoritmo a função realmente usa para classificar os valores fornecidos. Naverdade, a implementação subjacente da funcionalidade de classificação pode mudarentre as versões da biblioteca e, desde que a interface permaneça a mesma, suachamada de função ainda funcionará.

Em C ++, usamos classes para definir nossos próprios tipos de dados abstratos (ADT).Você pode usar o objeto cout da classe ostream para transmitir dados para uma saídapadrão como essa -

Page 78: Guia rápido da linguagem C++(JN)

#include <iostream> using namespace std; int main() { cout << "Hello C++" <<endl; return 0; }

Aqui, você não precisa entender como o cout exibe o texto na tela do usuário. Vocêprecisa apenas conhecer a interface pública e a implementação subjacente do 'cout' élivre para mudar.

Em C ++, usamos rótulos de acesso para definir a interface abstrata para a classe. Umaturma pode conter zero ou mais etiquetas de acesso -

Os membros definidos com um rótulo público podem ser acessados por todas aspartes do programa. A visão de abstração de dados de um tipo é definida porseus membros públicos.

Membros definidos com um rótulo particular não são acessíveis ao código queusa a classe. As seções privadas ocultam a implementação do código que usa otipo.

Não há restrições sobre a frequência com que um rótulo de acesso pode aparecer. Cadarótulo de acesso especifica o nível de acesso das definições de membros sucessivas. Onível de acesso especificado permanece em vigor até que o próximo rótulo de acessoseja encontrado ou a chave direita de fechamento do corpo da classe seja vista.

A abstração de dados fornece duas vantagens importantes -

Internos de classe são protegidos contra erros inadvertidos no nível do usuário,o que pode corromper o estado do objeto.

A implementação da classe pode evoluir ao longo do tempo em resposta arequisitos em constante mudança ou relatórios de bugs sem a necessidade dealterações no código em nível de usuário.

Ao definir membros de dados apenas na seção privada da classe, o autor da classe estálivre para fazer alterações nos dados. Se a implementação for alterada, somente ocódigo da turma precisará ser examinado para ver o que a alteração pode ter. Se osdados forem públicos, qualquer função que acesse diretamente os membros de dadosda representação antiga poderá ser interrompida.

Demonstração ao vivo

Rótulos de Acesso Aplicam Abstração

Benefícios da abstração de dados

Exemplo de abstração de dados

Page 79: Guia rápido da linguagem C++(JN)

Qualquer programa C ++ no qual você implementa uma classe com membros públicose privados é um exemplo de abstração de dados. Considere o seguinte exemplo -

#include <iostream> using namespace std; class Adder { public: // constructor Adder(int i = 0) { total = i; } // interface to outside world void addNum(int number) { total += number; } // interface to outside world int getTotal() { return total; }; private: // hidden data from outside world int total; }; int main() { Adder a; a.addNum(10); a.addNum(20); a.addNum(30); cout << "Total " << a.getTotal() <<endl; return 0; }

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Total 60

Acima da classe adiciona números juntos e retorna a soma. Os membros públicos -addNum e getTotal são as interfaces para o mundo externo e um usuário precisaconhecê-los para usar a classe. O total de membros privados é algo que o usuário nãoprecisa conhecer, mas é necessário para que a classe funcione corretamente.

A abstração separa o código em interface e implementação. Portanto, ao projetar seucomponente, você deve manter a interface independente da implementação, de modoque, se você alterar a implementação subjacente, a interface permanecerá intacta.

Nesse caso, quaisquer que sejam os programas que usem essas interfaces, eles nãosofrerão impacto e precisarão apenas de uma recompilação com a implementação maisrecente.

Demonstração ao vivo

Estratégia de Design

Page 80: Guia rápido da linguagem C++(JN)

Encapsulamento de Dados em C ++Todos os programas C ++ são compostos dos dois elementos fundamentais a seguir -

Instruções do programa (código) - Esta é a parte de um programa queexecuta ações e elas são chamadas de funções.

Dados do programa - Os dados são as informações do programa que sãoafetadas pelas funções do programa.

O encapsulamento é um conceito de Programação Orientada a Objetos que une osdados e as funções que manipulam os dados, e que mantém a segurança deinterferências externas e uso indevido. O encapsulamento de dados levou aoimportante conceito OOP de ocultamento de dados .

O encapsulamento de dados é um mecanismo de agrupamento de dados, e asfunções que os utilizam e a abstração de dados é um mecanismo de exposiçãoapenas das interfaces e de ocultação dos detalhes da implementação do usuário.

O C ++ suporta as propriedades de encapsulamento e ocultação de dados por meio dacriação de tipos definidos pelo usuário, chamados classes . Nós já estudamos que umaclasse pode conter membros privados, protegidos e públicos . Por padrão, todos ositens definidos em uma classe são privados. Por exemplo -

class Box {

public:

double getVolume(void) {

return length * breadth * height;

}

private:

double length; // Length of a box

double breadth; // Breadth of a box

double height; // Height of a box

};

As variáveis comprimento, largura e altura são privadas . Isso significa que eles podemser acessados apenas por outros membros da classe Box e não por qualquer outraparte do programa. Esta é uma forma de encapsulamento é alcançado.

Para tornar partes de uma classe públicas (ou seja, acessíveis a outras partes doprograma), você deve declará-las após a palavra-chave pública . Todas as variáveis oufunções definidas após o especificador público são acessíveis por todas as outrasfunções do programa.

Tornar uma classe um amigo de outro expõe os detalhes da implementação e reduz oencapsulamento. O ideal é manter tantos detalhes de cada classe escondidos de todasas outras classes quanto possível.

Page 81: Guia rápido da linguagem C++(JN)

Qualquer programa C ++ no qual você implementa uma classe com membros públicose privados é um exemplo de encapsulamento de dados e abstração de dados. Considereo seguinte exemplo -

#include <iostream> using namespace std; class Adder { public: // constructor Adder(int i = 0) { total = i; } // interface to outside world void addNum(int number) { total += number; } // interface to outside world int getTotal() { return total; }; private: // hidden data from outside world int total; }; int main() { Adder a; a.addNum(10); a.addNum(20); a.addNum(30); cout << "Total " << a.getTotal() <<endl; return 0; }

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Total 60

Acima da classe adiciona números juntos e retorna a soma. Os membros públicosaddNum e getTotal são as interfaces para o mundo externo e um usuário precisaconhecê-los para usar a classe. O total de membros privados é algo que está oculto domundo externo, mas é necessário para que a classe funcione adequadamente.

A maioria de nós aprendeu a tornar os membros da turma privados por padrão, amenos que realmente precisemos expô-los. Isso é apenas bom encapsulamento .

Exemplo de encapsulamento de dados

Demonstração ao vivo

Estratégia de Design

Page 82: Guia rápido da linguagem C++(JN)

Isso é aplicado com mais freqüência aos membros de dados, mas se aplica igualmentea todos os membros, incluindo funções virtuais.

Interfaces em C ++ (Abstract Classes)Uma interface descreve o comportamento ou os recursos de uma classe C ++ sem secomprometer com uma implementação específica dessa classe.

As interfaces C ++ são implementadas usando classes abstratas e essas classesabstratas não devem ser confundidas com a abstração de dados, que é um conceito demanter os detalhes da implementação separados dos dados associados.

Uma classe é feita abstrata, declarando pelo menos uma de suas funções como funçãovirtual pura . Uma função virtual pura é especificada colocando "= 0" em suadeclaração como segue -

class Box {

public:

// pure virtual function

virtual double getVolume() = 0;

private:

double length; // Length of a box

double breadth; // Breadth of a box

double height; // Height of a box

};

A finalidade de uma classe abstrata (geralmente chamada de ABC) é fornecer umaclasse base apropriada da qual outras classes possam herdar. Classes abstratas nãopodem ser usadas para instanciar objetos e servem apenas como uma interface . Atentativa de instanciar um objeto de uma classe abstrata causa um erro de compilação.

Assim, se uma subclasse de um ABC precisa ser instanciada, ele deve implementarcada uma das funções virtuais, o que significa que ele suporta a interface declaradapelo ABC. Falha ao substituir uma função virtual pura em uma classe derivada e, emseguida, tentar instanciar objetos dessa classe, é um erro de compilação.

Classes que podem ser usadas para instanciar objetos são chamadas de classesconcretas .

Considere o exemplo a seguir, em que a classe pai fornece uma interface para a classebase para implementar uma função chamada getArea () -

#include <iostream> using namespace std; // Base class class Shape {

Exemplo de Classe Abstrata

Demonstração ao vivo

Page 83: Guia rápido da linguagem C++(JN)

public: // pure virtual function providing interface framework. virtual int getArea() = 0; void setWidth(int w) { width = w; } void setHeight(int h) { height = h; } protected: int width; int height; }; // Derived classes class Rectangle: public Shape { public: int getArea() { return (width * height); } }; class Triangle: public Shape { public: int getArea() { return (width * height)/2; } }; int main(void) { Rectangle Rect; Triangle Tri; Rect.setWidth(5); Rect.setHeight(7); // Print the area of the object. cout << "Total Rectangle area: " << Rect.getArea() << endl; Tri.setWidth(5); Tri.setHeight(7); // Print the area of the object. cout << "Total Triangle area: " << Tri.getArea() << endl; return 0; }

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Total Rectangle area: 35

Total Triangle area: 17

Você pode ver como uma classe abstrata definiu uma interface em termos de getArea ()e duas outras classes implementaram a mesma função, mas com um algoritmodiferente para calcular a área específica da forma.

Estratégia de Design

Page 84: Guia rápido da linguagem C++(JN)

Um sistema orientado a objetos pode usar uma classe base abstrata para fornecer umainterface comum e padronizada apropriada para todos os aplicativos externos. Então,através da herança daquela classe base abstrata, são formadas classes derivadas queoperam de maneira similar.

As capacidades (isto é, as funções públicas) oferecidas pelos aplicativos externos sãofornecidas como funções virtuais puras na classe base abstrata. As implementaçõesdessas funções virtuais puras são fornecidas nas classes derivadas que correspondemaos tipos específicos do aplicativo.

Essa arquitetura também permite que novos aplicativos sejam adicionados a umsistema facilmente, mesmo depois que o sistema tiver sido definido.

Arquivos C ++ e StreamsAté agora, temos usado a biblioteca padrão iostream , que fornece métodos cin ecout para leitura de entrada e gravação padrão para saída padrão, respectivamente.

Este tutorial vai te ensinar como ler e escrever de um arquivo. Isso requer outrabiblioteca C ++ padrão chamada fstream , que define três novos tipos de dados -

Sr.Não

Tipo de dados e descrição

1

ofstream

Esse tipo de dados representa o fluxo do arquivo de saída e é usado para criararquivos e gravar informações em arquivos.

2

ifstream

Esse tipo de dados representa o fluxo do arquivo de entrada e é usado para lerinformações dos arquivos.

3

fstream

Esse tipo de dados geralmente representa o fluxo de arquivos e tem osrecursos de ofstream e ifstream, o que significa que ele pode criar arquivos,gravar informações em arquivos e ler informações de arquivos.

Para executar o processamento de arquivos em C ++, os arquivos de cabeçalho<iostream> e <fstream> devem ser incluídos no arquivo de origem do C ++.

Um arquivo deve ser aberto antes que você possa ler ou gravar nele. Qualquer objetoofstream ou fstream pode ser usado para abrir um arquivo para gravação. E o objetoifstream é usado para abrir um arquivo apenas para fins de leitura.

Abrindo um arquivo

Page 85: Guia rápido da linguagem C++(JN)

A seguir está a sintaxe padrão da função open (), que é um membro dos objetosfstream, ifstream e ofstream.

void open(const char *filename, ios::openmode mode);

Aqui, o primeiro argumento especifica o nome e a localização do arquivo a ser aberto eo segundo argumento da função de membro open () define o modo no qual o arquivodeve ser aberto.

Sr.Não

Modo Flag & Description

1ios :: app

Anexar modo. Toda a saída para esse arquivo deve ser anexada ao final.

2

ios :: ate

Abra um arquivo para saída e mova o controle de leitura / gravação para ofinal do arquivo.

3ios :: in

Abra um arquivo para leitura.

4ios: out

Abra um arquivo para escrever.

5ios :: trunc

Se o arquivo já existir, seu conteúdo será truncado antes de abrir o arquivo.

Você pode combinar dois ou mais desses valores OR agrupando-os. Por exemplo, sevocê deseja abrir um arquivo no modo de gravação e deseja truncá-lo no caso de jáexistir, segue a sintaxe -

ofstream outfile;

outfile.open("file.dat", ios::out | ios::trunc );

De maneira semelhante, você pode abrir um arquivo para ler e escrever propósito daseguinte forma -

fstream afile;

afile.open("file.dat", ios::out | ios::in );

Quando um programa C ++ termina, automaticamente libera todos os fluxos, liberatoda a memória alocada e fecha todos os arquivos abertos. Mas é sempre uma boa

Fechando um arquivo

Page 86: Guia rápido da linguagem C++(JN)

prática que um programador feche todos os arquivos abertos antes do término doprograma.

A seguir está a sintaxe padrão para a função close (), que é um membro dos objetosfstream, ifstream e ofstream.

void close();

Ao fazer a programação em C ++, você grava informações em um arquivo do programausando o operador de inserção de fluxo (<<) da mesma forma que usa esse operadorpara gerar informações na tela. A única diferença é que você usa um objeto ofstreamou fstream em vez do objeto cout .

Você lê as informações de um arquivo em seu programa usando o operador de extraçãode fluxos (>>) assim como usa esse operador para inserir informações do teclado. Aúnica diferença é que você usa um objeto ifstream ou fstream em vez do objeto cin .

A seguir é o programa C ++ que abre um arquivo no modo de leitura e escrita. Depoisde escrever as informações inseridas pelo usuário em um arquivo chamado afile.dat, oprograma lê as informações do arquivo e as envia para a tela -

#include <fstream> #include <iostream> using namespace std; int main () { char data[100]; // open a file in write mode. ofstream outfile; outfile.open("afile.dat"); cout << "Writing to the file" << endl; cout << "Enter your name: "; cin.getline(data, 100); // write inputted data into the file. outfile << data << endl; cout << "Enter your age: "; cin >> data; cin.ignore(); // again write inputted data into the file. outfile << data << endl; // close the opened file. outfile.close();

Escrevendo para um arquivo

Lendo de um arquivo

Exemplo de leitura e gravação

Demonstração ao vivo

Page 87: Guia rápido da linguagem C++(JN)

// open a file in read mode. ifstream infile; infile.open("afile.dat"); cout << "Reading from the file" << endl; infile >> data; // write the data at the screen. cout << data << endl; // again read the data from the file and display it. infile >> data; cout << data << endl; // close the opened file. infile.close(); return 0; }

Quando o código acima é compilado e executado, ele produz a seguinte entrada e saídade amostra -

$./a.out

Writing to the file

Enter your name: Zara

Enter your age: 9

Reading from the file

Zara

9

Os exemplos acima fazem uso de funções adicionais do objeto cin, como a funçãogetline () para ler a linha de fora e a função ignore () para ignorar os caracteres extrasdeixados pela instrução de leitura anterior.

Ambos istream e ostream fornecem funções de membro para reposicionar o ponteirode posição do arquivo. Essas funções de membro são seekg ("seek get") para istreame seekp ("seek put") para ostream.

O argumento para seekg e seekp normalmente é um inteiro longo. Um segundoargumento pode ser especificado para indicar a direção da busca. A direção de buscapode ser ios :: beg (o padrão) para posicionamento relativo ao início de um fluxo, ios:: cur para posicionamento relativo à posição atual em um fluxo ou ios :: end paraposicionamento em relação ao final de um fluxo corrente.

O ponteiro de posição do arquivo é um valor inteiro que especifica o local no arquivocomo um número de bytes do local inicial do arquivo. Alguns exemplos deposicionamento do ponteiro de posição do arquivo "get" são -

// position to the nth byte of fileObject (assumes ios::beg)

fileObject.seekg( n );

Ponteiros de posição de arquivo

Page 88: Guia rápido da linguagem C++(JN)

// position n bytes forward in fileObject

fileObject.seekg( n, ios::cur );

// position n bytes back from end of fileObject

fileObject.seekg( n, ios::end );

// position at end of fileObject

fileObject.seekg( 0, ios::end );

Manipulação de exceção de C ++Uma exceção é um problema que surge durante a execução de um programa. Umaexceção de C ++ é uma resposta a uma circunstância excepcional que surge enquantoum programa está em execução, como uma tentativa de dividir por zero.

Exceções fornecem uma maneira de transferir o controle de uma parte de um programapara outro. O tratamento de exceções do C ++ é construído sobre três palavras-chave:try, catch e throw .

throw - Um programa gera uma exceção quando um problema é exibido. Isso éfeito usando uma palavra-chave throw .

catch - Um programa captura uma exceção com um manipulador de exceçãono local em um programa onde você deseja lidar com o problema. A palavra-chave catch indica a captura de uma exceção.

try - Um bloco try identifica um bloco de código para o qual exceçõesespecíficas serão ativadas. É seguido por um ou mais blocos de captura.

Supondo que um bloco irá gerar uma exceção, um método detecta uma exceção usandouma combinação das palavras-chave try e catch . Um bloco try / catch é colocado emtorno do código que pode gerar uma exceção. O código dentro de um bloco try / catch éreferido como código protegido, e a sintaxe para usar try / catch da seguinte forma -

try {

// protected code

} catch( ExceptionName e1 ) {

// catch block

} catch( ExceptionName e2 ) {

// catch block

} catch( ExceptionName eN ) {

// catch block

}

Você pode listar várias instruções catch para capturar diferentes tipos de exceções,caso seu bloco try aumente mais de uma exceção em situações diferentes.

Lançando exceções

Page 89: Guia rápido da linguagem C++(JN)

Exceções podem ser lançadas em qualquer lugar dentro de um bloco de código usandoinstrução throw . O operando da instrução throw determina um tipo para a exceção epode ser qualquer expressão e o tipo do resultado da expressão determina o tipo deexceção emitida.

A seguir, um exemplo de lançamento de uma exceção quando ocorre a divisão porcondição zero -

double division(int a, int b) {

if( b == 0 ) {

throw "Division by zero condition!";

}

return (a/b);

}

O bloco catch após o bloco try captura qualquer exceção. Você pode especificar o tipode exceção que deseja capturar e isso é determinado pela declaração de exceção queaparece entre parênteses após a captura de palavra-chave.

try {

// protected code

} catch( ExceptionName e ) {

// code to handle ExceptionName exception

}

O código acima detectará uma exceção do tipo ExceptionName . Se você quiserespecificar que um bloco catch deve manipular qualquer tipo de exceção que é lançadoem um bloco try, você deve colocar reticências, ..., entre os parênteses, incluindo adeclaração de exceção da seguinte maneira -

try {

// protected code

} catch(...) {

// code to handle any exception

}

O seguinte é um exemplo, que lança uma divisão por exceção zero e nós a pegamos nobloco catch.

#include <iostream> using namespace std; double division(int a, int b) { if( b == 0 ) { throw "Division by zero condition!"; } return (a/b); } int main () {

Captura de exceções

Demonstração ao vivo

Page 90: Guia rápido da linguagem C++(JN)

int x = 50; int y = 0; double z = 0; try { z = division(x, y); cout << z << endl; } catch (const char* msg) { cerr << msg << endl; } return 0; }

Porque estamos levantando uma exceção do tipo const char * , então enquantopegamos essa exceção, temos que usar const char * no bloco catch. Se compilarmos eexecutarmos o código acima, isso produziria o seguinte resultado -

Division by zero condition!

C ++ fornece uma lista de exceções padrão definidas em <exception>, que podemosusar em nossos programas. Estes são organizados em uma hierarquia de classes pai-filho mostrada abaixo -

Aqui está a pequena descrição de cada exceção mencionada na hierarquia acima -

Sr. Excepção e Descrição

Exceções padrão de C ++

Page 91: Guia rápido da linguagem C++(JN)

Não

1std :: exception

Uma exceção e classe pai de todas as exceções padrão do C ++.

2std :: bad_alloc

Isso pode ser jogado por novo .

3std :: bad_cast

Isso pode ser lançado por dynamic_cast .

4

std :: bad_exception

Este é um dispositivo útil para manipular exceções inesperadas em umprograma C ++.

5std :: bad_typeid

Isso pode ser lançado por typeid .

6std :: logic_error

Uma exceção que teoricamente pode ser detectada lendo o código.

7

std :: domain_error

Esta é uma exceção lançada quando um domínio matematicamente inválido éusado.

8std :: invalid_argument

Isso é lançado devido a argumentos inválidos.

9std :: length_error

Isso é lançado quando um std :: string muito grande é criado.

10

std :: out_of_range

Isto pode ser lançado pelo método 'at', por exemplo, std :: vector e std ::bitset <> :: operator [] ().

11std :: runtime_error

Uma exceção que teoricamente não pode ser detectada lendo o código.

12

Page 92: Guia rápido da linguagem C++(JN)

std :: overflow_error

Isso é acionado se ocorrer um estouro matemático.

13std :: range_error

Isso ocorre quando você tenta armazenar um valor que está fora do intervalo.

14std :: underflow_error

Isso é acionado se ocorrer um underflow matemático.

Você pode definir suas próprias exceções herdando e substituindo a funcionalidade daclasse de exceção . A seguir está o exemplo, que mostra como você pode usar a classestd :: exception para implementar sua própria exceção de maneira padrão -

#include <iostream> #include <exception> using namespace std; struct MyException : public exception { const char * what () const throw () { return "C++ Exception"; } }; int main() { try { throw MyException(); } catch(MyException& e) { std::cout << "MyException caught" << std::endl; std::cout << e.what() << std::endl; } catch(std::exception& e) { //Other errors } }

Isso produziria o seguinte resultado -

MyException caught

C++ Exception

Aqui, what () é um método público fornecido pela classe de exceção e foi substituídopor todas as classes de exceção filho. Isso retorna a causa de uma exceção.

Memória Dinâmica C ++Um bom entendimento de como a memória dinâmica realmente funciona em C ++ éessencial para se tornar um bom programador em C ++. Memória no seu programa C++ é dividido em duas partes -

Definir novas exceções

Demonstração ao vivo

Page 93: Guia rápido da linguagem C++(JN)

A pilha - Todas as variáveis declaradas dentro da função ocuparão a memóriada pilha.

A pilha - Esta é a memória não usada do programa e pode ser usada paraalocar a memória dinamicamente quando o programa é executado.

Muitas vezes, você não está ciente antecipadamente de quanto de memória precisaráarmazenar informações específicas em uma variável definida e o tamanho da memórianecessária pode ser determinado em tempo de execução.

Você pode alocar memória em tempo de execução dentro do heap para a variável deum determinado tipo usando um operador especial em C ++ que retorna o endereço doespaço alocado. Este operador é chamado de novo operador.

Se você não precisar mais de memória alocada dinamicamente, poderá usar o operadordelete , que desaloca a memória que foi anteriormente alocada pelo novo operador.

Existe uma sintaxe genérica a seguir para usar o novo operador para alocar memóriadinamicamente para qualquer tipo de dados.

new data-type;

Aqui, o tipo de dados pode ser qualquer tipo de dados interno, incluindo uma matrizou qualquer tipo de dados definido pelo usuário, incluindo classe ou estrutura. Vamoscomeçar com tipos de dados integrados. Por exemplo, podemos definir um ponteiropara digitar duplo e, em seguida, solicitar que a memória seja alocada no tempo deexecução. Podemos fazer isso usando o novo operador com as seguintes afirmações -

double* pvalue = NULL; // Pointer initialized with null

pvalue = new double; // Request memory for the variable

A memória pode não ter sido alocada com sucesso, se a loja gratuita tiver sido usada.Portanto, é uma boa prática verificar se o novo operador está retornando o ponteiroNULL e executar a ação apropriada conforme abaixo -

double* pvalue = NULL;

if( !(pvalue = new double )) {

cout << "Error: out of memory." <<endl;

exit(1);

}

A função malloc () de C, ainda existe em C ++, mas é recomendado evitar o uso dafunção malloc (). A principal vantagem de new over malloc () é que new não apenasaloca memória, ela constrói objetos que são o propósito principal de C ++.

A qualquer momento, quando você sentir que uma variável que foi alocadadinamicamente não é mais necessária, você pode liberar a memória que ela ocupa noarmazenamento gratuito com o operador 'delete' da seguinte maneira -

novos e excluir operadores

Page 94: Guia rápido da linguagem C++(JN)

delete pvalue; // Release memory pointed to by pvalue

Vamos colocar os conceitos acima e formar o seguinte exemplo para mostrar como'novo' e 'excluir' trabalho -

#include <iostream> using namespace std; int main () { double* pvalue = NULL; // Pointer initialized with null pvalue = new double; // Request memory for the variable *pvalue = 29494.99; // Store value at allocated address cout << "Value of pvalue : " << *pvalue << endl; delete pvalue; // free up the memory. return 0; }

Se compilarmos e executarmos o código acima, isso produziria o seguinte resultado -

Value of pvalue : 29495

Considere que você deseja alocar memória para uma matriz de caracteres, ou seja,uma cadeia de 20 caracteres. Usando a mesma sintaxe que usamos acima, podemosalocar memória dinamicamente como mostrado abaixo.

char* pvalue = NULL; // Pointer initialized with null

pvalue = new char[20]; // Request memory for the variable

Para remover a matriz que acabamos de criar, a declaração ficaria assim:

delete [] pvalue; // Delete array pointed to by pvalue

Seguindo a sintaxe genérica similar do novo operador, você pode alocar para umamatriz multidimensional da seguinte maneira -

double** pvalue = NULL; // Pointer initialized with null

pvalue = new double [3][4]; // Allocate memory for a 3x4 array

No entanto, a sintaxe para liberar a memória para o array multidimensional aindapermanecerá igual à anterior.

delete [] pvalue; // Delete array pointed to by pvalue

Objetos não são diferentes dos tipos de dados simples. Por exemplo, considere o códigoa seguir, onde vamos usar uma matriz de objetos para esclarecer o conceito -

#include <iostream> using namespace std;

Demonstração ao vivo

Alocação Dinâmica de Memória para Matrizes

Alocação de Memória Dinâmica para Objetos

Demonstração ao vivo

Page 95: Guia rápido da linguagem C++(JN)

class Box { public: Box() { cout << "Constructor called!" <<endl; } ~Box() { cout << "Destructor called!" <<endl; } }; int main() { Box* myBoxArray = new Box[4]; delete [] myBoxArray; // Delete array return 0; }

Se você fosse alocar uma matriz de quatro objetos Box, o construtor Simple seriachamado quatro vezes e, da mesma forma, ao excluir esses objetos, o destruidortambém seria chamado o mesmo número de vezes.

Se compilarmos e executarmos o código acima, isso produziria o seguinte resultado -

Constructor called!

Constructor called!

Constructor called!

Constructor called!

Destructor called!

Destructor called!

Destructor called!

Destructor called!

Namespaces em C ++Considere uma situação, quando temos duas pessoas com o mesmo nome, Zara, namesma classe. Sempre que precisarmos diferenciá-los definitivamente teríamos queusar algumas informações adicionais junto com o nome delas, como a área, se elasmoram em áreas diferentes ou o nome da mãe ou do pai, etc.

A mesma situação pode surgir em seus aplicativos C ++. Por exemplo, você pode estarescrevendo algum código que possui uma função chamada xyz () e há outra bibliotecadisponível que também possui a mesma função xyz (). Agora o compilador não temcomo saber qual versão da função xyz () você está se referindo dentro do seu código.

Um namespace é projetado para superar essa dificuldade e é usado como informaçãoadicional para diferenciar funções similares, classes, variáveis, etc. com o mesmo nomedisponível em bibliotecas diferentes. Usando namespace, você pode definir o contextono qual os nomes são definidos. Em essência, um namespace define um escopo.

Uma definição de espaço de nomes começa com o espaço de nomes da palavra-chaveseguido pelo nome do espaço de nomes da seguinte forma -

Definindo um namespace

Page 96: Guia rápido da linguagem C++(JN)

namespace namespace_name {

// code declarations

}

Para chamar a versão da função ou variável ativada para namespace, adicione (: :) onome do namespace da seguinte forma -

name::code; // code could be variable or function.

Vamos ver como o namespace escopo as entidades, incluindo variáveis e funções -

#include <iostream> using namespace std; // first name space namespace first_space { void func() { cout << "Inside first_space" << endl; } } // second name space namespace second_space { void func() { cout << "Inside second_space" << endl; } } int main () { // Calls function from first name space. first_space::func(); // Calls function from second name space. second_space::func(); return 0; }

Se compilarmos e executarmos o código acima, isso produziria o seguinte resultado -

Inside first_space

Inside second_space

Você também pode evitar prefixar os namespaces com a diretiva using namespace .Essa diretiva informa ao compilador que o código subseqüente está usando nomes nonamespace especificado. O namespace é assim implícito para o seguinte código -

#include <iostream> using namespace std; // first name space namespace first_space { void func() { cout << "Inside first_space" << endl; } }

Demonstração ao vivo

A diretiva usando

Demonstração ao vivo

Page 97: Guia rápido da linguagem C++(JN)

// second name space namespace second_space { void func() { cout << "Inside second_space" << endl; } } using namespace first_space; int main () { // This calls function from first name space. func(); return 0; }

Se compilarmos e executarmos o código acima, isso produziria o seguinte resultado -

Inside first_space

A diretiva 'using' também pode ser usada para se referir a um item específico dentro deum namespace. Por exemplo, se a única parte do namespace padrão que você pretendeusar for cout, você poderá consultá-la da seguinte maneira -

using std::cout;

Código subseqüente pode se referir a cout sem prefixar o namespace, mas outros itensno namespace std ainda precisarão ser explícitos da seguinte forma -

#include <iostream> using std::cout; int main () { cout << "std::endl is used with std!" << std::endl; return 0; }

Se compilarmos e executarmos o código acima, isso produziria o seguinte resultado -

std::endl is used with std!

Os nomes introduzidos em uma diretiva using obedecem às regras normais de escopo.O nome é visível desde o ponto da diretiva using até o final do escopo no qual adiretiva é encontrada. Entidades com o mesmo nome definido em um escopo externoestão ocultas.

Um namespace pode ser definido em várias partes e, portanto, um namespace écomposto da soma de suas partes definidas separadamente. As partes separadas de umnamespace podem ser distribuídas em vários arquivos.

Portanto, se uma parte do namespace exigir um nome definido em outro arquivo, essenome ainda deverá ser declarado. Escrever uma definição de namespace a seguir defineum novo namespace ou adiciona novos elementos a um existente -

Demonstração ao vivo

Namespaces descontíguos

Page 98: Guia rápido da linguagem C++(JN)

namespace namespace_name {

// code declarations

}

Os namespaces podem ser aninhados, onde você pode definir um namespace dentro deoutro espaço de nomes da seguinte maneira -

namespace namespace_name1 {

// code declarations

namespace namespace_name2 {

// code declarations

}

}

Você pode acessar os membros do namespace aninhado usando os operadores deresolução da seguinte maneira:

// to access members of namespace_name2

using namespace namespace_name1::namespace_name2;

// to access members of namespace:name1

using namespace namespace_name1;

Nas declarações acima, se você estiver usando o namespace_name1, ele fará com queos elementos do namespace_name2 estejam disponíveis no escopo da seguintemaneira -

#include <iostream> using namespace std; // first name space namespace first_space { void func() { cout << "Inside first_space" << endl; } // second name space namespace second_space { void func() { cout << "Inside second_space" << endl; } } } using namespace first_space::second_space; int main () { // This calls function from second name space. func(); return 0; }

Se compilarmos e executarmos o código acima, isso produziria o seguinte resultado -

Namespaces aninhados

Demonstração ao vivo

Page 99: Guia rápido da linguagem C++(JN)

Inside second_space

Modelos C ++Modelos são a base da programação genérica, que envolve escrever código de maneiraindependente de qualquer tipo específico.

Um modelo é um plano ou fórmula para criar uma classe ou função genérica. Oscontêineres da biblioteca, como iteradores e algoritmos, são exemplos de programaçãogenérica e foram desenvolvidos usando o conceito de modelo.

Há uma única definição de cada contêiner, como vetor , mas podemos definir muitostipos diferentes de vetores, por exemplo, vetor <int> ou vetor <string> .

Você pode usar modelos para definir funções, bem como classes, vamos ver como elesfuncionam -

A forma geral de uma definição de função de modelo é mostrada aqui -

template <class type> ret-type func-name(parameter list) {

// body of function

}

Aqui, type é um nome de espaço reservado para um tipo de dados usado pela função.Este nome pode ser usado dentro da definição da função.

A seguir, o exemplo de um modelo de função que retorna o máximo de dois valores -

#include <iostream> #include <string> using namespace std; template <typename T> inline T const& Max (T const& a, T const& b) { return a < b ? b:a; } int main () { int i = 39; int j = 20; cout << "Max(i, j): " << Max(i, j) << endl; double f1 = 13.5; double f2 = 20.7; cout << "Max(f1, f2): " << Max(f1, f2) << endl; string s1 = "Hello"; string s2 = "World"; cout << "Max(s1, s2): " << Max(s1, s2) << endl; return 0; }

Se compilarmos e executarmos o código acima, isso produziria o seguinte resultado -

Modelo de Função

Demonstração ao vivo

Page 100: Guia rápido da linguagem C++(JN)

Max(i, j): 39

Max(f1, f2): 20.7

Max(s1, s2): World

Assim como podemos definir modelos de função, também podemos definir modelos declasses. A forma geral de uma declaração de classe genérica é mostrada aqui -

template <class type> class class-name {

.

.

.

}

Aqui, type é o nome do tipo de espaço reservado, que será especificado quando umaclasse for instanciada. Você pode definir mais de um tipo de dados genérico usandouma lista separada por vírgulas.

A seguir, o exemplo para definir a classe Stack <> e implementar métodos genéricospara empurrar e estourar os elementos da pilha -

#include <iostream> #include <vector> #include <cstdlib> #include <string> #include <stdexcept> using namespace std; template <class T> class Stack { private: vector<T> elems; // elements public: void push(T const&); // push element void pop(); // pop element T top() const; // return top element bool empty() const { // return true if empty. return elems.empty(); } }; template <class T> void Stack<T>::push (T const& elem) { // append copy of passed element elems.push_back(elem); } template <class T> void Stack<T>::pop () { if (elems.empty()) { throw out_of_range("Stack<>::pop(): empty stack"); } // remove last element

Modelo de Classe

Demonstração ao vivo

Page 101: Guia rápido da linguagem C++(JN)

elems.pop_back(); } template <class T> T Stack<T>::top () const { if (elems.empty()) { throw out_of_range("Stack<>::top(): empty stack"); } // return copy of last element return elems.back(); } int main() { try { Stack<int> intStack; // stack of ints Stack<string> stringStack; // stack of strings // manipulate int stack intStack.push(7); cout << intStack.top() <<endl; // manipulate string stack stringStack.push("hello"); cout << stringStack.top() << std::endl; stringStack.pop(); stringStack.pop(); } catch (exception const& ex) { cerr << "Exception: " << ex.what() <<endl; return -1; } }

Se compilarmos e executarmos o código acima, isso produziria o seguinte resultado -

7

hello

Exception: Stack<>::pop(): empty stack

Pré-processador de C ++Os pré-processadores são as diretivas, que fornecem instruções ao compilador parapré-processar as informações antes que a compilação real seja iniciada.

Todas as diretivas de pré-processador começam com # e somente os caracteres deespaço em branco podem aparecer antes de uma diretiva de pré-processamento emuma linha. Diretivas de pré-processador não são instruções C ++, portanto, elas nãoterminam em um ponto-e-vírgula (;).

Você já viu uma diretiva #include em todos os exemplos. Essa macro é usada paraincluir um arquivo de cabeçalho no arquivo de origem.

Há um número de diretivas de pré-processador suportadas pelo C ++, como #include,#define, #if, #else, #line, etc. Vamos ver diretivas importantes -

O pré-processador #define

Page 102: Guia rápido da linguagem C++(JN)

A diretiva de pré-processador #define cria constantes simbólicas. A constante simbólicaé chamada de macro e a forma geral da diretiva é -

#define macro-name replacement-text

Quando esta linha aparece em um arquivo, todas as ocorrências subseqüentes demacro nesse arquivo serão substituídas pelo texto de substituição antes que oprograma seja compilado. Por exemplo -

#include <iostream> using namespace std; #define PI 3.14159 int main () { cout << "Value of PI :" << PI << endl; return 0; }

Agora, vamos fazer o pré-processamento deste código para ver o resultado assumindoque temos o arquivo de código-fonte. Então vamos compilar com a opção -E eredirecionar o resultado para test.p. Agora, se você verificar o test.p, ele terá muitasinformações e, na parte inferior, você encontrará o valor substituído da seguintemaneira -

$gcc -E test.cpp > test.p

...

int main () {

cout << "Value of PI :" << 3.14159 << endl;

return 0;

}

Você pode usar #define para definir uma macro que receberá argumentos da seguintemaneira -

#include <iostream> using namespace std; #define MIN(a,b) (((a)<(b)) ? a : b) int main () { int i, j; i = 100; j = 30; cout <<"The minimum is " << MIN(i, j) << endl; return 0; }

Macros de função semelhante

Demonstração ao vivo

Page 103: Guia rápido da linguagem C++(JN)

Se compilarmos e executarmos o código acima, isso produziria o seguinte resultado -

The minimum is 30

Existem várias diretivas, que podem ser usadas para compilar partes seletivas docódigo-fonte do seu programa. Esse processo é chamado de compilação condicional.

A construção do pré-processador condicional é muito parecida com a estrutura deseleção 'if'. Considere o seguinte código de pré-processador -

#ifndef NULL

#define NULL 0

#endif

Você pode compilar um programa para fins de depuração. Você também pode ativar oudesativar a depuração usando uma única macro da seguinte maneira -

#ifdef DEBUG

cerr <<"Variable x = " << x << endl;

#endif

Isso faz com que a instrução cerr seja compilada no programa se a constante simbólicaDEBUG tiver sido definida antes da diretiva #ifdef DEBUG. Você pode usar a instrução#if 0 para comentar uma parte do programa da seguinte maneira -

#if 0

code prevented from compiling

#endif

Vamos tentar o seguinte exemplo -

#include <iostream> using namespace std; #define DEBUG #define MIN(a,b) (((a)<(b)) ? a : b) int main () { int i, j; i = 100; j = 30; #ifdef DEBUG cerr <<"Trace: Inside main function" << endl; #endif #if 0 /* This is commented part */ cout << MKSTR(HELLO C++) << endl; #endif cout <<"The minimum is " << MIN(i, j) << endl; #ifdef DEBUG

Compilação Condicional

Demonstração ao vivo

Page 104: Guia rápido da linguagem C++(JN)

cerr <<"Trace: Coming out of main function" << endl; #endif return 0; }

Se compilarmos e executarmos o código acima, isso produziria o seguinte resultado -

The minimum is 30

Trace: Inside main function

Trace: Coming out of main function

Os operadores de pré-processamento # e ## estão disponíveis em C ++ e ANSI / ISOC. O operador # faz com que um token de texto de substituição seja convertido emuma cadeia de caracteres entre aspas.

Considere a seguinte definição de macro -

#include <iostream> using namespace std; #define MKSTR( x ) #x int main () { cout << MKSTR(HELLO C++) << endl; return 0; }

Se compilarmos e executarmos o código acima, isso produziria o seguinte resultado -

HELLO C++

Vamos ver como isso funcionou. É simples entender que o pré-processador de C ++transforma a linha -

cout << MKSTR(HELLO C++) << endl;

Acima da linha será transformada na seguinte linha -

cout << "HELLO C++" << endl;

O operador ## é usado para concatenar dois tokens. Aqui está um exemplo -

#define CONCAT( x, y ) x ## y

Quando o CONCAT aparece no programa, seus argumentos são concatenados e usados para substituir a macro. Por exemplo, CONCAT (HELLO, C ++) é substituído por "HELLOC ++" no programa da seguinte maneira.

#include <iostream> using namespace std; #define concat(a, b) a ## b

Os operadores # e ##

Demonstração ao vivo

Demonstração ao vivo

Page 105: Guia rápido da linguagem C++(JN)

int main() { int xy = 100; cout << concat(x, y); return 0; }

Se compilarmos e executarmos o código acima, isso produziria o seguinte resultado -

100

Vamos ver como isso funcionou. É simples entender que o pré-processador de C ++ setransforma -

cout << concat(x, y);

Acima da linha será transformada na seguinte linha -

cout << xy;

C ++ fornece um número de macros predefinidas mencionadas abaixo -

Sr.Não

Macro e Descrição

1

__LINHA__

Contém o número da linha atual do programa quando ele está sendocompilado.

2

__ARQUIVO__

Contém o nome do arquivo atual do programa quando ele está sendocompilado.

3

__ENCONTRO__

Contém uma string do formato mês / dia / ano que é a data da tradução doarquivo de origem no código de objeto.

4

__TEMPO__

Contém uma string do formato hora: minuto: segunda que é a hora em que oprograma foi compilado.

Vamos ver um exemplo para todas as macros acima -

#include <iostream> using namespace std; int main () {

Macros C ++ Predefinidos

Demonstração ao vivo

Page 106: Guia rápido da linguagem C++(JN)

cout << "Value of __LINE__ : " << __LINE__ << endl; cout << "Value of __FILE__ : " << __FILE__ << endl; cout << "Value of __DATE__ : " << __DATE__ << endl; cout << "Value of __TIME__ : " << __TIME__ << endl; return 0; }

Se compilarmos e executarmos o código acima, isso produziria o seguinte resultado -

Value of __LINE__ : 6

Value of __FILE__ : test.cpp

Value of __DATE__ : Feb 28 2011

Value of __TIME__ : 18:52:48

Manipulação de Sinal C ++Sinais são as interrupções entregues a um processo pelo sistema operacional que podeterminar um programa prematuramente. Você pode gerar interrupções pressionandoCtrl + C em um sistema UNIX, LINUX, Mac OS X ou Windows.

Existem sinais que não podem ser capturados pelo programa, mas há uma lista desinais a seguir que você pode capturar em seu programa e pode executar açõesapropriadas com base no sinal. Esses sinais são definidos no arquivo de cabeçalho C ++<csignal>.

Sr.Não

Sinal e descrição

1SIGABRT

Terminação anormal do programa, como uma chamada para abortar .

2

SIGFPE

Uma operação aritmética incorreta, como uma divisão por zero ou umaoperação resultando em estouro.

3SIGILL

Detecção de uma instrução ilegal.

4SIGINT

Recebimento de um sinal de atenção interativo.

5SIGSEGV

Um acesso inválido ao armazenamento.

6 SIGTERM

Page 107: Guia rápido da linguagem C++(JN)

Um pedido de rescisão enviado para o programa.

A biblioteca de manipulação de sinais C ++ fornece um sinal de função para capturareventos inesperados. A seguir está a sintaxe da função signal () -

void (*signal (int sig, void (*func)(int)))(int);

De forma simples, esta função recebe dois argumentos: primeiro argumento como uminteiro que representa o número do sinal e o segundo como um ponteiro para a funçãode tratamento de sinal.

Vamos escrever um programa simples em C ++ onde pegaremos o sinal SIGINT usandoa função signal (). Seja qual for o sinal que você deseja capturar no seu programa, vocêdeve registrar esse sinal usando a função de sinal e associá-lo a um manipulador desinal. Examine o seguinte exemplo -

#include <iostream> #include <csignal> using namespace std; void signalHandler( int signum ) { cout << "Interrupt signal (" << signum << ") received.\n"; // cleanup and close up stuff here // terminate program exit(signum); } int main () { // register signal SIGINT and signal handler signal(SIGINT, signalHandler); while(1) { cout << "Going to sleep...." << endl; sleep(1); } return 0; }

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Going to sleep....

Going to sleep....

Going to sleep....

Agora, pressione Ctrl + c para interromper o programa e você verá que o seu programavai pegar o sinal e sairia imprimindo algo como segue -

Going to sleep....

Going to sleep....

A função signal ()

Page 108: Guia rápido da linguagem C++(JN)

Going to sleep....

Interrupt signal (2) received.

Você pode gerar sinais pela função raise () , que recebe um número de sinal inteirocomo argumento e possui a seguinte sintaxe.

int raise (signal sig);

Aqui, sig é o número do sinal para enviar qualquer um dos sinais: SIGINT, SIGABRT,SIGFPE, SIGIL, SIGSEGV, SIGTERM, SIGHUP. A seguir está o exemplo em que elevamosum sinal internamente usando a função raise () da seguinte maneira -

#include <iostream> #include <csignal> using namespace std; void signalHandler( int signum ) { cout << "Interrupt signal (" << signum << ") received.\n"; // cleanup and close up stuff here // terminate program exit(signum); } int main () { int i = 0; // register signal SIGINT and signal handler signal(SIGINT, signalHandler); while(++i) { cout << "Going to sleep...." << endl; if( i == 3 ) { raise( SIGINT); } sleep(1); } return 0; }

Quando o código acima é compilado e executado, ele produz o seguinte resultado esairia automaticamente -

Going to sleep....

Going to sleep....

Going to sleep....

Interrupt signal (2) received.

C ++ multithreadingMultithreading é uma forma especializada de multitarefa e uma multitarefa é o recursoque permite que seu computador execute dois ou mais programas simultaneamente.

A função raise ()

Page 109: Guia rápido da linguagem C++(JN)

Em geral, existem dois tipos de multitarefa: baseada em processo e em thread.

A multitarefa baseada em processos lida com a execução simultânea de programas. Amultitarefa baseada em threads lida com a execução simultânea de partes do mesmoprograma.

Um programa multithread contém duas ou mais partes que podem ser executadassimultaneamente. Cada parte desse programa é chamada de thread e cada threaddefine um caminho separado de execução.

C ++ não contém nenhum suporte interno para aplicativos multithread. Em vez disso,ele depende inteiramente do sistema operacional para fornecer esse recurso.

Este tutorial presume que você esteja trabalhando no sistema operacional Linux e queiremos escrever um programa C ++ multi-thread usando o POSIX. Threads POSIX, ouPthreads fornece APIs que estão disponíveis em muitos sistemas POSIX semelhantes aUnix, como FreeBSD, NetBSD, GNU / Linux, Mac OS X e Solaris.

A seguinte rotina é usada para criar um encadeamento POSIX -

#include <pthread.h>

pthread_create (thread, attr, start_routine, arg)

Aqui, o pthread_create cria um novo thread e o torna executável. Essa rotina podeser chamada qualquer número de vezes em qualquer lugar dentro do seu código. Aquiestá a descrição dos parâmetros -

Sr.Não

Parâmetro e Descrição

1

fio

Um identificador exclusivo e opaco para o novo thread retornado pela sub-rotina.

2

atrito

Um objeto de atributo opaco que pode ser usado para definir atributos deencadeamento. Você pode especificar um objeto de atributos de encadeamentoou NULL para os valores padrão.

3start_routine

A rotina C ++ que o encadeamento executará depois de criado.

4 arg

Criando Threads

Page 110: Guia rápido da linguagem C++(JN)

Um único argumento que pode ser passado para start_routine. Deve serpassado por referência como um tipo de ponteiro do tipo void. NULL pode serusado se nenhum argumento tiver que ser passado.

O número máximo de encadeamentos que podem ser criados por um processo dependeda implementação. Uma vez criados, os encadeamentos são pares e podem criar outrosencadeamentos. Não há hierarquia implícita ou dependência entre threads.

Existe a seguinte rotina que usamos para finalizar um thread POSIX -

#include <pthread.h>

pthread_exit (status)

Aqui, pthread_exit é usado para sair explicitamente de um thread. Normalmente, arotina pthread_exit () é chamada depois que um encadeamento conclui seu trabalho enão é mais necessário que ele exista.

Se main () terminar antes dos threads criados e sair com pthread_exit (), os outrosthreads continuarão a executar. Caso contrário, eles serão automaticamente finalizadosquando o main () terminar.

Exemplo

Este código de exemplo simples cria 5 threads com a rotina pthread_create (). Cadathread imprime um "Hello World!" mensagem e, em seguida, termina com umachamada para pthread_exit ().

#include <iostream> #include <cstdlib> #include <pthread.h> using namespace std; #define NUM_THREADS 5 void *PrintHello(void *threadid) { long tid; tid = (long)threadid; cout << "Hello World! Thread ID, " << tid << endl; pthread_exit(NULL); } int main () { pthread_t threads[NUM_THREADS]; int rc; int i; for( i = 0; i < NUM_THREADS; i++ ) { cout << "main() : creating thread, " << i << endl; rc = pthread_create(&threads[i], NULL, PrintHello, (void *)i); if (rc) { cout << "Error:unable to create thread," << rc << endl;

Terminando Threads

Page 111: Guia rápido da linguagem C++(JN)

exit(-1); } } pthread_exit(NULL); }

Compile o seguinte programa usando a biblioteca -lpthread da seguinte maneira:

$gcc test.cpp -lpthread

Agora, execute seu programa que fornece a seguinte saída -

main() : creating thread, 0

main() : creating thread, 1

main() : creating thread, 2

main() : creating thread, 3

main() : creating thread, 4

Hello World! Thread ID, 0

Hello World! Thread ID, 1

Hello World! Thread ID, 2

Hello World! Thread ID, 3

Hello World! Thread ID, 4

Este exemplo mostra como passar vários argumentos por meio de uma estrutura. Vocêpode transmitir qualquer tipo de dados em um retorno de chamada do encadeamentoporque ele aponta para vazio, conforme explicado no exemplo a seguir -

#include <iostream> #include <cstdlib> #include <pthread.h> using namespace std; #define NUM_THREADS 5 struct thread_data { int thread_id; char *message; }; void *PrintHello(void *threadarg) { struct thread_data *my_data; my_data = (struct thread_data *) threadarg; cout << "Thread ID : " << my_data->thread_id ; cout << " Message : " << my_data->message << endl; pthread_exit(NULL); } int main () { pthread_t threads[NUM_THREADS]; struct thread_data td[NUM_THREADS]; int rc; int i;

Passando Argumentos para Threads

Page 112: Guia rápido da linguagem C++(JN)

for( i = 0; i < NUM_THREADS; i++ ) { cout <<"main() : creating thread, " << i << endl; td[i].thread_id = i; td[i].message = "This is message"; rc = pthread_create(&threads[i], NULL, PrintHello, (void *)&td[i]); if (rc) { cout << "Error:unable to create thread," << rc << endl; exit(-1); } } pthread_exit(NULL); }

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

main() : creating thread, 0

main() : creating thread, 1

main() : creating thread, 2

main() : creating thread, 3

main() : creating thread, 4

Thread ID : 3 Message : This is message

Thread ID : 2 Message : This is message

Thread ID : 0 Message : This is message

Thread ID : 1 Message : This is message

Thread ID : 4 Message : This is message

Existem duas rotinas que podemos usar para unir ou desanexar threads -

pthread_join (threadid, status)

pthread_detach (threadid)

A sub-rotina pthread_join () bloqueia o encadeamento de chamada até que oencadeamento threadid especificado termine. Quando um encadeamento é criado, umde seus atributos define se é unível ou desanexado. Somente encadeamentos criadoscomo ingressáveis podem ser unidos. Se um encadeamento for criado comodesanexado, ele nunca poderá ser unido.

Este exemplo demonstra como esperar pelas conclusões de encadeamentos usando arotina de junção Pthread.

#include <iostream> #include <cstdlib> #include <pthread.h> #include <unistd.h> using namespace std; #define NUM_THREADS 5 void *wait(void *t) { int i; long tid;

Unindo e desanexando threads

Page 113: Guia rápido da linguagem C++(JN)

tid = (long)t; sleep(1); cout << "Sleeping in thread " << endl; cout << "Thread with id : " << tid << " ...exiting " << endl; pthread_exit(NULL); } int main () { int rc; int i; pthread_t threads[NUM_THREADS]; pthread_attr_t attr; void *status; // Initialize and set thread joinable pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); for( i = 0; i < NUM_THREADS; i++ ) { cout << "main() : creating thread, " << i << endl; rc = pthread_create(&threads[i], attr, wait, (void *)i ); if (rc) { cout << "Error:unable to create thread," << rc << endl; exit(-1); } } // free attribute and wait for the other threads pthread_attr_destroy(&attr); for( i = 0; i < NUM_THREADS; i++ ) { rc = pthread_join(threads[i], &status); if (rc) { cout << "Error:unable to join," << rc << endl; exit(-1); } cout << "Main: completed thread id :" << i ; cout << " exiting with status :" << status << endl; } cout << "Main: program exiting." << endl; pthread_exit(NULL); }

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

main() : creating thread, 0

main() : creating thread, 1

main() : creating thread, 2

main() : creating thread, 3

main() : creating thread, 4

Sleeping in thread

Thread with id : 0 .... exiting

Sleeping in thread

Thread with id : 1 .... exiting

Sleeping in thread

Thread with id : 2 .... exiting

Sleeping in thread

Page 114: Guia rápido da linguagem C++(JN)

Thread with id : 3 .... exiting

Sleeping in thread

Thread with id : 4 .... exiting

Main: completed thread id :0 exiting with status :0

Main: completed thread id :1 exiting with status :0

Main: completed thread id :2 exiting with status :0

Main: completed thread id :3 exiting with status :0

Main: completed thread id :4 exiting with status :0

Main: program exiting.

Programação Web C ++

O Common Gateway Interface, ou CGI, é um conjunto de padrões que definecomo as informações são trocadas entre o servidor da Web e um scriptpersonalizado.

As especificações do CGI são atualmente mantidas pelo NCSA e o NCSA define oCGI como segue -

A Common Gateway Interface, ou CGI, é um padrão para programas degateway externos que interagem com servidores de informações, comoservidores HTTP.

A versão atual é CGI / 1.1 e o CGI / 1.2 está em andamento.

Para entender o conceito de CGI, vamos ver o que acontece quando clicamos em umhiperlink para procurar uma determinada página da web ou URL.

Seu navegador entra em contato com o servidor da Web HTTP e exige o URL, ouseja. nome do arquivo.

O Web Server analisará o URL e procurará o nome do arquivo. Se encontrar oarquivo solicitado, o servidor da web enviará o arquivo de volta para onavegador, caso contrário, enviará uma mensagem de erro indicando que vocêsolicitou um arquivo errado.

O navegador da Web recebe resposta do servidor da Web e exibe o arquivorecebido ou a mensagem de erro com base na resposta recebida.

No entanto, é possível configurar o servidor HTTP de forma que sempre que um arquivoem um determinado diretório seja solicitado, esse arquivo não seja enviado de volta;em vez disso, ele é executado como um programa e a saída produzida pelo programa éenviada de volta ao seu navegador para ser exibida.

O que é CGI?

Navegação na Web

Page 115: Guia rápido da linguagem C++(JN)

A Common Gateway Interface (CGI) é um protocolo padrão para permitir queaplicativos (chamados programas CGI ou scripts CGI) interajam com servidores Web ecom clientes. Estes programas CGI podem ser escritos em Python, PERL, Shell, C ou C++, etc.

O seguinte programa simples mostra uma arquitetura simples de CGI -

Antes de prosseguir com a programação CGI, certifique-se de que seu servidor da Websuporta CGI e está configurado para lidar com programas CGI. Todos os programas CGIa serem executados pelo servidor HTTP são mantidos em um diretório pré-configurado.Esse diretório é chamado de diretório CGI e, por convenção, é denominado / var / www/ cgi-bin. Por convenção, os arquivos CGI terão extensão como .cgi , embora sejamexecutáveis em C ++.

Por padrão, o Apache Web Server é configurado para executar programas CGI em / var/ www / cgi-bin. Se você quiser especificar qualquer outro diretório para executar seusscripts CGI, você pode modificar a seguinte seção no arquivo httpd.conf -

<Directory "/var/www/cgi-bin"> AllowOverride None Options ExecCGI Order allow,deny Allow from all </Directory> <Directory "/var/www/cgi-bin">

Diagrama de arquitetura CGI

Configuração do servidor da web

Page 116: Guia rápido da linguagem C++(JN)

Options All </Directory>

Aqui, eu suponho que você tenha o Web Server instalado e funcionando com sucesso evocê é capaz de executar qualquer outro programa CGI como Perl ou Shell etc.

Considere o seguinte conteúdo do Programa C ++ -

#include <iostream> using namespace std; int main () { cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>Hello World - First CGI Program</title>\n"; cout << "</head>\n"; cout << "<body>\n"; cout << "<h2>Hello World! This is my first CGI program</h2>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

Compile o código acima e nomeie o executável como cplusplus.cgi. Este arquivo estásendo mantido no diretório / var / www / cgi-bin e possui o seguinte conteúdo. Antesde executar seu programa CGI, certifique-se de alterar o modo de arquivo usando ocomando chmod 755 cplusplus.cgi para tornar o arquivo executável.

O programa C ++ acima é um programa simples que está gravando sua saída na telado arquivo STDOUT, por exemplo. Há um recurso importante e extra disponível, que é aimpressão de primeira linha . Tipo de conteúdo: text / html \ r \ n \ r \ n . Essalinha é enviada de volta ao navegador e especifica o tipo de conteúdo a ser exibido natela do navegador. Agora você deve ter entendido o conceito básico de CGI e podeescrever muitos programas CGI complicados usando Python. Um programa CGI C ++pode interagir com qualquer outro sistema externo, como o RDBMS, para trocarinformações.

A linha Tipo de conteúdo: text / html \ r \ n \ r \ n é uma parte do cabeçalhoHTTP, que é enviado ao navegador para entender o conteúdo. Todo o cabeçalho HTTPestará no seguinte formato -

HTTP Field Name: Field Content

Primeiro programa CGI

Meu primeiro programa CGI

Cabeçalho HTTP

Page 117: Guia rápido da linguagem C++(JN)

For Example

Content-type: text/html\r\n\r\n

Existem alguns outros cabeçalhos HTTP importantes, que você usará freqüentementeem sua programação CGI.

Sr.Não

Cabeçalho e Descrição

1

Tipo de conteúdo:

Uma sequência MIME que define o formato do arquivo que está sendoretornado. Exemplo é tipo de conteúdo: text / html.

2

Expira: Data

A data em que as informações se tornam inválidas. Isso deve ser usado pelonavegador para decidir quando uma página precisa ser atualizada. Uma stringde data válida deve estar no formato 01 de janeiro de 1998, 12:00:00 GMT.

3

Localização: URL

O URL que deve ser retornado em vez do URL solicitado. Você pode usar estecampo para redirecionar uma solicitação para qualquer arquivo.

4Última modificação: data

A data da última modificação do recurso.

5

Comprimento do conteúdo: N

O comprimento, em bytes, dos dados que estão sendo retornados. Onavegador usa esse valor para relatar o tempo estimado de download de umarquivo.

6Set-Cookie: String

Definir o cookie passado pela string .

Todo o programa CGI terá acesso às seguintes variáveis de ambiente. Essas variáveis desempenham um papel importante ao escrever qualquer programa CGI.

Sr.Não

Nome e descrição da variável

1 TIPO DE CONTEÚDO

Variáveis de ambiente CGI

Page 118: Guia rápido da linguagem C++(JN)

O tipo de dados do conteúdo, usado quando o cliente está enviando conteúdoanexado ao servidor. Por exemplo, upload de arquivos, etc.

2

COMPRIMENTO DO CONTEÚDO

O comprimento das informações de consulta disponíveis apenas parasolicitações POST.

3HTTP_COOKIE

Retorna os cookies definidos na forma de par chave e valor.

4

HTTP_USER_AGENT

O campo de cabeçalho de solicitação do User-Agent contém informações sobreo agente do usuário que originou a solicitação. É um nome do navegador daweb.

5PATH_INFO

O caminho para o script CGI.

6QUERY_STRING

As informações codificadas por URL enviadas com a solicitação do método GET.

7

REMOTE_ADDR

O endereço IP do host remoto que faz a solicitação. Isso pode ser útil para logou para fins de autenticação.

8

HOSPEDEIRO REMOTO

O nome totalmente qualificado do host que faz a solicitação. Se estainformação não estiver disponível, então REMOTE_ADDR pode ser usado paraobter o endereço de infravermelho.

9

REQUEST_METHOD

O método usado para fazer a solicitação. Os métodos mais comuns são GET ePOST.

10SCRIPT_FILENAME

O caminho completo para o script CGI.

11 SCRIPT_NAME

O nome do script CGI.

Page 119: Guia rápido da linguagem C++(JN)

12NOME DO SERVIDOR

O nome do host ou endereço IP do servidor.

13SERVER_SOFTWARE

O nome e a versão do software que o servidor está executando.

Aqui está um pequeno programa CGI para listar todas as variáveis CGI.

#include <iostream> #include <stdlib.h> using namespace std; const string ENV[ 24 ] = { "COMSPEC", "DOCUMENT_ROOT", "GATEWAY_INTERFACE", "HTTP_ACCEPT", "HTTP_ACCEPT_ENCODING", "HTTP_ACCEPT_LANGUAGE", "HTTP_CONNECTION", "HTTP_HOST", "HTTP_USER_AGENT", "PATH", "QUERY_STRING", "REMOTE_ADDR", "REMOTE_PORT", "REQUEST_METHOD", "REQUEST_URI", "SCRIPT_FILENAME", "SCRIPT_NAME", "SERVER_ADDR", "SERVER_ADMIN", "SERVER_NAME","SERVER_PORT","SERVER_PROTOCOL", "SERVER_SIGNATURE","SERVER_SOFTWARE" }; int main () { cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>CGI Environment Variables</title>\n"; cout << "</head>\n"; cout << "<body>\n"; cout << "<table border = \"0\" cellspacing = \"2\">"; for ( int i = 0; i < 24; i++ ) { cout << "<tr><td>" << ENV[ i ] << "</td><td>"; // attempt to retrieve value of environment variable char *value = getenv( ENV[ i ].c_str() ); if ( value != 0 ) { cout << value; } else { cout << "Environment variable does not exist."; } cout << "</td></tr>\n"; } cout << "</table><\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

Biblioteca CGI C ++

Page 120: Guia rápido da linguagem C++(JN)

Para exemplos reais, você precisaria fazer muitas operações pelo seu programa CGI.Existe uma biblioteca CGI escrita para o programa C ++ que você pode baixar deftp://ftp.gnu.org/gnu/cgicc/ e seguir os passos para instalar a biblioteca -

$tar xzf cgicc-X.X.X.tar.gz

$cd cgicc-X.X.X/

$./configure --prefix=/usr

$make

$make install

Você pode verificar a documentação relacionada disponível em 'C ++ CGI LibDocumentation .

Você deve ter se deparado com muitas situações quando precisar passar algumasinformações do seu navegador para o servidor da Web e, finalmente, para o seuPrograma CGI. Na maioria das vezes, o navegador usa dois métodos para passar essasinformações para o servidor da web. Esses métodos são o método GET e o métodoPOST.

O método GET envia as informações do usuário codificadas anexadas à solicitação depágina. A página e as informações codificadas são separadas por? personagem daseguinte forma -

http://www.test.com/cgi-bin/cpp.cgi?key1=value1&key2=value2

O método GET é o método padrão para passar informações do navegador para oservidor da Web e produz uma longa cadeia de caracteres que aparece na caixa Localdo seu navegador: Nunca use o método GET se você tiver senha ou outras informaçõesconfidenciais para passar para o servidor. O método GET tem limitação de tamanho evocê pode passar até 1024 caracteres em uma string de solicitação.

Ao usar o método GET, as informações são passadas usando o cabeçalho HTTPQUERY_STRING e estarão acessíveis em seu Programa CGI por meio da variável deambiente QUERY_STRING.

Você pode passar informações simplesmente concatenando pares de chave e valorjuntamente com qualquer URL ou pode usar tags HTML <FORM> para passarinformações usando o método GET.

Aqui está uma URL simples que irá passar dois valores para o programa hello_get.pyusando o método GET.

/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI

Métodos GET e POST

Passando informações usando o método GET

Exemplo de URL simples: método Get

Page 121: Guia rápido da linguagem C++(JN)

Abaixo está um programa para gerar o programa CGI cpp_get.cgi para manipular aentrada fornecida pelo navegador da web. Nós vamos usar a biblioteca CGI C ++, quetorna muito fácil o acesso a informações passadas -

#include <iostream> #include <vector> #include <string> #include <stdio.h> #include <stdlib.h> #include <cgicc/CgiDefs.h> #include <cgicc/Cgicc.h> #include <cgicc/HTTPHTMLHeader.h> #include <cgicc/HTMLClasses.h> using namespace std; using namespace cgicc; int main () { Cgicc formData; cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>Using GET and POST Methods</title>\n"; cout << "</head>\n"; cout << "<body>\n"; form_iterator fi = formData.getElement("first_name"); if( !fi->isEmpty() && fi != (*formData).end()) { cout << "First name: " << **fi << endl; } else { cout << "No text entered for first name" << endl; } cout << "<br/>\n"; fi = formData.getElement("last_name"); if( !fi->isEmpty() &&fi != (*formData).end()) { cout << "Last name: " << **fi << endl; } else { cout << "No text entered for last name" << endl; } cout << "<br/>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

Agora, compile o programa acima da seguinte forma -

$g++ -o cpp_get.cgi cpp_get.cpp -lcgicc

Gere cpp_get.cgi e coloque-o em seu diretório CGI e tente acessar usando o seguintelink -

/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI

Isso geraria o seguinte resultado -

Page 122: Guia rápido da linguagem C++(JN)

First name: ZARA

Last name: ALI

Aqui está um exemplo simples que passa dois valores usando o FORMULÁRIO HTML e obotão enviar. Vamos usar o mesmo script CGI cpp_get.cgi para manipular essa entrada.

<form action = "/cgi-bin/cpp_get.cgi" method = "get"> First Name: <input type = "text" name = "first_name"> <br /> Last Name: <input type = "text" name = "last_name" /> <input type = "submit" value = "Submit" /> </form>

Aqui está a saída real do formulário acima. Você insere Primeiro e Último Nome e, emseguida, clica no botão enviar para ver o resultado.

Primeiro nome: Último nome: Enviar

Um método geralmente mais confiável de passar informações para um programa CGI éo método POST. Isso empacota as informações exatamente da mesma maneira que osmétodos GET, mas em vez de enviá-las como uma string de texto depois de um? noURL que ele envia como uma mensagem separada. Esta mensagem vem no script CGIna forma da entrada padrão.

O mesmo programa cpp_get.cgi também manipulará o método POST. Vamos dar omesmo exemplo acima, que passa dois valores usando o HTML FORM e botão de envio,mas desta vez com o método POST da seguinte forma -

<form action = "/cgi-bin/cpp_get.cgi" method = "post"> First Name: <input type = "text" name = "first_name"><br /> Last Name: <input type = "text" name = "last_name" /> <input type = "submit" value = "Submit" /> </form>

Aqui está a saída real do formulário acima. Você insere Primeiro e Último Nome e, emseguida, clica no botão enviar para ver o resultado.

Primeiro nome: Último nome: Enviar

Caixas de seleção são usadas quando mais de uma opção é necessária para serselecionada.

Formulário Simples Exemplo: Método GET

Passando informações usando o método POST

Passando dados da caixa de seleção para o programaCGI

Page 123: Guia rápido da linguagem C++(JN)

Aqui está um exemplo de código HTML para um formulário com duas caixas de seleção-

<form action = "/cgi-bin/cpp_checkbox.cgi" method = "POST" target = "_blank"> <input type = "checkbox" name = "maths" value = "on" /> Maths <input type = "checkbox" name = "physics" value = "on" /> Physics <input type = "submit" value = "Select Subject" /> </form>

O resultado deste código é o seguinte formulário -

Matemáticas Física Selecionar Assunto

Abaixo está o programa C ++, que irá gerar script cpp_checkbox.cgi para lidar comentrada dada pelo navegador através do botão de caixa de seleção.

#include <iostream> #include <vector> #include <string> #include <stdio.h> #include <stdlib.h> #include <cgicc/CgiDefs.h> #include <cgicc/Cgicc.h> #include <cgicc/HTTPHTMLHeader.h> #include <cgicc/HTMLClasses.h> using namespace std; using namespace cgicc; int main () { Cgicc formData; bool maths_flag, physics_flag; cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>Checkbox Data to CGI</title>\n"; cout << "</head>\n"; cout << "<body>\n"; maths_flag = formData.queryCheckbox("maths"); if( maths_flag ) { cout << "Maths Flag: ON " << endl; } else { cout << "Maths Flag: OFF " << endl; } cout << "<br/>\n"; physics_flag = formData.queryCheckbox("physics"); if( physics_flag ) { cout << "Physics Flag: ON " << endl; } else { cout << "Physics Flag: OFF " << endl; } cout << "<br/>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

Page 124: Guia rápido da linguagem C++(JN)

Botões de rádio são usados quando apenas uma opção é necessária para serselecionada.

Aqui está um exemplo de código HTML para um formulário com dois botões de opção -

<form action = "/cgi-bin/cpp_radiobutton.cgi" method = "post" target = "_blank"> <input type = "radio" name = "subject" value = "maths" checked = "checked"/> Maths <input type = "radio" name = "subject" value = "physics" /> Physics <input type = "submit" value = "Select Subject" /> </form>

O resultado deste código é o seguinte formulário -

Matemáticas Física Selecionar Assunto

Abaixo está o programa C ++, que irá gerar o script cpp_radiobutton.cgi paramanipular a entrada fornecida pelo navegador da web por meio de botões de opção.

#include <iostream> #include <vector> #include <string> #include <stdio.h> #include <stdlib.h> #include <cgicc/CgiDefs.h> #include <cgicc/Cgicc.h> #include <cgicc/HTTPHTMLHeader.h> #include <cgicc/HTMLClasses.h> using namespace std; using namespace cgicc; int main () { Cgicc formData; cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>Radio Button Data to CGI</title>\n"; cout << "</head>\n"; cout << "<body>\n"; form_iterator fi = formData.getElement("subject"); if( !fi->isEmpty() && fi != (*formData).end()) { cout << "Radio box selected: " << **fi << endl; } cout << "<br/>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

Passando dados do botão de rádio para o programaCGI

Passando dados da área de texto para o programa CGI

Page 125: Guia rápido da linguagem C++(JN)

O elemento TEXTAREA é usado quando o texto multilinha deve ser passado para oPrograma CGI.

Aqui está um exemplo de código HTML para um formulário com uma caixa TEXTAREA -

<form action = "/cgi-bin/cpp_textarea.cgi" method = "post" target = "_blank"> <textarea name = "textcontent" cols = "40" rows = "4"> Type your text here... </textarea> <input type = "submit" value = "Submit" /> </form>

O resultado deste código é o seguinte formulário -

Type your text here...

Enviar

Abaixo está o programa C ++, que irá gerar o script cpp_textarea.cgi para manipular aentrada dada pelo navegador da web através da área de texto.

#include <iostream> #include <vector> #include <string> #include <stdio.h> #include <stdlib.h> #include <cgicc/CgiDefs.h> #include <cgicc/Cgicc.h> #include <cgicc/HTTPHTMLHeader.h> #include <cgicc/HTMLClasses.h> using namespace std; using namespace cgicc; int main () { Cgicc formData; cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>Text Area Data to CGI</title>\n"; cout << "</head>\n"; cout << "<body>\n"; form_iterator fi = formData.getElement("textcontent"); if( !fi->isEmpty() && fi != (*formData).end()) { cout << "Text Content: " << **fi << endl; } else { cout << "No text entered" << endl; } cout << "<br/>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

Page 126: Guia rápido da linguagem C++(JN)

Caixa suspensa é usada quando temos muitas opções disponíveis, mas apenas uma ouduas serão selecionadas.

Aqui está um exemplo de código HTML para um formulário com uma caixa suspensa -

<form action = "/cgi-bin/cpp_dropdown.cgi" method = "post" target = "_blank"> <select name = "dropdown"> <option value = "Maths" selected>Maths</option> <option value = "Physics">Physics</option> </select> <input type = "submit" value = "Submit"/> </form>

O resultado deste código é o seguinte formulário -

Matemáticas Enviar

Abaixo está o programa C ++, que irá gerar o script cpp_dropdown.cgi para manipulara entrada fornecida pelo navegador da web por meio da caixa suspensa.

#include <iostream> #include <vector> #include <string> #include <stdio.h> #include <stdlib.h> #include <cgicc/CgiDefs.h> #include <cgicc/Cgicc.h> #include <cgicc/HTTPHTMLHeader.h> #include <cgicc/HTMLClasses.h> using namespace std; using namespace cgicc; int main () { Cgicc formData; cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>Drop Down Box Data to CGI</title>\n"; cout << "</head>\n"; cout << "<body>\n"; form_iterator fi = formData.getElement("dropdown"); if( !fi->isEmpty() && fi != (*formData).end()) { cout << "Value Selected: " << **fi << endl; } cout << "<br/>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

Transmitindo dados da caixa suspensa para oprograma CGI

Page 127: Guia rápido da linguagem C++(JN)

O protocolo HTTP é um protocolo sem estado. Mas, para um site comercial, é necessáriomanter as informações da sessão entre diferentes páginas. Por exemplo, um registro deusuário termina após a conclusão de várias páginas. Mas como manter as informaçõesda sessão do usuário em todas as páginas da web.

Em muitas situações, o uso de cookies é o método mais eficiente de lembrar e rastrearpreferências, compras, comissões e outras informações necessárias para uma melhorexperiência do visitante ou estatísticas do site.

Seu servidor envia alguns dados para o navegador do visitante na forma de um cookie.O navegador pode aceitar o cookie. Em caso afirmativo, ele é armazenado como umregistro de texto simples no disco rígido do visitante. Agora, quando o visitante chegarem outra página do seu site, o cookie estará disponível para recuperação. Uma vezrecuperado, seu servidor sabe / lembra o que foi armazenado.

Cookies são um registro de dados de texto simples de 5 campos de comprimentovariável -

Expira - Mostra a data em que o cookie irá expirar. Se estiver em branco, ocookie expirará quando o visitante sair do navegador.

Domínio - mostra o nome de domínio do seu site.

Caminho - mostra o caminho para o diretório ou página da web que define ocookie. Isso pode ficar em branco se você quiser recuperar o cookie de qualquerdiretório ou página.

Seguro - Se este campo contiver a palavra "seguro", o cookie só poderá serrecuperado com um servidor seguro. Se este campo estiver em branco, essarestrição não existe.

Name = Value - Os cookies são definidos e recuperados na forma de pares dechave e valor.

É muito fácil enviar cookies para o navegador. Esses cookies serão enviados junto como cabeçalho HTTP antes do tipo de conteúdo arquivado. Supondo que você desejadefinir UserID e senha como cookies. Então, a configuração dos cookies será feita daseguinte forma

#include <iostream> using namespace std; int main () { cout << "Set-Cookie:UserID = XYZ;\r\n";

Usando cookies no CGI

Como funciona

Configurando Cookies

Page 128: Guia rápido da linguagem C++(JN)

cout << "Set-Cookie:Password = XYZ123;\r\n"; cout << "Set-Cookie:Domain = www.tutorialspoint.com;\r\n"; cout << "Set-Cookie:Path = /perl;\n"; cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>Cookies in CGI</title>\n"; cout << "</head>\n"; cout << "<body>\n"; cout << "Setting cookies" << endl; cout << "<br/>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

A partir deste exemplo, você deve ter entendido como definir cookies. Usamos ocabeçalho HTTP Set-Cookie para definir cookies.

Aqui, é opcional definir atributos de cookies como Expires, Domain e Path. É notávelque os cookies sejam definidos antes de enviar a linha mágica "Tipo de conteúdo:text / html \ r \ n \ r \ n .

Compile o programa acima para produzir setcookies.cgi e tente definir cookies usando oseguinte link. Ele irá definir quatro cookies no seu computador -

/cgi-bin/setcookies.cgi

É fácil recuperar todos os cookies definidos. Os cookies são armazenados na variável deambiente CGI HTTP_COOKIE e terão o seguinte formulário.

key1 = value1; key2 = value2; key3 = value3....

Aqui está um exemplo de como recuperar cookies.

#include <iostream> #include <vector> #include <string> #include <stdio.h> #include <stdlib.h> #include <cgicc/CgiDefs.h> #include <cgicc/Cgicc.h> #include <cgicc/HTTPHTMLHeader.h> #include <cgicc/HTMLClasses.h> using namespace std; using namespace cgicc; int main () { Cgicc cgi; const_cookie_iterator cci; cout << "Content-type:text/html\r\n\r\n";

Recuperando Cookies

Page 129: Guia rápido da linguagem C++(JN)

cout << "<html>\n"; cout << "<head>\n"; cout << "<title>Cookies in CGI</title>\n"; cout << "</head>\n"; cout << "<body>\n"; cout << "<table border = \"0\" cellspacing = \"2\">"; // get environment variables const CgiEnvironment& env = cgi.getEnvironment(); for( cci = env.getCookieList().begin(); cci != env.getCookieList().end(); ++cci ) { cout << "<tr><td>" << cci->getName() << "</td><td>"; cout << cci->getValue(); cout << "</td></tr>\n"; } cout << "</table><\n"; cout << "<br/>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

Agora, compile o programa acima para produzir getcookies.cgi e tente obter uma listade todos os cookies disponíveis em seu computador -

/cgi-bin/getcookies.cgi

Isso produzirá uma lista de todos os quatro cookies definidos na seção anterior e todosos outros cookies definidos em seu computador -

UserID XYZ

Password XYZ123

Domain www.tutorialspoint.com

Path /perl

Para carregar um arquivo, o formulário HTML deve ter o atributo enctype definido comomultipart / form-data . A tag de entrada com o tipo de arquivo criará um botão"Browse".

<html> <body> <form enctype = "multipart/form-data" action = "/cgi-bin/cpp_uploadfile.cgi" method = "post"> <p>File: <input type = "file" name = "userfile" /></p> <p><input type = "submit" value = "Upload" /></p> </form> </body> </html>

O resultado deste código é o seguinte formulário -

Arquivo: Nenhum arquivo selecionadoEscolher arquivo

Exemplo de Upload de Arquivo

Page 130: Guia rápido da linguagem C++(JN)

Página anterior Próxima página

Upload

Nota - O exemplo acima foi desativado intencionalmente para impedir que as pessoasfaçam upload de arquivos em nosso servidor. Mas você pode tentar o código acima como seu servidor.

Aqui está o script cpp_uploadfile.cpp para lidar com o upload de arquivos -

#include <iostream> #include <vector> #include <string> #include <stdio.h> #include <stdlib.h> #include <cgicc/CgiDefs.h> #include <cgicc/Cgicc.h> #include <cgicc/HTTPHTMLHeader.h> #include <cgicc/HTMLClasses.h> using namespace std; using namespace cgicc; int main () { Cgicc cgi; cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>File Upload in CGI</title>\n"; cout << "</head>\n"; cout << "<body>\n"; // get list of files to be uploaded const_file_iterator file = cgi.getFile("userfile"); if(file != cgi.getFiles().end()) { // send data type at cout. cout << HTTPContentHeader(file->getDataType()); // write content at cout. file->writeToStream(cout); } cout << "<File uploaded successfully>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

O exemplo acima é para gravar conteúdo no fluxo de cout , mas você pode abrir ofluxo de arquivos e salvar o conteúdo do arquivo carregado em um arquivo no localdesejado.

Espero que você tenha gostado deste tutorial. Se sim, envie-nos seu feedback.