Escolar Documentos
Profissional Documentos
Cultura Documentos
NOTAS DIGITAIS
B.TECH
(I ANO – II SEM)
(2018-19)
LNVETOLEARN&LEARNTO
Objectivos
• Ensinar ao aluno os conceitos de programação orientada a objetos e procedimentos
• Para diferenciar entre funções, classes e objetos
• Para aprender a sobrecarregar funções e operadores
• Para projetar aplicativos usando técnicas de gerenciamento de memória dinâmica
• Ensinar o aluno a implementar programação genérica e tratamento de exceções
Unidade I
Introdução à Programação Orientada a Objetos: Paradigma Orientado a Objetos - Diferenças entre
Programação Orientada a Objetos e Programação Orientada a Procedimentos, Conceitos Básicos de
Programação Orientada a Objetos, Encapsulamento, Herança e Polimorfismo, Benefícios da OOP,
Estrutura de um programa C++, namespace, Tipos de dados, tokens C++, Identificadores, Variáveis,
Constantes, Operadores, Estruturas de controle e Loops.
Unidade-II
Funções, Classes e Objetos:
Introdução de Classes, Definição de Classe, Definição de Membros, Objetos, Controle de Acesso,
Escopo de Classe, Operador de Resolução de Escopo, Funções embutidas, Alocação de Memória para
Objetos, Membros de Dados Estáticos, Funções de Membros Estáticos, Matrizes de Objetos, Objetos
como Argumentos de Função, Funções Amigas.
Unidade-III
Construtores, Destruidores, Herança:
Introdução a Construtores, Construtores Padrão, Construtores Parametrizados, Construtores de
Cópia, Múltiplos Construtores em uma Classe, Destruidores.
Herança:
Introdução à herança, Definição de classes derivadas, Herança única, Herança múltipla, Herança
multinível, Herança hierárquica, Herança híbrida.
Unidade-IV
Ponteiros, Funções Virtuais e Polimorfismo:
Introdução ao gerenciamento de memória, novo operador e operador de exclusão, Ponteiros para
objetos, Ponteiros para classes derivadas, Polimorfismo, Polimorfismo de tempo de compilação,
Polimorfismo de tempo de execução, Funções virtuais, Sobrecarga de função, Sobrecarga de
operador.
Unidade-V
Modelos e tratamento de exceções:
Introdução a Modelos, Modelos de Classe, Modelos de Classe com Vários Parâmetros, Modelos de
Função, Modelos de Função com Vários Parâmetros.
Tratamento de exceções:
Noções básicas de tratamento de exceções, tipos de exceções, mecanismo de manipulação de
exceções, mecanismo de lançamento e captura, relançamento de uma exceção, especificação de
exceções.
Resultados:
• Diferenciar programação orientada a objetos e programação processual.
• Para construir classes, funções e objetos
• Para implementar os construtores, destruidores e herança
• Desenvolver programas utilizando técnicas de gerenciamento dinâmico de memória
• Para aplicar manipulação de exceções e programação genérica.
Livros Didáticos:
1. Programação Orientada a Objetos com C++ por Balagurusamy
2. C++, The Complete Reference,4ª Edição, Herbert Schildt, TMH.
Referências:
1. Cartilha C++,3ª Edição, S.B.Lippman e J.Lajoie, Pearson Education.
2. A Linguagem de Programação C++,3ª Edição, B.Stroutstrup, Pearson Educ
UNIDADE -1
Abstração de dados :
A abstração refere-se ao ato de representar características essenciais sem incluir os detalhes ou
explicações de fundo. As classes usam o conceito de abstração e são definidas como uma lista de atributos como
tamanho, peso, custo e funções para operar sobre esses atributos. Eles encapsulam todas as propriedades
essenciais do objeto a ser criado. Os atributos são chamados como membros de dados, pois eles contêm dados e
as funções que operam nesses dados são chamadas como funções de membro.
As classes usam o conceito de abstração de dados, por isso são chamadas de tipo de dados abstratos
(ADT)
Polimorfismo: Polimorfismo vem das palavras gregas "poly" e "morfismo". "poli" significa muitos e "morfismo"
significa forma, ou seja, muitas formas. Polimorfismo significa a capacidade de assumir mais de uma forma. Por
exemplo, uma operação tem comportamento diferente em instâncias diferentes. O comportamento depende do
tipo de dados usados na operação.
Diferentes maneiras de alcançar o polimorfismo no programa C++:
1) Sobrecarga de função 2) Sobrecarga do operador
#include<iostream>
Usando namespace
DST; int main() {int a=4; a=a<<2;
cout<<"a="<<a<<endl;
retorno 0;
}
Herança: A herança é o processo pelo qual um objeto pode adquirir as propriedades de outro.
A herança é o conceito mais promissor de OOP, que ajuda a realizar o objetivo de construir software a partir de
peças reutilizáveis, em vez de codificar manualmente cada sistema do zero. A herança não só oferece suporte à
reutilização entre sistemas, mas também facilita diretamente a extensibilidade dentro de um sistema. A herança,
juntamente com polimorfismo e vinculação dinâmica, minimiza a quantidade de código existente a ser
modificado enquanto aprimora um sistema.
Quando o filho da classe herda o pai da classe, o filho da classe é referido como classe derivada
(subclasse) e o pai da classe como uma classe base (superclasse). Nesse caso, o filho da classe tem duas partes:
uma parte derivada e uma parte incremental. A parte derivada é herdada do pai da classe. A parte incremental é o
novo código escrito especificamente para o filho da classe.
Vinculação dinâmica:
Vinculação refere-se à vinculação da chamada de procedimento ao código a ser executado em resposta à
chamada. Vinculação dinâmica (ou vinculação tardia) significa o código associado a uma determinada chamada
de procedimento em não conhecido até o momento da chamada em tempo de execução.
Passagem de mensagem:
Um programa orientado a objetos consiste em um conjunto de objetos que se comunicam entre si.
Os objetos se comunicam entre si enviando e recebendo informações.
Uma mensagem para um objeto é uma solicitação para execução de um procedimento e, portanto, invocar
a função que é chamada para um objeto e gera resultado
Fácil de manter e atualizar: A OOP facilita a manutenção e modificação do código existente, pois novos objetos
podem ser criados com pequenas diferenças em relação aos existentes. A complexidade do software pode ser
facilmente gerenciada.
Passagem de mensagens: A técnica de comunicação de mensagens entre objetos facilita a interface com sistemas externos.
ESTRUTURA BÁSICA DA LINGUAGEM C++ : O programa escrito em linguagem C++ segue essa estrutura
básica. A sequência de seções deve ser como estão na estrutura básica. Um programa C deve ter uma ou mais
seções, mas a sequência de seções deve ser seguida.
1. Seção de documentação
2. Seção de vinculação
3. Seção Definição
4. Seção de declaração global & declarações de classe
5. Definição da função de membro
6. Função principal
seção main() {
Seção Declaração Seção executável
1. SEÇÃO DE DOCUMENTAÇÃO: vem em primeiro lugar e é usado para documentar o uso de lógica
ou razões em seu programa. Ele pode ser usado para escrever o objetivo do programa, desenvolvedor e detalhes
lógicos. A documentação é feita em linguagem C com /* e */ . Tudo o que está escrito entre esses dois são
chamados de comentários.
2. SEÇÃO DE VINCULAÇÃO : Esta seção diz ao compilador para vincular determinadas
ocorrências de palavras-chave ou funções em seu programa aos arquivos de cabeçalho especificados nesta
seção.
por exemplo, #include<iostream>
usando namespace std;
faz com que o pré-processador adicione o conteúdo do arquivo IOSTREAM ao programa. Contém declarações para cout e cin.
>
Cout é um objeto predefinido que representa o fluxo de saída padrão. O operador << é um
operador de inserção, faz com que a cadeia de caracteres entre aspas duplas seja exibida na tela.
A afirmação cin>>n; é uma instrução de entrada e faz com que o programa aguarde que o usuário digite um
número. O número digitado é colocado na variável "n". O identificador cin é um objeto predefinido em C++ que
corresponde ao fluxo de entrada padrão. O operador >> é conhecido como operador de extração. Ele extrai o
valor do teclado e o atribui à variável de valor à direita.
por exemplo,
exibição vazia()
{
cout<<"C++ é melhor que C";
}
PROGRAMA "C++‟ SIMPLES:
#include<iostream>
usando namespace std;
exibição vazia()
{
cout<<"C++ é melhor que C";
}
int main()
{
exibição()
retorno 0;
}
6. SEÇÃO DE FUNÇÃO PRINCIPAL: Ele diz ao compilador onde iniciar a execução a partir de main()
{
ponto do início da execução
}
A função principal tem duas seções
1. seção de declaração : Nela as variáveis e seus tipos de dados são declarados.
2. Seção executável ou seção de instruções: Esta tem a parte do programa que realmente executa a tarefa
que precisamos.
Espaço de nome:
namespace é usado para definir um escopo que pode conter identificadores globais.
ex:-namespace escopo para biblioteca padrão do C++.
Uma classe, funções e modelos são declarados dentro do namespace nomeado
std usando namespace std;-->directive pode ser usado.
namespace_name de namespace
{
declarações de variables.functions, classes etc...
}
ex:
#include<iostream>
usando namespace std;
Exemplo de namespace
{`
Int M;
Exibição vazia (int n)
{
cout<<"no namespace N="<<n<<endl;
}
}
#include<iostream>
Essa diretiva faz com que o pré-processador adicione conteúdo do arquivo iostream ao programa. algumas
versões antigas do C++ usado iostream.h .if complier não suporta ANSI (American nation standard
institute) C++ em seguida, use o arquivo de cabeçalho iostream.h
TIPOS DE DADOS:
Um tipo de dados é usado para indicar o tipo de valor de dados armazenado em uma variável. Todos os
compiladores C suportam uma variedade de tipos de dados. Essa variedade de tipos de dados permite que
o programador selecione o tipo apropriado às necessidades do aplicativo, bem como da máquina. ANSI C
suporta as seguintes classes de dados
, । । .......
Bit assinado Magnitude
MSB (bit mais significativo)
100(10)=00000000001100100(2)
Representação do número negativo :
-100(10)=1111111110011100(2)
Inteiros não assinados: inteiros não assinados usam todos os 16 bits para armazenar a magnitude. Armazena
números não tem nenhum sinal & O qualificador de tamanho e o intervalo do tipo de dados inteiro em um
computador de 16 bits são mostrados na tabela:
MEMÓRIA NECESSÁRIA
GAMA FORMATO
OU TAMANHO DO
TIPO DE DADO ARMAZENAMENTO EM BYTES DO
TURBO C GCC/ TURBO C ( 16 BITS) GCC ESPÉCIME
( 16 BITS) COMPILADORES (32 BITS)
EM LINUX (32 BITS)
int curto
-32768
ou -32768
2 2 Até 32767 %HD
Para 32767 (-2 até
assinado curto int +2 -1) (-2 até +2 -1)
int curto
0 a 65535 (0 a +2 -1) 0 a 65535 (0 a +2 -1)
ou
assinado curto int 2 2 %hu
O número de ponto flutuante representa um número real com precisão de 6 dígitos que ocupa 4 bytes de memória.
As variáveis de ponto flutuante são declaradas pela palavra-chave float.
O tipo de dados de ponto flutuante duplo ocupa 8 bytes de memória, dando 14 dígitos de precisão. Estes também
são conhecidos como números de precisão dupla. As variáveis são declaradas pela palavra-chave double long double
refere-se a um tipo de dados de ponto flutuante que geralmente é mais preciso do que a precisão dupla.
O tamanho e o intervalo do tipo de dados de ponto flutuante são mostrados na tabela:
Tipo de dado Tamanho (memória) Gama especificador de
(palavra-chave) formato
Flutuar 32 bits (4 bytes) 3.4E-38T03.4E+38 %f
Dobrar 64 bits (8 bytes) 1.7E-308 até I.7E +308 %lf
duplo longo 80 bits (10 bytes) 3.4E-4932 até 1.1E+4932 Se
B Tipo de dados
oolean:- ou tipo de dados lógicos é um tipo de dados, com dois valores (geralmente denotados verdadeiro e
Booleano
falso), destinado a representar os valores verdade da lógica e álgebra booleana. Seu nome é uma homenagem a
George Boole, que definiu pela primeira vez um sistema algébrico de lógica em meados do século 19. O tipo de
dados booleano é o resultado primário de instruções condicionais, que permitem ações diferentes e fluxo de
controle de alteração, dependendo se uma condição booleana especificada pelo programador é avaliada como true
ou false.
C99 adicionou um tipo booleano (verdadeiro/falso) que é definido no cabeçalho <stdbool.h> A variável
booleana é definida pela palavra kkey bool ; Ex:
Bool B;
onde b é uma variável que pode armazenar true(1) de false (0)
Tipo de vazio
O tipo void não tem valores. Isso geralmente é usado para especificar o tipo de retorno de funções. O tipo da função dito ser
nulo quando não retorna nenhum valor para a função de chamada. Isso também é usado para declarar o ponteiro de propósito
geral chamado ponteiro nulo.
Tipos de dados derivados.
Os tipos de dados derivados são Matrizes, ponteiro e referências são exemplos para tipos de dados
derivados.
Tipos de dados definidos pelo usuário:
eles Os tipos de dados definidos pelo usuário são conhecidos como os tipos de dados definidos pelo usuário.
São eles: estrutura, união, classe e enumeração
C++ Tokens
IDENTIFICADORES: Identificadores são os nomes dados a vários elementos do programa, como variáveis,
funções e matrizes. Estes são nomes definidos pelo usuário que consistem em sequência de letras e dígitos.
Regras para declarar identificadores:
O primeiro caractere deve ser um alfabeto ou sublinhado.
> Deve ser composto apenas por letras, dígitos e sublinhado.
Os identificadores podem ter qualquer comprimento, mas apenas os primeiros 31 caracteres são significativos.
> Não deve conter espaço em branco ou espaço em branco.
Não devemos usar palavras-chave como identificadores.
> Letras maiúsculas e minúsculas são diferentes.
Exemplo: ab Ab aB AB são tratados de forma diferente
Exemplos de identificadores válidos:
a, x, n, n, SOMA, fato, grand_total, sum_of_digits, soma1
Nota: Alguns compiladores de C reconhecem apenas os primeiros 8 caracteres; por causa disso, eles são
incapazes de distinguir identificadores com as palavras de comprimento superior a oito caracteres.
Declaração de variável: A declaração de variável dá o nome para o local da memória e seu tamanho e
Especifica o intervalo de valores que pode ser armazenado nesse
Sintaxe:
local.
Nome da variável de tipo
de dados; a 10 2000
Ex:
int a=10; x 2.300000 5000
flutuação
KEYWORDS: x=2,3;
Existem certas palavras, chamadas palavras-chave (palavras reservadas) que têm um significado
predefinido na linguagem "C++‟ . Essas palavras-chave devem ser usadas apenas para a finalidade pretendida e
não como identificadores.
A tabela a seguir mostra as palavras-chave padrão "C++‟
Automático quebrar caso queimar Const continuar
inadimplência fazer dobrar mais enum Extern
flutuar durante Goto se int Longas
Registro retornar curto Assinado tamanho de estático
Struct interruptor typedef união Unsigned vazio
volátil enquanto .class amigo Novo excluir
este público privado Protegido Inline tentar
jogar pegar modelo
CONSTANTES:
Constantes referem-se a valores que não são alterados durante a execução de um programa.
As constantes podem ser divididas em duas categorias principais:
1. constantes primárias:
a) Constantes numéricas
Constantes inteiras.
Ponto flutuante (real)
Constantes. b) Constantes de caracteres
Constantes de caractere único Constantes de cadeia de caracteres
2. constantes secundárias:
Constantes de enumeração.
Constantes simbólicas.
Matrizes, sindicatos, etc.
Regras para declarar constantes:
1 . Vírgulas e espaços em branco não são permitidos dentro da constante.
2 . A constante pode ser precedida por menos (-) assinado, se necessário.
3 . O valor de uma constante deve estar dentro de seus limites mínimos de seu tipo de dados especificado.
Constantes inteiras: Uma constante inteira é um número com valor inteiro. Consiste em sequência de dígitos. As
constantes inteiras podem ser escritas em três sistemas numéricos diferentes:
1 . Inteiro decimal (base 10).
2 . Inteiro octal (base 8).
3 . Hexadecimal (base 16).
Constante inteira decimal: Consiste em conjunto de dígitos, de 0 a 9.
Declaração válida: 0, 124, -56, + 67, 4567 etc.
Declaração inválida: $245, 2.34, 34 345, 075.
23.345,00. é também uma declaração inválida.
Nota: Espaços incorporados, vírgulas, caracteres, símbolos especiais não são permitidos entre dígitos
A magnitude (valor máximo) de uma constante inteira pode variar de zero a algum valor máximo que varia de um
computador para outro.
Os valores máximos típicos para a maioria dos computadores pessoais são: (máquinas de 16 bits)
Constante inteira decimal: 32767 (215-1)
Constante de inteiro Octal: 077777
Constante de inteiro hexadecimal: 0X7FFF
Nota: O maior valor que pode ser armazenado é dependente da máquina.
Constantes de ponto flutuante ou constantes reais : Os números com partes fracionárias são chamados de
constantes reais.
Estes são os números com base-10 que contém uma parte decimal ou expoente (ou ambos). Representação:
Esses números podem ser representados em notação decimal ou notação expoente (notação científica).
Notação decimal: 1234,56, 75,098, 0,0002, -0,00674 (notações válidas)
Notação expoente ou científica:
Forma geral: Mantissa e expoente
Mantissa: É um número real expresso em notação decimal ou uma notação inteira.
Expoente: É um número inteiro com um sinal opcional de mais (+) ou menos (-).
E ou e: A letra que separa a mantissa e a parte decimal.
Ex: (Notações válidas)
3
1,23456E+3 (1,23456×10 )
1
7,5098 e+1 (7,5098×10 )
-4
2E-4 (2×10 )
Essas notações exponenciais são úteis para representar números que são muito grandes ou muito grandes
pequeno. Ex: 0,00000000987 é equivalente a 9,87e-9
Constantes de caracteres:-
Constantes de caractere único: É caractere (ou qualquer símbolo ou dígito) entre aspas simples.
Ex: "a‟ "1‟ "*‟
Todas as constantes de caractere têm valores inteiros conhecidos como valores ASCII
ASCII:- ASCII significa American Standard Code for Information Interchange. Pronunciado ask-ee, ASCII é um código
para representar caracteres em inglês como números, com cada letra atribuída um número de 0 a 255.Os computadores só
podem entender números, então um código ASCII é a representação numérica de um caractere como 'a' ou '@' ou uma
ação de algum tipo. Um código SCII representa texto em computadores, equipamentos de comunicação e outros dispositivos
que usam texto. A maioria dos esquemas modernos de codificação de caracteres são baseados em ASCII, embora suportem
muitos caracteres adicionais. Abaixo está a tabela de caracteres ASCII e isso inclui descrições dos primeiros 32 caracteres
não imprimíveis.
Constantes de cadeia de caracteres ou literal de cadeia de caracteres:
Constante de cadeia de caracteres é uma sequência de zero ou mais caracteres entre aspas duplas.
Exemplo:
"MRCET" "12345" "*)(&%"
Sequências de escape ou constantes de caracteres de barra invertida
A linguagem C suporta alguns caracteres não imprimíveis, bem como barras invertidas ( \ ) que podem ser
expressas
como sequências de fuga. Uma sequência de escape sempre começa com barra invertida seguida por um ou mais
caracteres especiais.
Por exemplo, um novo caractere de linha é representado "\n" ou endl
Estes são usados na formatação da tela de saída, ou seja, a sequência de escape é usada em
funções de saída. Algumas sequências de fuga são dadas abaixo:
SAÍDA:
a+b=23
a-b=17
a*b=60
a/b=6
a% b=2
SAÍDA: 0&&0=0
0&&1=0
1&&0=0
1&&1=1
0||0=0
0||1=1
1||0=1 1||1=1 !0 =1 !1 =0
4 . OPERADOR DE ATRIBUIÇÃO:
A expressão de atribuição avalia o operando no lado direito do operador (=) e coloca seu valor na variável
à esquerda.
Nota: O operando esquerdo em uma expressão de atribuição deve ser uma única variável.
Existem duas formas de atribuição:
•Atribuição simples
•Atribuição composta
Atribuição simples:
Em expressões algébricas encontramos essas expressões.
Ex: a=5; a=a+1; a=b+1;
Aqui, o operando do lado esquerdo deve ser uma variável, mas não uma constante. A variável do lado
esquerdo deve ser capaz de receber um valor da expressão. Se o operando esquerdo não puder receber um
valor e atribuímos um a ele, obteremos um erro de compilação.
Atribuição composta:
Uma atribuição composta é uma notação abreviada para uma atribuição simples. Requer que o operando
esquerdo seja repetido como parte da expressão direita. Sintaxe: variável operator+=value
Ex:
A+=1; equivale a A=A+1;
O operador ++ adiciona um ao seu operando, onde como o operador - - subtrai um de seu operando. Esses operadores são
operadores unários e assumir a seguinte forma:
Operador Descrição
Os operadores de incremento e decremento podem
preceder ou seguir o operando. -—um Pré-incremento
Incremento/Decremento Postfix :( a++/a--) a++ Pós-incremento
No incremento pós-fixo (Decrement) o valor é —um Pré-decremento
incrementado (decremented) por um. Assim, o a++ tem o a— Pós-decremento
mesmo efeito que
Alguns dos operadores de atribuição de taquigrafia comumente usados são mostrados na tabela a seguir:
Instrução com operador de atribuição simples Declaração com operador taquigráfico
a=a+l a-=1
a=a-l a-=l
a=a*l a*=i
a=a/1 A-1
a=a% 1 a%=l
a=a*(n-l) a*=n+1
5.OPERADORES DE INCREMENTO (++) E DECREMENTO (--):
a=a+1; a--tem o mesmo efeito que a=a-1.
A diferença entre a++ e a+1 é, se ++ é após o operando, o incremento ocorre depois que a expressão é avaliada.
O operando em uma expressão postfix deve ser uma variável.
Ex1:
int a=5;
B=a++; Aqui o valor de B é 5. o valor de a é 6.
Ex2:
int x=4; y=x--; Aqui o valor de y é 4, o valor x é 3
Incremento/Decremento de prefixo (++a/ --a)
No incremento de prefixo (decremento) o efeito ocorre antes que a expressão que contém o operador seja avaliada. É o
inverso da operação postfix. ++a tem o mesmo efeito que a=a+1.
--a tem o mesmo efeito que a=a-1.
Ex: int b=4;
A= ++b;
Neste caso, o valor de b seria 5 e A seria 5.
Os efeitos do pós-fixo e do incremento de prefixo são os mesmos: a variável é incrementada por
1. Mas eles se comportam de forma diferente quando usados em expressões como mostrado acima. A execução desses
operadores é rápida quando comparada à instrução de atribuição equivalente.
#include<iostream.h>
int main()
{
int a=1;
int b=5;
++a;
cout<<"a="<<a<<endl;
--b;
Cout<<"B="<<B<<Endl;
cout<<"a="<<a++<<endl;
cout<<"a="<<a<<endl;
cout<<"b="<<b--<<endl;
Cout<<"B="<<B<<Endl;
retorno 0;
}
a=2
b=4
a=2
a=3
b=4
b=3
6 . OPERADOR CONDICIONAL OU OPERADOR TERNÁRIO:
#include<iostream.h>
void principal()
{
Int A, B,C;
cout<<"Insira os valores a e b:";
cin>>a>>b;
c=a>b?a:b;
cout<<"maior de a e b é "<<c;
}
Insira os valores a e b:1 5
maior de a e b é 5
7 . OPERADORES BIT WISE : C suporta operadores especiais conhecidos como operadores bit wise para
manipulação de dados no nível de bits. Eles não são aplicados para flutuar ou dobrar.
operador significado
& Bitwise E
^ Exclusivo Bitwise OU
<< Desvio para a esquerda
>> Desvio para a direita
~ o complemento de um
Operador Bitwise AND (&)
O operador bit a bit AND é um operador binário que requer dois operandos integrais (caractere ou inteiro). Ele faz uma
comparação bit a bit como mostrado abaixo:
Primeiro Bit do Segundo bit do Opel & Opel
Operando
0 operando
0 0
0 1 0
1 0 0
1 1 1
Explicação: O número introduzido através do teclado como entrada é 8 e o seu número binário correspondente é
1000...................................................................................................
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
15 14 13 12 11 10 9 876543 21 0
Após a execução do programa, os dados de entrada x devem ser deslocados por 2 bits para o lado direito. A
resposta em forma binária seria a seguinte:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
15 14 13 12 11 10 9 876543 21 0
O operador de deslocamento à direita divide o número dado por uma potência de 2. Se mudarmos um número
binário dois lugares para a direita, estamos dividindo o número dado por 4 (2').
É um operador binário que requer dois operandos integrais. O primeiro operando é o valor a ser deslocado e
o segundo operando especifica o número de bits a serem deslocados para a esquerda.
Quando os bits estão se deslocando para a esquerda, os bits na extremidade mais esquerda são excluídos.
O bit bit NOT, ou complemento, é uma operação unária que executa negação lógica em cada bit. formando o
complemento do valor binário dado. Dígitos que eram 0 se tornam I, e vice-versa.
Ex: NÃO 0111 (decimal 7) = 1000 (decimal 8)
Em C, t o operador bit a bit NOT é (til). Tabela verdade:
Valor da expressão ~Expressão
0 1
1 (diferente de zero) 0
Nota: O operador de complemento (Bitwise NOT) de um é um operador Logical NOT de forma diferente.
Usamos este operador no processo de codificação e decodificação.
8.5 OPERADORES PECIAL
Esses operadores que não se encaixam em nenhuma das classificações acima são ,(vírgula), sizeof, operadores de
ponteiro (& e *) e operadores de seleção de membros (. e ->). O operador vírgula é usado para vincular
expressões relacionadas.
O operador SIZEOF:
Ele retorna o número de bytes ocupados pelo operando. O operando pode ser uma variável, uma constante
(valor de dados) ou um qualificador de tipo de dados.
Ex: int a. c, f, d;
c=tamanhode(a); aqui c=2, o operador sizeof retorna o tamanho da variável a que é do tipo int f=sizeof(long
double); o valor f é 10, que é o tamanho do qualificador duplo longo tipo d=sizeof(23.345); O valor d é 4 , que
é o tamanho do valor da constante float
O tamanho do operador é normalmente usado para determinar o comprimento de matrizes e estruturas. Ele
também é usado para alocar espaço dinamicamente para a variável s durante a execução de um programa.
O operador vírgula pode ser usado para vincular a expressão relacionada de expressões é avaliada da esquerda
para a direita e o valor da expressão combinada.
Ex: a=(x=10, y=20, x+y);
Operadores em c++: Todos os operadores acima da linguagem c também são válidos em c++. Os novos
operadores introduzidos no c++ são:
Manipuladores:
Os manipuladores são os operadores usados para formatar os dados que devem ser exibidos na tela. Os
manipuladores mais utilizados são endl e setw
endl:-é usado na instrução de saída e insere um feed de linha. É semelhante ao novo caractere de linha ("\n")
ex: cout<<"a=2"<<endl;
cout<"nome=sunil"<<endl;
Saída:
a=2
nome=sunil
setw:-
Este manipulador permite uma largura especificada para um campo que deve ser impresso na tela
e por padrão o valor impresso é justificado corretamente. Esta função está disponível no arquivo de cabeçalho
iomanip.h
#include<iostream.h>
#include<iomanip.h>
usando namespace std;
int main()
{
int s=123;
cout<<"s="<<setw(10)<<s ;
}
saída
s= 123
Operadores de inserção (<<) e extração (>>):
os operadores são usados com objetos de saída e entrada
ex:
cout<<"Digite n";
cin>>n
2.Declarações de controlo condicional:Instruções que são executadas quando uma condição é verdadeira.
Essas afirmações são divididas em três categorias. eles são
1.Declarações de tomada de decisão
2.Mudar a instrução de controle de caso ou
3.Instruções ou repetições de controle de malha
1 . Declarações de tomada de decisão:- Estas declarações são usadas para controlar o fluxo de execução de
um programa, tomando uma decisão dependendo de uma condição, por isso são nomeadas como declarações de
tomada de decisão.
As declarações de tomada de decisão são de quatro tipos:
1. simples se
2.se mais
3.nested se mais
4.1 f outra escada
1.51 Instrução MPLE IF: Se a expressão de teste for True, a instrução if executa instruções que imediatamente
se seguem
Sintaxe:
If(expressão de teste)
Lista de depoimentos;
#include<iostream.h>
int main()
{
Int A,B;
cout<<"Digite quaisquer dois inteiros:";
cin>>a>>b;
se(a>b) cout<<"A for maior que B\n A="<<a;
3 . Aninhamento de instruções if-else it também é possível aninhar uma instrução if dentro de outra. Háuma série de decisões a
serem tomadas.
Instrução If –else colocada dentro de outra instrução if else Sintaxe:
If(expressão de teste) {If(expressão de
teste) { //instruções } else {
//instruções } } else
{If(expressão de teste) { //instruções }
else { //instruções }
} /*maior de três números*/
#include<iostream.h>
#include<conio.h> int main() { int a,b,c;
cout<<"Digite a,b,c valores:";
cin>>a>>b>>c;
se(a>b) {
se(a>c) {
cout<<"A ia
maior entre
três números\
n"; cout"A=
"<<a;
} else {
cout<<"C ia
maior entre
três números\
n"; cout<<"c= "<<c;
} } else {if(b>c) {
cout<<"B ia maior entre três números\n"; cout<<"B="<<b;
}
mais
{
cout<<"C ia maior entre três números\n";
cout<<"c="<<c;
}
}
getch();
retorno 0;
}
4.1 f outra escada
if(condição1)
enunciado1;
senão se(condição2)
afirmação 2;
senão se(condição3)
afirmação n;
mais
instrução padrão.
afirmação-x;
O aninhamento do if-else depende das condições com as quais temos que lidar.
A condição é avaliada de cima para baixo.se uma condição for verdadeira, a instrução associada a ela será executada.
Quando todas as condições se tornarem falsas, a parte final que contém instruções padrão será executada.
#include<iostream.h>
void principal()
{
Int Per;
cout<<"Entrar
porcentagem"; cin>>per;
se(per>=80)
cout<<"Seguro
Distinção"<<endl; senão se(per>=60)
cout<<"Secured First
Divisão"<<endl; senão se(per>=50)
cout<<"Seguro
Segunda Divisão"<<endl;
senão se(per>=40)
cout<<"Seguro
Divisão"<<endl; Tercei
mais ro
cout<<"Falhar"<<endl
inadimplência:
bloco padrão;
1 . ENQUANTO DECLARAÇÃO:
While(condição de teste)
{
corpo do laço
}
É um loop de entrada controlada. A condição é avaliada e, se for
verdadeira, o corpo do loop é executado. Após a execução do corpo a
condição é novamente avaliada e se é verdadeiro corpo é executado mais
uma vez. Isso continua até que a condição de teste se torne falsa.
fazer
{
corpo
}while(condição de teste);
do{
soma = soma + i;
i = i + 1;
} enquanto(i<=n);
cout<<"Soma dos primeiros"<< n<<" números naturais
é:"<<soma; retorno 0;
}
Nota: se a condição de teste for falsa. antes que o loop esteja sendo executado, em seguida, While loop executa zero
número de vezes onde as do--enquanto executa uma vez
3.FOR LOOP: É também uma malha de controle de entrada que fornece uma estrutura
mais concisa
Sintaxe:
for(inicialização; expressão de teste; incremento/decremento) {
Declarações;
}
Pois a instrução é dividida em três expressões, cada uma é
separada por ponto-e-vírgula;
1.A expressão de iniciação é usada para inicializar variáveis
2.A expressão de teste é responsável por continuar o loop. Se
for verdadeiro, o fluxo de controle do programa entra no loop
e executa o bloco de instruções associadas a ele. Se a
expressão de teste for falsa, o loop termina 3.a expressão de
incremento/decremento consiste no operador de incremento
ou decremento Esse processo continua até que a condição de
teste seja satisfeita.
para(i=1;i<=n;i++)
{
soma = soma + i;
}
Loops aninhados:A gravação de uma instrução de controle de loop em outra instrução de controle de loop é
chamada de instrução de loop aninhado
Ex:
para(i=1;i<=10;i++)
for(j=1;j<=10;j++) cout<<i<<j;
cout<<i<<"\t";
}
getch( );
}
Saída:
Digite o número : 5
2 35
etiqueta:
declaração rótulo
; goto;
Salto para a frente Salto para trás
O rótulo: pode estar em qualquer lugar do programa antes ou depois do rótulo goto; declaração.
Se o rótulo: for colocado após o rótulo goto;, algumas instruções serão ignoradas e o salto é conhecido como
salto para frente.
Se o rótulo: é colocado antes do rótulo goto; Um loop será formado, algumas instruções serão executadas
repetidamente. Tal salto é conhecido como salto para trás.
Introdução da aula:
Uma abordagem de programação orientada a objetos é uma coleção de objetos e cada objeto consiste em
estruturas de dados e procedimentos correspondentes. O programa é reutilizável e mais sustentável.
O aspecto importante em oop é uma classe que tem sintaxe semelhante à de estrutura.
classe: É uma coleção de dados e funções de membro que manipulam dados. Os componentes de dados da
classe são chamados de membros de dados e as funções que manipulam os dados são chamadas de funções de
membro.
Também pode ser chamado de blue print ou protótipo que define as variáveis e funções comuns a todos
os objetos de determinado tipo. Também é conhecido como tipo de dados definido pelo usuário ou ADT (tipo
de dados abstrato) Uma classe é declarada pela classe de palavra-chave.
Sintaxe:-
classe class_name {
Especificador de acesso:
Declarações variáveis;
Especificador de acesso:
declarações de função;
};
Controle de acesso:
Especificador de acesso ou modificadores de acesso são os rótulos que especificam o tipo de acesso
dado aos membros de uma classe. Eles são usados para ocultar dados. Estes também são chamados de modos de
visibilidade. Existem três tipos de especificadores de acesso
1. privado
2.público
3. protegido
1. privado:
Se os membros de dados forem declarados como acesso privado, eles não poderão ser acessados de
outras funções fora da classe. Ele só pode ser acessado pelas funções declaradas dentro da classe. É declarado
pela palavra-chave "privado‟ .
2.public:
Se os membros de dados forem declarados acesso público, eles poderão ser acessados de outras funções
fora da classe. É declarado pela palavra-chave "público".
3. protegido: O nível de acesso da declaração protegida situa-se entre o público e o privado. Este especificador
de acesso é usado no momento da herança
Nota:-
Se nenhum especificador de acesso for especificado, ele será tratado por padrão como privado
O especificador de acesso padrão da estrutura é público onde como o de uma classe é "privado"
Exemplo:
aluno da turma
{
privado : int roll;
nome do char[30];
público:
void get_data()
{
cout<<"Digite o número e o nome do rolo": cin>>roll>>name;
}
void put_data()
{
cout<<"Número do rolo:"<<roll<<endl;
cout<<"Nome :"<<nome<<endl;
}
};
Object:-Instância de uma classe é chamada object.
Sintaxe:
class_name object_name;
Ex:
estudantes;
O acesso ao operador members:-d ot é usado para acessar membros da classe
Object-name.function-name(argumentos reais);
Ex:
s.get_data();
s.put_data();
Nota:
1 . Se o especificador de acesso não for especificado na classe, o especificador de acesso padrão será
privado
2 . Todas as funções de membro devem ser declaradas como públicas se não estiverem acessíveis fora
da classe. Objeto:
A instância de uma classe é chamada de objeto.
Sintaxe:
Class_name nome do objeto;
Exemplo:
estudantes;
no exemplo acima, s é o objeto. É uma entidade em tempo real que pode ser usada
Escrever um programa para ler dados de um aluno
#include<iostream>
usando namespace std;
aluno da turma
{
privado:
rolo int;
nome do char[20];
público:
void getdata()
{cout<<"Digite o número do rolo:";
cin>>roll;
cout<<"Digite o nome:";
cin>>nome;
}
void putdata()
{cout<<"Roll no:"<<roll<<endl;
cout<<Nome:"<<nome<<endl;
}
};
int main()
{
estudantes;
s.getdata();
s.putdata();
returm 0;
}
Operador de Resolução de Escopo:
Âmbito:-A visibilidade ou disponibilidade de uma variável em um programa é chamada de
escopo. Há dois tipos de escopo. i)Âmbito local ii)Âmbito global
Escopo local: a visibilidade de uma variável é local para a função na qual ela é declarada.
Escopo global: visibilidade de uma variável para todas as funções de um programa
Operador de resolução de escopo em "::" .
Isso é usado para acessar variáveis globais se as mesmas variáveis forem declaradas como
locais e globais
#include<iostream.h>
int a=5;
void principal()
{
int a=1;
cout<<"Local a="<<a<<endl;
cout<<"Global a="<<::a<<endl;
}
Escopo da classe:
Operador de resolução de escopo(::) é usado para definir uma função fora de uma classe.
#include <iostream>
usando namespace std;
Amostra de classe
{
público:
saída void(); declaração de função
};
definição de função fora do
classe void sample::output() {
cout << "Função definida fora da classe.\n";
};
int main() {
amostra obj;
obj.output();
retorno 0;
}
Saída do programa:
Função definida fora da classe.
retângulo vazio::get_data()
{
cout<<"Digite o comprimento do retângulo";
cin>>L;
cout<<"Entrar na largura do retângulo";
cin>>B;
}
retângulo int::area()
{
retorno L*B;
}
int main()
{
retângulo r;
r.get_data();
cout<<"Área do retângulo é"<<r.area();
retorno 0;
}
FUNÇÕES EM LINHA:
Definição:
Uma função embutida é uma função que é expandida na linha quando é chamada. A expansão em linha
torna um programa executado mais rapidamente porque a sobrecarga de uma chamada de função e
retorno é eliminada. Ele é definido usando a palavra-chave " inline"
Sintaxe:
Nome da classe do tipo de dados::Nome do static_variable;
Ex: int item::count;
#include<iostream.h>
#include<conio.h>
item de classe
{
contagem estática int;
número int;
público:
void getdata(int a) {
número=a; contagem++;
}
void getcount()
{
cout<<"count é"<<count;
}
};
int item::count;//decleration
int main()
{
item a,b,c;
a.getcount();
b.getcount();
c.getcount();
a.getdata(100);
b.getdata(200);
c.getdata(300);
cout<<"Após a leitura dos dados";
a.getcount();
b.getcount();
c.getcount();
retorno 0;
}
Saída:
contagem é 0
contagem é 0
contagem é 0
Após a leitura dos dados
contagem é 3
contagem é 3
contagem é 3
Funções de membro estático
Como variável de membro estático, também podemos ter funções de membro estático. Uma função de
membro declarada estática tem as seguintes propriedades:
Uma função estática pode ter acesso apenas a outros membros estáticos (funções ou variáveis)
declarados na mesma classe.
Uma função de membro estático deve ser chamada usando o nome da classe (em vez de seus objetos) da
seguinte maneira: class-name :: function-name;
#include<iostream.h>
Teste de classe
{
código int;
contagem estática int;
público:
void setcode()
{
código=++contagem;
}
void showcode()
{
cout<<"número do objeto"<<código;
}
Estática void showcount()
{
cout<<"contar"<<contar;
}
};
teste int::contagem;
int main()
{
teste t1,t2;
t1.setcode();
t2.setcode();
teste::showcount();
teste t3;
t3.setcode();
teste::showcount();
t1.showcode();
t2.showcode();
t3.showcode();
retorno 0;
}
Saída:
contagem 2
contagem 3
objeto número 1
objeto número 2
objeto número 3
Matrizes de objetos: Matrizes de variáveis do tipo "classe" é conhecida como "matriz de objetos". Uma matriz
de objetos é armazenada dentro da memória da mesma forma que em uma matriz comum.
Sintaxe:
classe class_name
{
privado:
data_type membros;
público:
data_type membros; funções de membro;
};
Matriz de objetos:
Class_name object_name[tamanho];
Onde tamanho é o tamanho da matriz
Ex:
Myclass obj[10];
Escrever um programa para inicializar matriz de objetos e imprimi-los
#include<iostream>
usando namespace std;
classe MyClass
{
Int A;
público:
conjunto void (int x)
{
a=x;
}
int get()
{
retorno a;
}
};
int main()
{
MyClass obj[5];
for(int i=0;i<5;i++)
obj[i].set(i);
for(int i=0;i<5;i++)
cout<<"obj["<<i<<"].get():"<<obj[i].get()<<endl;
}
Saída:
obj[0].get():0
obj[1].get():1
obj[2].get():2
obj[3].get():3
obj[4].get():4
Objetos como argumentos de função: Os objetos podem ser usados como argumentos para
Isso pode ser feito de três maneiras
a. Passe por valor ou chamada por valor
b. Endereço de passagem ou chamada por endereço
c. Passagem por referência ou chamada por referência
a.Pass-by-value – Uma cópia do objeto (objeto real) é enviada para a função e atribuída ao objeto da função
chamada (objeto formal). Cópias reais e formais de objetos são armazenadas em locais de memória diferentes.
Assim, as alterações feitas no objeto formal não são refletidas no objeto real. Escrever um programa para trocar
valores de dois objetos
Escrever um programa para trocar valores de dois objetos
#include<iostream.h>
usando namespace std;
amostra de classe2;
Classe Exemplo1
{
Int A;
público:
void getdata(int x);
exibição do vazio do amigo (sample1 x, sample2 y);
troca de vazio amigo (sample1 x, sample2 y);
};
void sample1::getdata(int x)
{
a=x;
}
Exemplo de classe2
{
Int B;
público:
void getdata(int x);
exibição do vazio do amigo (sample1 x, sample2 y);
};
void sample1::getdata(int x)
{
a=x;
}
Exemplo de classe2
{
Int B;
público:
void getdata(int x);
exibição do vazio do amigo (sample1 x, sample2 y);
troca de vazio amigo (sample1 *x,sample2 *y);
};
void sample2::getdata(int x)
{
b=x;
}
exibição void (sample1 x, sample2 y)
{
cout<<"Dados no objeto 1 são"<<endl;
Cout<<"a="<<x.a<<endl;
cout<<"Dados no objeto 2 são"<<endl;
cout<<"b="<<y.b<<endl;
}
troca nula (sample1 *x, sample2 *y)
{
Int t;
t=x->a;
x->a=y->b;
y->b=t;
}
int main()
{
amostra1 obj1;
amostra2 obj2;
obj1.getdata(5);
obj2.getdata(15);
cout<<"Antes da troca de dados entre dois objetos\n ";
Exibição (OBJ1,OBJ2);
swap(&obj1,&obj2);
cout<<"após Troca de dados entre dois objetos\n ";
Exibição (OBJ1,OBJ2);
}
Antes da troca de dados entre dois objetos
Os dados no objeto 1 são a=5
Os dados no objeto 2 são b=15
após Troca de dados entre dois objetos
Os dados no objeto 1 são a=15
Os dados no objeto 2 são b=5 c.Pass-by-reference:Uma referência de objeto é enviada como argumento para a
função.
A referência a uma variável fornece um nome alternativo para uma variável definida anteriormente. Se alguma
alteração for feita na variável de referência, então haverá uma alteração na variável original.
Uma variável de referência pode ser declarada da seguinte forma:
int x=5;
int &y=x;
Ex:
Escreva um programa para encontrar a soma de n números naturais usando a variável de referência
#include<iostream.h>
usando namespace std;
int main()
{
int i=0;
int &j=i;
int s=0;
Int n;
cout<<"Digite n:";
cin>>n;
enquanto(j<=n)
{
s=s+i;
i++;
}
cout<<"sum="<<s<<endl;
}
Saída:
Digite n:10
soma=55
Escrever um programa para trocar valores de dois objetos
#include<iostream.h>
usando namespace std;
amostra de classe2;
Classe Exemplo1
{
Int A;
público:
void getdata(int x);
exibição do vazio do amigo (sample1 x, sample2 y);
troca de vazio amigo (sample1 &x, sample2 &y);
};
void sample1::getdata(int x)
{
a=x;
}
Exemplo de classe2
{
Int B;
público:
void getdata(int x);
exibição do vazio do amigo (sample1 x, sample2 y);
troca de vazio amigo (sample1 &x, sample2 &y);
};
void sample2::getdata(int x)
{
b=x;
}
exibição void (sample1 x, sample2 y)
{
cout<<"Dados no objeto 1 são"<<endl;
Cout<<"a="<<x.a<<endl;
cout<<"Dados no objeto 2 são"<<endl;
cout<<"b="<<y.b<<endl;
}
troca de vazios (sample1 &x, sample2 &y)
{
Int t;
t=x.a;
x.a=y.b;
y.b=t;
}
int main()
{
amostra1 obj1;
amostra2 obj2;
obj1.getdata(5);
obj2.getdata(15);
cout<<"Antes da troca de dados entre dois objetos\n ";
Exibição (OBJ1,OBJ2);
permuta(obj1,obj2);
cout<<"após Troca de dados entre dois objetos\n ";
Exibição (OBJ1,OBJ2);
}
Saída:
Antes da troca de dados entre dois objetos
Os dados no objeto 1 são a=5
Os dados no objeto 2 são b=15
após Troca de dados entre dois objetos
Os dados no objeto 1 são a=15
Os dados no objeto 2 são b=5
FUNÇÕES DE AMIGO:Os membros privados não podem ser acessados de fora da classe. Uma função
não membro não pode ter acesso aos dados privados de uma classe. Em C++, uma função não membro pode
acessar private tornando a função amigável para uma classe.
Definição:
Uma função de amigo é uma função que é declarada dentro de uma classe e é definida fora da classe.
Ele não requer nenhum operador de resolução de escopo para definir . Ele pode acessar membros privados de
uma classe. É declarado usando a palavra-chave " amigo"
Ex:
Amostra de classe
{ int x,y; público: amostra(int a,int b);
amigo int sum(amostras s);
};
amostra::sample(int a, int b)
{ x=a;y=b;
}
int sum(amostras s)
{ int sum;
soma=s.x+s.y;
retorno 0;
}
void principal()
{
Amostra obj(2,3);
int res=soma(obj);
cout<< "sum="<<res<<endl;
}
Uma função de amigo possui certas características especiais:
Não está no âmbito da classe a que foi declarado amigo.
Como ele não está no escopo da classe, ele não pode ser chamado usando o objeto dessa classe. Ele pode ser invocado como
uma função normal sem a ajuda de qualquer objeto.
Ao contrário das funções de membro, ele não pode acessar os nomes de membro diretamente e precisa usar um nome de objeto
e um operador de associação de ponto com cada nome de membro.
Pode ser declarado na parte pública ou privada de uma classe sem afetar seu significado.
Normalmente, tem os objetos como argumentos.
Exemplo de classe #include<iostream.h>
{
Int A;
Int B;
público:
void setvalue()
{
a=25;
b=40;
}
média de flutuação amiga (amostra s);
};
média flutuante (amostra s)
{
flutuador de retorno (s.a+s.b)/2.0;
}
int main()
{
amostra X;
X.valor_conjunto();
cout<<"Valor médio="<<média(X);
retorno 0;
}
Escreva um programa para encontrar o máximo de dois números usando a função Friend para duas
classes diferentes #include<IOstream>
usando namespace std;
amostra de classe2;
Classe Exemplo1
{
Int X;
público:
amostra1(int a);
amigo void max (sample1 s1, sample2 s2)
};
amostra1::amostra1(int a)
{
x=a;
}
Exemplo de classe2
{
Int Y;
público:
amostra2(int b);
amigo void max (sample1 s1, sample2 s2)
};
Amostra2::amostra2(int b)
{
y=b;
}
void max (amostra1 s1, amostra2 s2)
{
Se(s1.x>s2.y)
cout<<"Membro de dados em Object da classe sample1 é maior "<<endl;
mais
cout<<"Membro de dados em Object da classe sample2 é maior "<<endl;
}
void principal()
{
amostra1 obj1(3);
amostra2 obj2(5);
máx(obj1,obj2);
}
#include<iostream>
usando namespace std;
complexo de classes
{
flutuar real, img;
público:
complexo();
complexo (float x, float y)
complexo amigo add_complex(complexo c1, complexo c2);
};
complexo::complexo()
{
real=img=0;
}
complexo: : complexo (float x, float y)
{
real=x;img=y;
}
complexo add_complex(complexo c1, complexo c2)
{
complexo t;
t.real=c1.real+c2.real;
t.img=c1.img+c2.img;
retorno t;
}
complexo vazio: :d isplay ()
{
se(img<0)
{img=-img;
cout<<real<<"-i"<<img<<endl
} else { cout<<real<<"+i"<<img<<endl
}
}
int main()
{
complexo obj1(2,3);
complexo obj2(-4,-6);
complexo obj3=add_compex(obj1,obj2);
obj3.display();
retorno 0;
}
Classe de amigos:Uma classe também pode ser declarada amiga de alguma outra classe. Quando criamos
uma classe de amigos, todas as funções de membro da classe de amigos também se tornam amigas da outra
classe. Isso requer a condição de que o amigo que se torna classe deve ser primeiro declarado ou definido
(declaração encaminhada).
#include <iostream.h>
classe sample_1
{
classe de amigos sample_2;//declarando classe de amigos
Int A,B;
público:
void getdata_1()
{
cout<<"Insira valores A & B na classe sample_1";
cin>>a>>b;
}
void display_1()
{
cout<<"A="<<a<<endl;
cout<<"B="<<b<<endl;
}
};
classe sample_2
{
int c,d,soma;
sample_1 obj1;
público:
void getdata_2()
{
obj1.getdata_1();
cout<<"Insira os valores C & D na classe sample_2"; cin>>c>>d;
}
void sum_2()
{
soma=obj1.a+obj1.b+c+d;
}
void display_2()
{
cout<<"A="<<obj1.a<<endl;
cout<<"B="<<obj1.b<<endl;
cout<<"C="<<c<<endl;
cout<<"D="<<d<<endl;
cout<<"SUM="<<soma<<endl;
}
};
int main()
{
sample_1 s1;
s1.getdata_1();
s1.display_1();
sample_2 s2;
s2.getdata_2();
s2.sum_2();
s2.display_2();
}
inteiro obj1; => não apenas cria o objeto OBJ1, mas também inicializa seus membros de dados m e n para zero.
Não há necessidade de escrever nenhuma instrução para invocar a função do construtor.
CARACTERÍSTICAS DO CONSTRUTOR
> Eles devem ser declarados na seção pública.
Eles são chamados automaticamente quando os objetos são criados.
> Eles não têm tipo de retorno, nem mesmo vazio.
Eles não podem ser herdados, embora uma classe derivada possa chamar o
construtor de classe base.
> Como outras funções do c++, elas podem ter argumentos padrão.
>
Eles fazem "chamadas implícitas" para os operadores novos e excluem quando a alocação de memória é
necessária.
Os construtores são de 3 tipos:
1. Default Construtor
2. Construtor parametrizado
3. Copy Construtor
1 . Construtor padrão: Um construtor que não aceita parâmetros é chamado de construtor padrão.
#include<iostream.h>
#include<conio.h> item de classe
{
Int M,N;
público:
item()
{
m=10;
n=20;
}
void put();
};
item nulo::p ut() {
Cout<<M<<N;
}
void principal()
{
item t;
t.put();
getch();
}
2 . Construtores parametrizados:-Os construtores que tomam parâmetros são chamados de
construtores parametrizados.
#include<iostream.h>
item de classe
{
Int M,N;
público:
item(int x, int y)
{
m=x;
n=y;
}
};
Quando um construtor foi parametrizado, a instrução de declaração de objeto, como o item t;
pode não funcionar. Devemos passar os valores iniciais como argumentos para a função do construtor
quando um objeto é declarado. Isso pode ser feito de 2 formas: item t=item(10,20); chamada explícita
void put();
};
item nulo: :p ut()
{
Cout<<M<<N;
}
void principal()
{
item T1(10,20);
item t2=item(20,30);
t1.put();
t2.put();
getch();
}
3 . Copy Construtor: Um construtor copy é usado para declarar e inicializar um objeto de
outro objeto.
Eg:
item t2(t1);
ou
item t2=t1;
Vários construtores em uma classe: Vários construtores podem ser declarados em uma classe. Pode
haver qualquer número de construtores em uma classe.
complexo de classes
{
flutuar real, img;
público:
complex()//default construtor
{
real=img=0;
}
real=img=r;
}
real=r;img=i;
}
complex(complex&c)//copy construtor
{
real=c.real;
img=c.img;
}
soma complexa (complexo c ) {
complexo t;
t.real=real+c.real;
t.img=img+c.img;
retorno t;
}
void show()
{
Se(img>0)
cout<<real<<"+i"<<img<<endl;
mais
{
img=-img;
cout<<real<<"-i"<<img<<endl;
}
};
void principal()
{
complexo c1(1,2);
complexo c2(2,2);
Compex C3;
c3=c1.soma(c3);
c3.show();
DESTRUIDORES:Um destruidor, é usado para destruir os objetos que foram criados por um construtor.
Como um construtor, o destruidor é uma função de membro cujo nome é o mesmo que o nome da
classe, mas é precedido por um til.
Ex: ~item() { }
1. Um destruidor nunca aceita nenhum argumento nem retorna qualquer valor.
2. Ele será invocado implicitamente pelo compilador ao sair do programa para limpar o armazenamento
que não está mais acessível.
3. É uma boa prática declarar destruidores em um programa, uma vez que ele libera espaço de memória
para uso futuro.
#include<iostream>
usando namespace std;
Marcas de classe
{
público:
int matemática;
int ciência;
construtor
Marcas() {
cout << "Inside Constructor"<<endl;
cout << "Objeto C++ criado"<<endl;
}
Destruidor
~Marcas() {
cout << "Inside Destructor"<<endl;
cout << "Objeto C++ destruído"<<endl;
}
};
int principal( )
{
Marcas m1;
Marcas m2;
retorno 0;
}
Saída:
Inside Construtor
Objeto C++ criado
Inside Construtor
Objeto C++ criado
Por dentro do Destruidor
Objeto C++ destruído
Por dentro do Destruidor
Objeto C++ destruído
HERANÇA: . O mecanismo de derivar uma nova classe de uma antiga é chamado de herança ou
derivação. A classe antiga é chamada de classe base e a nova é chamada de classe derivada ou subclasse. A
classe derivada herda alguns ou todos os traços da classe base.
Uma classe também pode herdar propriedades de mais de uma classe ou de mais de um nível. A
reutilização é uma característica importante da OOP
Uma classe derivada pode ser definida especificando sua relação com a classe base, além de seus próprios
detalhes.
Os dois pontos indicam que o nome da classe derivada é derivado do nome da classe base. O modo de
visibilidade é opcional e, se presente, pode ser privado ou protegido ou público. O padrão é privado. O modo
de visibilidade especifica se os recursos da classe base são derivados de forma privada ou derivada
publicamente.
derivação privada
classe ABC : privado XYZ {
membros da ABC;
};
classe ABC:XYZ pública
{
membros da ABC;
};
derivação pública
Tipos de herança: 1.Herança única 2.Herança multinível 3.Herança mutipilar 4.Herança híbrida 5. Herança
Hierárquica.
1.HERANÇA ÚNICA: uma classe derivada herda de apenas uma classe base. É a forma mais simples de
herança.
A / /Classe base
B //Classe derivada
#include<iostream> usando namespace std; classe A { public: int a,b; void get() { cout<<"Digite quaisquer dois
valores inteiros"<<endl; cin>>a>>b;
} };
classe B:público A {
Int C;
público:
void add()
{ c=a+b;
cout<<a<<"+"<<b<<"="<<c;
}
};
int main()
{
B b;
b.get();
b.add();
}
Saída:
Insira quaisquer dois valores inteiros
12
1+2=3
2.HERANÇA MULTINÍVEL: Nesse tipo de herança, a classe derivada herda de uma classe, que por sua vez
herda de alguma outra classe. A classe Super para um, é subclasse para o outro.
#include<iostream.h>
classe A
{
público:
Int A,B;
void get()
{
cout<<"Insira quaisquer dois valores inteiros"<<endl;
cin>>a>>b;
}
};
classe B: público A
{
público:
Int C;
void add()
{
c=a+b;
}
};
classe C: público B
{
público:
void show()
{
cout<<a<<"+"<<b<<"="<<c;
}
};
int main()
{
C c;
c.get();
c.add();
c.show();
}
Saída:
Insira quaisquer dois valores inteiros
12 14
12+14=26
3 . Herança múltipla:Neste tipo de herança, uma única classe derivada pode herdar de duas ou mais de
duas classes base.
Sintaxe:
classe D : visibilidade A, visibilidade B,.... {
#include<iostream.h>
classe A
{
público:
Int A;
void getA()
{
cout<<"Insira um valor inteiro"<<endl; Cín>>A;
}
};
classe B
{
público:
Int B;
void getB()
{
cout<<"Insira um valor inteiro"<<endl; Cín>>B;
}
};
4 . Herança híbrida: A herança híbrida é a combinação de duas ou mais heranças, como heranças únicas,
múltiplas, multinível ou hierárquicas.
#include<iostream.h>
Aritmética de classe
{
Protegido:
int núm1, núm2;
público:
void getdata()
{
cout<<"Para Adição:";
cout<<"\nDigite o primeiro número: ";
cin>>num1;
cout<<"\nDigite o segundo número: ";
cin>>num2;
}
};
Classe Plus:Aritmética Pública
{
Protegido:
int sum;
público:
void add()
{
soma=núm1+núm2;
}
};
classe menos
{
Protegido:
int n1,n2,diff;
público:
void sub()
{
cout<<"\nPara subtração:";
cout<<"\nDigite o primeiro número: ";
cin>>n1;
cout<<"\nDigite o segundo número: ";
cin>>n2;
diff=n1-n2;
} };
Resultado da classe:Público mais, Público menos
{
público:
exibição vazia()
{
Para adição:
Digite o primeiro número: 1
Para Subtração:
Digite o primeiro número: 3
Soma de 1 e 2= 3
Diferença de 3 e 4= -1
5 . Herança hierárquica:- Herdar é um método de herança onde uma ou mais classes derivadas são
derivadas da classe base comum.
Digite o número : 3
Um objeto de dados criado dentro de um bloco com new, permanecerá na existência até que seja
explicitamente
destruído usando delete.
novo operador:-
O operador NEW pode ser usado para criar objetos de qualquer tipo. Assim, o novo operador
aloca memória suficiente para armazenar dados de objetos e retorna o endereço da memória alocada.
Sintaxe:
>
Para criar espaço de memória para matrizes: pointer-variable = new data-type[size];
DElete Operador:
Se a variável ou objeto não é mais necessário ou necessário é destruído pelo operador "delete", lá
por alguma quantidade de memória é liberada para fins futuros. Synatx:
Ex: excluir p;
>
Se quisermos liberar um alocado dinamicamente
matriz: excluir [tamanho] ponteiro-variável;
Programa: escrever um programa para encontrar a soma da lista de inteiros #include<iostream> usando
namespace std; int main()
{
int n,*p;
cout<<"Digite o tamanho da matriz:";
cin>>n;
p=novo int[n];
cout<<"Entrar lista de inteiros"<<endl;
for(int i=0;i<n;i++)
cin>>p[i];
lógica para somação
int s=0;
for( int i=0;i<n;i++)
s=s+p[i];
cout<<"Soma dos elementos da matriz é\n";
cout<<s;
excluir [ ]p;
retorno 0;
}
Digite o tamanho da matriz:5
Insira a lista de números inteiros
1 2345
A soma dos elementos da matriz é
15
amostras; objeto
int exemplo: :*p;//pointer decleration
s.*p=10; correto
Cout<<S.*P;
}
Ponteiros para objetos:Ponteiros para objetos são úteis para criar objetos em tempo de execução. Para
acessar membros operador de seta ( ) e operador de referência ou indireção (*) são usados.
Declaração de ponteiro.
className*ptr
ex:
item *obj;
Aqui obj é um ponteiro para objeto do item de tipo.
item de classe
{
código int;
preço flutuante;
público:
void getdata(int a,float b)
{
código=a;
preço=b;
}
void show()
{
cout<<"código:"<<código<<"\n"<<"Preço:"<<preço<<endl;
}
};
b) usando o ponteiro
PTR->GetData(101.77,7);
ptr->show();
c)Usando operador de referência e operador de ponto (*ptr).getdata(101,77.7);
(*ptr).show();
A declaração acima cria espaço de memória para uma matriz de 10 objetos do item de tipo.
Ponteiros para classes derivadas: Os ponteiros podem ser declarados para a classe derivada. ele pode
ser usado para acessar membros da classe base e da classe derivada. Um ponteiro de classe base também pode
ser usado para apontar para o objeto da classe derivada, mas pode acessar somente os membros que são
herdados da classe base.
#include<iostream.h>
base de classe
{
público:
Int A;
void get_a(int x)
{
a=x;
}
void display_a()
{
cout<<"Na base"<<"\n"<<"a="<<a<<endl;
}
};
classe derivada:base pública
{
Int B;
público:
void get_ab(int x,int y)
{
a=x;
b=y;
}
void display_ab()
{
cout<<"Em Derivado "<<"\n"<<"a="<<a<<"\nb="<<b<<endl;
}
};
int main()
{
base b;
base *bptr;
bptr=&b;//aponta para o objeto da classe base
BPTR->get_a(100);
BPTR->display_a();
derivado d;
derivado *dptr;
dptr=&d;//aponta para o objeto da classe derivada
DPTR->get_a(400);
DPTR->display_a();
DPTR->get_ab(300.200);
DPTR->display_ab();
retorno 0;
}
Saída:
Na base
a=100
Na base
a=400
Em Derivado
a=300
b=200
Na base
a=400
Polimorfismo refere-se à propriedade pela qual objetos pertencentes a classes diferentes são capazes de
responder à mesma mensagem, mas formas diferentes. Um requisito essencial do polimorfismo é, portanto, a
capacidade de se referir a objetos sem qualquer consideração por suas classes.
Quando usamos o mesmo nome de função nas classes base e derivada, a função na classe bas é
declarada como virtual usando a palavra-chave virtual que precede sua declaração normal.
Quando uma função é tornada virtual, o C++ determina qual função usar em tempo de execução com base no
tipo de objeto apontado pelo ponteiro base, em vez do tipo do ponteiro. Assim, fazendo com que o ponteiro
base aponte para diferentes objetos, podemos executar diferentes versões da função virtual.
#include<iostream.h>
Base de classe
{
público:
exibição vazia()
{
cout<<"Base de Exibição";
}
Vazio Virtual Show()
{
cout<<"Mostrar Base";
}
};
classe Derivada : Base pública
{
público:
exibição vazia()
{
cout<<"Display Derivado";
}
void show()
{
cout<<"show derivado";
}
};
void principal()
{
Base b;
Derivado d;
Base *ptr;
cout<<"ptr aponta para Base";
ptr=&b;
ptr->display(); Base de chamadas
ptr->show(); / /chama Base
cout<<"ptr aponta para derivado";
ptr=&d;
ptr->display(); Base de chamadas
ptr->show(); classe Derivada
}
Saída:
Base de exibição
Mostrar derivado
Quando ptr é feito para apontar para o objeto d, a instrução ptr->display(); chama apenas a função
associado à Base, ou seja, Base::d isplay()
ptr->show();
chama a versão derivada de show(). Isso ocorre porque a função display() não foi tornada virtual na classe
Base.
Quando funções virtuais são criadas para implementar a vinculação tardia, observe algumas regras
básicas que satisfazem os requisitos do compilador.
SOBRECARGA DO OPERADOR
O C++ tem a capacidade de fornecer aos operadores um significado especial para um tipo de dados. O
mecanismo de dar tais significados especiais a um operador é conhecido como sobrecarga do operador.
Podemos sobrecarregar todos os operadores, exceto os seguintes:
Operador de acesso de membro de classe ("." E "
.*") Operador de resolução de escopo ": :"
Operador de tamanho (sizeof)
Operador condicional
Para definir uma tarefa adicional a um operador, especifique o que ela significa em relação à classe à
qual o operador é aplicado. Isso é feito com a ajuda de uma função especial, chamada função do
operador. O processo de sobrecarga envolve as seguintes etapas:
1. Crie uma classe que defina o tipo de dados a ser usado na operação de sobrecarga.
2. Declare o operador de função de operador op() na parte pública da classe. Pode ser uma função de
membro ou uma função de amigo.
3. Aqui op é o operador a ser sobrecarregado.
4. Defina a função do operador para implementar as operações necessárias.
Ex:
complexo complexo::operator+(complexo c)
{
complexo t;
t.real=real+c.real;
t.img=img+c.img;
retorno t;
}
Conceito de sobrecarga do operador
Um dos recursos exclusivos do C++ é a sobrecarga do operador. Aplicar sobrecarga aos operadores significa,
mesmo operador em responder de maneira diferente. Por exemplo, o operador + pode ser usado como operador
concatenado, bem como operador adicional.
Ex:
operador void-()
{
real=-real;
img=-img;
}
Sintaxe para operador Unary (Fora de uma classe)
return-type classname::operator operatorSymbol( )
{
corpo da função
}
Exemplo 1:-
void operador++()
{
contador++;
}
Exemplo 2:-
complexo void::operator-()
{
real=-real;
img=-img;
}
público:
fato ()
{
a=0;
} fato (int i) {
a=i;
}
operador de fato! ()
{
int f=1,i;
fato t;
para (i=1;i<=a;i++)
{
f=f*i;
}
t.a=f;
retorno t;
}
exibição vazia()
{
cout<<"O fatorial" << a;
}
};
void principal()
{
Int X;
cout<<"digite um número";
cin>>x;
fato s(x),p;
p=!s;
p.display();
}
Explicação:
Tomamos "!‟ como operador para sobrecarregar. Aqui nome de classe é fato. Construtor sem parâmetros para
tomar inicialmente o valor de "x‟ como 0. Construtor com parâmetro para assumir o valor de "x ‟ . Criamos
dois objetos um para fazer o fatorial e outro para retornar o fatorial. Aqui, o número de parâmetros para uma
função sobrecarregada é 0. Fatorial é operador unário porque opera em um item de dados. sobrecarga do
operador localizar o fatorial do objeto. A função de exibição para imprimir o resultado.
Exemplo 1:-
Escrever um programa para sobrecarregar o operador unário –
#include<iostream>
usando namespace std;
complexo de classes
{
flutuar real, img;
público:
complexo();
complexo (flutuador x, flutuador y);
exibição de vazios();
operador void-();
};
complexo::complexo()
{
real=0;img=0;
}
complexo::complexo (float x, float y)
{
real=x;
img=y;
}
complexo vazio: :d isplay()
{
int imag=img;
se(img<0)
{
imag=-img;
cout<<real<<" -i"<<imag<<endl;
}
mais
cout<<real<<" +i"<<img<<endl;
}
complexo void::operator-()
{
real=-real;
img=-img;
}
int main()
{
complexo c(1,-2);
c.display();
cout<<"Após Unary - operação\n";
-c;
c.display();
}
Exemplo 2:-
#include<iostream.h>
usando namespace std;
espaço de aula
{
Int x,y,z;
público:
void getdata(int a,int b,int c);
exibição de vazios();
operador void-();
};
espaço vazio :: getdata(int a,int b,int c)
{
x=a;
y=b;
z=c;
}
espaço vazio :: display()
{
cout<<"x="<<x<<endl;
cout<<"y="<<y<<endl;
cout<<"z="<<z<<endl;
}
espaço vazio :: operador-()
{
x=-x;
y=-y;
z=-z;
}
int main()
{
espaço s;
s.getdata(10,-20,30);
s.display();
-s;
cout<<"após a negação\n";
s.display();
}
Saída:
x=10
y=-20
z=30
após a negação
x=-10
y=20
z=-30
É possível sobrecarregar um operador unary minus usando uma função friend da seguinte maneira:
amigo operador vazio-(espaço &s);
Exemplo 3:-
Unary menos operador usando uma função de amigo
#include<iostream.h>
#include<iostream.h>
usando namespace std;
espaço de aula
{
Int x,y,z;
público:
void getdata(int a,int b,int c);
exibição de vazios();
amigo operador vazio-(espaço &);
};
espaço vazio :: getdata(int a,int b,int c)
{
x=a;
y=b;
z=c;
}
int main()
{
espaço S;
S.getdata(10,-20,30);
S.display();
-S;
cout<<"após a negação\n";
S.display();
}
Saída:
10 -20 30
após a negação
-10 20-30
Sintaxe para operador binário (dentro de uma classe) operador do tipo de retorno
operatorsymbol(argument) {
corpo da função
}
Sintaxe para definição de operador binário (Fora de uma classe ) return-type classname::operator
operatorsymbol(argument) {
corpo da função
}
1. Substitua a declaração de função de membro pela declaração de função de amigo no operador complexo
amigo de classe+(complexo, complexo)
2. Redefina a função do operador da seguinte maneira:
operador complexo+(complexo a, complexo b)
{
complexo de retorno((a.x+b.x),(a.y+b.y));
}
Escreva um programa para sobrecarregar operadores aritméticos em números complexos usando a
função amiga #include<iostream.h>
complexo de classes
{
flutuar real, img;
público:
complex(){ }
complexo (float x, float y)
{
real=x;
img=y;
}
amigo operador complexo+(complexo);
exibição de vazios();
};
operador complexo+(complexo c1, complexo c2)
{
temperatura complexa;
temp.real=c1.real+c2.real;
temp.img=c1.img+c2.img;
temperatura de retorno;
}
complexo vazio: :d isplay()
{
Se(img<0)
{
img=-img;
cout<<real<<"-i"<<img;
}
mais
cout<<real<<"+i"<<img;
}
int main()
{
complexo c1,c2,c3;
c1=complexo(2,5,3,5);
c2=complexo(1,6,2,7);
c3=c1+c2;
c3.display();
retorno 0;
}
UNIDADE -5
PROGRAMAÇÃO GENÉRICA(Templates)
Programação genérica é uma abordagem onde tipos genéricos são usados como parâmetros em algoritmos para
que eles funcionem para uma variedade de tipos de dados e estruturas de dados adequados.
Um benefício significativo da programação orientada a objetos é a reutilização do código, que elimina
a codificação redundante. Um recurso importante do C++ chamado templates fortalece esse benefício da OOP
e fornece grande flexibilidade à linguagem. Os modelos suportam programação genérica, o que permite
desenvolver componentes de software reutilizáveis, como funções, classes etc. Suporte a diferentes tipos de
dados em uma única estrutura.
Conceito de Templates
Introdução
Em vez de escrever funções diferentes para os diferentes tipos de dados, podemos definir
int máx (int a,int b); Retorna no máximo dois inteiros float
max (flutuador a, flutuador b); Retorno máximo de dois flutuadores char max (char a,char b); Retorna no
máximo dois caracteres (isso é chamado de sobrecarga de função)
Mas, em vez de escrever três funções diferentes como acima, o C++ forneceu o recurso chamado "Templates".
Com a ajuda de modelos, você pode definir apenas uma função comum da seguinte maneira:
Funções de modelo são a maneira de fazer resumos de função/classe criando o comportamento da função sem
saber quais dados serão manipulados por uma função. Em certo sentido, isso é o que é conhecido como
"funções genéricas ou programação".
A função de modelo é mais focada no pensamento algorítmico do que em um meio específico de um único
tipo de dados. Por exemplo, você pode criar uma função de push de pilha modelada. Essa função push pode
manipular a operação de inserção em uma pilha em qualquer tipo de dados, em vez de ter que criar uma função
de push de pilha para cada tipo diferente.
Sintaxe:
tipo de classe < modelo >
ret_type fun_name(lista de parâmetros)
{
--------------corpo de função
} //www.suhritsolutions.com
1 . Modelos de função
2 . Modelos de classe.
Modelos de função
Os modelos declarados para funções são chamados de modelos de função. Um modelo de função define como
uma função individual pode ser construída.
Sintaxe:
tipo de classe < modelo,......... >
ret _type fun_ nome(argumentos)
{
-----------------corpo da função
-----------------
}
MODELOS DE CLASSE
Os modelos declarados para classes são chamados de modelos de classe. Um modelo de classe
especifica como classes individuais podem ser construídas de forma semelhante à especificação de classe
normal. Essas classes modelam uma classe genérica que oferece suporte a operações semelhantes para
diferentes tipos de dados. Forma geral de um modelo de classe
…; ….
}
Uma classe criada a partir de um modelo de classe é chamada de classe de modelo. A sintaxe para definir um
objeto de uma classe de modelo é:
classname<type> objectname(arglist);
#include<iostream.h>
#include<conio.h>
modelo <classe T> troca de classe
{
T a,b;
público:
swap (T x, T y)
{
a=x;
b=y;
}
swapab nulo()
{
T temp;
temp=a;
a=b;
b=temp;
}
void showdata()
{
Cout<<A<<B;
}
};
void principal()
{
Int M,N;
flutuador m1,n1;
cout<<"Inserir valores inteiros";
cin>>m>>n;
cout<<"Inserir valores flutuantes";
cin>>m1>>n1;
swap<int> c1(m,n);
swap<flutuação> c2(m1,n1);
c1.swapab();
c1.ShowData();
c2.swapab();
c2.showdata();
}
Sintaxe:
Teste (T1 x, T2 y)
{ a=x; b=y;
}
void show()
{
Cout<<A<<B;
}
};
void principal()
{
Teste<flutuação,int> teste1(1.23,123);
Test<int,char> test2(100,‟w‟);
teste1.show();
teste2.mostrar();
}
MODELOS DE FUNÇÃO
Como o modelo de classe, também podemos definir modelos de função que seriam usados para criar uma
família de funções com diferentes tipos de argumento.
Formulário Geral:
modelo <classe T>
return-type function-name (argumentos do tipo T)
{}
#include<iostream.h>
modelo<classe T>
troca nula (T &x, T &y)
{
T temp = x;
x=y;
y=temp;
}
Void Fun(Int M, Int N, Float A, Float B)
{
Cout<<M<<N;
permuta (m,n);
Cout<<M<<N;
Cout<<A<<B;
permuta(a,b);
Cout<<A<<B;
}
int main()
{
diversão (100.200,11.22,33.44);
retorno 0;
}
Exemplo 2:-
#include < iostream.h >
#include < conio.h >
modelo
T máx (T a, T b)
{
se(a>b)
retorno a;
mais
retorno b;
}
void principal( )
{
char ch1,ch2,ch3;
cout<<"digite dois caracteres"<< ch2<< ch3;
cin>>ch2>>ch3;
d=máx(ch2,ch3);
cout<<"max(ch2,ch3)"<< ch1;
Int A,B,C;
cout<<"insira dois inteiros:";
cin>>a>>b;
c=máx(a,b);
cout<<"max(a,b):"<< c<< endl;
flutuador f1,f2,f3;
cout<<"Digite dois flutuadores< F1F2 >:";
cin>>f1,f2;
f3=máx(f1,f2);
cout<<"max(f1,f2):"<< f3;
}
saída:
digite dois caracteres: A,B
max (ch2, ch3): B
Digite dois inteiros:20,10
max (a,b): 20
Digite dois flutuadores: 20.5,30.9
máximo (f1, f2): 30.9
#include<iostream.h>
#inlcude<string.h>
modelo<clas T1, classe T2> void display(T1 x,T2 y) {
Cout<<X<<Y;
}
int main()
{
exibição (1999, "EBG");
exibição(12.34,1234);
retorno 0;
}
Tratamento de exceções
Exceções: As exceções são anomalias de tempo de execução ou condições incomuns que um programa pode
encontrar durante a execução do . As anomalias podem incluir condições como divisão por zero, acesso a uma
matriz fora de seus limites ou falta de memória ou espaço em disco. Quando um programa encontra uma
condição de exceção, ele deve ser identificado e manipulado.
As exceções fornecem uma maneira de transferir o controle de uma parte de um programa para outra.
A manipulação de exceções do C++ é baseada em três palavras-chave: try, catch e throw.
1.Exceções síncronas:Erros como "Índice fora do intervalo" e "Excesso de fluxo" são exceções síncronas
2.Exceções assíncronas: Os erros gerados por qualquer evento além do controle do programa são chamados de
exceções assíncronas
O objectivo do tratamento de excepções é fornecer um meio para detectar e comunicar uma circunstância
excepcional
cout<<"Resultado(a/x)="<<a/x<<endl;
}
mais
{ lançar x;
}
}
captura(int ex)
{
cout<<"Exceção capturada:Dividir por zero \n";
}
}
MECANISMO DE ARREMESSO
Quando uma exceção é detectada, ela pode ser lançada usando a instrução throw em qualquer uma das
seguintes formas
arremesso (exceção); lançar exceção;
jogar;
MECANISMO DE CAPTURA:
• Quando uma exceção é lançada, o manipulador de exceção é pesquisado para obter uma
correspondência apropriada.
• É possível que os argumentos de várias declarações catch correspondam ao tipo de exceção. Nesses
casos, o primeiro manipulador que corresponde ao tipo de exceção é executado
cout<<"pegou um inteiro"<<endl;
}
Captura (duplo d)
{
cout<<"pegou um duplo"<<endl;
}
}
int main()
{
teste(1);
teste(0);
teste(-1);
teste(2);
retorno 0;
}
Saída:
pegou um inteiro
pegou um personagem
pegou uma dobradinha
fim do bloco try
todos os tipos possíveis de excepções e, por conseguinte, podem não ser capazes de conceber manipuladores
de capturas independentes para os capturar . Em tais circunstâncias, podemos forçar uma declaração de
captura para capturar todas as exceções em vez de um determinado tipo apenas.
pega(...)
{}
retorno 0;
}
É possível passar a exceção capturada por um bloco catch novamente para outro manipulador de exceção.
Isso eu conheci como Re-throwing.
#include <iostream>
usando namespace std;
void MyHandler()
{ tente {
lançar "Olá";
}
Captura (Const Char*)
{
cout <<"Exceção capturada dentro de MyHandler\n";
jogar; relançar char* fora de função
}
}
int main()
{ cout<< "Início principal "<<Endl; tentar
{
MyHandler();
}
captura(const char*)
{
cout <<"Exceção capturada dentro do Main\n";
}
cout << "Fim principal";
retorno 0;
}
Especificando exceções:
Especificação de funções de restrição de exceção para lançar algumas exceções especificadas somente com o
uso de throw(exception list) no cabeçalho da função.
Formulário geral
Digite function_name(argument list) throw(exceptions -list)
{
Declarações
tente {
Declarações
}
#include <iostream>
usando namespace std;
teste de vazio (int x) lançamento (int, flutuar, char)
{
comutador (x)
{
caso 1: lance x;
quebrar;
caso 2: lançar 'x';
quebrar;
caso 3: arremesso duplo(x);
quebrar;
caso 4: lançar flutuador (x);
quebrar;
}
}
int main()
{
tentar
{
teste(4);//teste(4) conduz a terminação anormal
}
captura(int i)
{
cout <<"Caught int type exception\n";
}
captura (flutuar f)
{
cout <<"Exceção do tipo float capturado\n";
}
captura (char c)
{
cout <<"Exceção do tipo char capturado\n";
}
Captura (Duplo I)
{
cout <<"Exceção de tipo duplo capturado\n";
}
retorno 0;
}