Title: Cap
1(No Transcript)
2Capítulo 4
Parâmetros e Sobrecarga
Created por Frederick H. Colclough, Colorado
Technical University
3Objetivos de Estudo
- Parâmetros
- Chamados por valor
- Chamados por referência
- Lista de parâmetros mistos
- Sobrecarga e Argumentos-Padrão
- Exemplos e Regras
- Testando e Depurando Funções
- Macro assert
- Stubs e Drivers
4Parâmetros
- Dois métodos de passar argumentos comoparâmetros
- Chamados por valor
- Uma cópia do valor é passada
- Chamados por referência
- O endereço do argumento atual é passado
5Parâmetros Chamados por Valor
- Cópia do argumento atual é passada
- Considerado variável local dentro da função
- Se modificado, somente a cópia local muda
- A função não tem acesso ao argumento atualde
quem chamou - Este é o método padrão
- Usado em todos os exemplos até aqui
6Exemplo de Chamados por Valor
Painel 4.1 página 92
7Exemplo de Chamados por Valor (Cont)
Painel 4.1 página 92
8Chamados por Valor Armadilha
- Erro comum
- Declarar o parâmetro novamente dentro da
funçãodouble fee(int hoursWorked, int
minutesWorked) int quarterHours // variável
local int minutesWorked // NÃO! - Compilador apresenta um erro
- Redefinition error
- Chamados por valor SÃO como variáveis locais
- Mas a função recebe-os automaticamente
9Parâmetros Chamados por Referência
- Usados para fornecer acesso ao argumento
- atual de quem chamou
- A variáveis da função que chamou podem
- ser modicadas pela função chamada!
- Tipicamente usado por Funções de entrada
- Para recuperar dados para a função que chamou
- O dado é então entregue à função que chamou
- Assinalado pelo e comercial ao finaldo
nome do tipo
10Exemplo de Chamados por Referência
Painel 4.2 página 94
11Exemplo de Chamados por Referência (Cont)
Painel 4.2 página 94
12Chamados por Referência em detalhes
- O que relamente é passado?
- Uma referência volta para o argumento atual
- da função que chamou !
- Refere-se ao local na memória do argumento atual
- Chamado endereço, o qual é um número
- único referente a um local distinto na memória
13Parâmetros de Referência Constantes
- Argumentos por referência são de
naturezaperigosa - Dados da função que chamou podem ser mudados
- Com freqüência isso é desejado, algumas vezes não
- Para proteger os dados, e ainda passar por
referência - Utilize a palavra-chave const
- void sendConstRef( const int par1, const
int par2) - Faça argumentos somente-leitura por função
- Nunhuma mudança é permitida dentro do corpo
- da função
14Parâmetros e Argumentos
- Os termos geralmante usados podem
- causar confusão
- Significado verdadeiro
- Parâmetros formais
- Em uma declaração de função e definição de função
- Argumentos
- Usados para preencher um parâmetro formal
- Na chamada de função (Lista de argumentos)
- Chamados por valor e Chamados por referência
- Simplesmente o mecanismo usado no processo
15Lista de parâmetros mistos
- Pode combinar mecanismos de passagem
- A lista de parâmentros pode incluir passa-gem
por valor e por referência - A ordem dos argumentos na lista é críticavoid
mixedCall(int par1, int par2, double par3) - Chamada de FunçãomixedCall(arg1, arg2, arg3)
- arg1 precisa ser do tipo integer, é passado por
referência - arg2 precisa ser do tipo integer, é passado por
valor - arg3 precisa ser do tipo double, é passado por
referência
16Escolhendo Nomes de Parêmetros Formais
- As mesmas regras para nomear qualquer
indentificador - Nomes significativos!
- Funções como módulos independentes
- Escritas separadamente do resto do programa
- Atribuídas à equipes de programadores
- Todos devem entender o uso adequado da função
- OK se nomes de parêmetros formais são os
- mesmos que os nomes de argumentos
- Escolha nomes de função com as mesmas regras
17Sobrecarga
- Mesmo nome de função
- Lista diferente de parâmetros
- Duas definições de função separadas
- Assinatura de Função
- Nome da função e lista de parâmetros
- Pecisa ser único para cada definição de função
- Permite que a mesma tarefa seja executada
- com dados diferentes
18Exemplo de Sobrecarga Média
- Função calcula a média de 2 númerosdouble
average(double n1, double n2) return ((n1
n2) / 2.0) - Agora calcula a média de 3 númerosdouble
average(double n1, double n2, double
n3) return ((n1 n2) / 2.0) - Mesmo nome, duas funções
19médiaSobrecarregada( ) (cont)
- Qual função foi chamada?
- Depende da chamada de função
- avg average(5.2, 6.7)
- Chama média de dois parâmetros()
- avg average(6.5, 8.5, 4.2)
- Chama média de três parâmetros()
- O compilador decide sobre a chamada baseado
- na assinatura na função
- Identifica a chamada com a função apropriada
- Cada uma é considerada um função separada
20Sobrecarga Armadilha
- Somente sobrecarregue funções que executem
- a mesma tarefa
- Uma função mpg() deve sempe executar aa mesma
tarefa, em todas as sobrecargas - De outro modo, os resultados são imprevisíveis
- Solução de chamada de função em C
- 1o Olhe para a assinatura exata
- 2o Olhe para a assinatura compatível
21Solução de Sobrecarga
- 1o Identidade Perfeita
- Olhe para a assinatura exata
- Onde nenhuma conversão de argumento é requerida
- 2o Identidade compatível
- Olhe para a assinatura compatível, ondeÉ
possível a conversão automática de tipos - 1o com promoção (ex. int?double)
- Nenhuma perda dos dados
- 2o com rebaixamento (ex. double?int)
- Possível perda de dados
22Exemplo de Solução de Sobrecarga
- Dadas as seguintes funções
- 1. void f(int n, double m)2. void f(double
n, int m)3. void f(int n, int m) - Estas chamadasf(98, 99) ? Calls 3f(5.3,
4) ? Calls 2f(4.3, 5.2) ? Calls ??? - Evita confusão com sobrecarga
23Conversão Automática de Tipo e Sobrecarga
- Parâmetros numéricos formais sãotipicamente do
tipo double - Levam em conta qualquer tipo numérico
- Qualquer dado inferior é automaticamentepromovi
do - int ? double
- float ? double
- char ? double Falaremos mais sobre isso!
- Evita sobrecarga para tipos numéricos diferentes
24Exemplo de Conversão Automática de Tipo e
Sobrecarga
- double mpg(double milhas, double
galoes) return (milhas/galoes) - Exemplo de chamada de função
- mpgComputed mpg(5, 20)
- Converte 5 e 20 para doubles, então passa
- mpgComputed mpg(5.8, 20.2)
- Nenhuma conversão é necessária
- mpgComputed mpg(5, 2.4)
- Converte 5 para 5.0, então passa o valor para a
função
25Argumentos-padrão
- Permitem omitir alguns argumentos
- Especificados na declaração/protótipo de função
- void showVolume( int length, int width
1, int height 1) - Os últimos 2 argumentos são padrões
- Chamadas possíveis
- showVolume(2, 4, 6) //Todos os argumentos
fornecidos - showVolume(3, 5) //Altura padronizada para 1
- showVolume(7) //Largura e altura padronizados
para 1
26Exemplo de Argumentos-padrão
Painel 4.8 página 109
27Testando e Depurando Funções
- Muitos métodos
- Muitos comandos cout
- Em chamadas e definições
- Usados para marcar a execução
- Depurador
- Ambiente-dependente
- Macro assert
- Término prematuro é necessário
- Stubs and drivers
- Desenvolvimento incremental
28A Macro assert
- Asserção um comando true ou false
- Usado para documentar e verificar a exatidão
- Pré-condições e Pós-condições
- Uso típico Confirmar a validade
- Sintaxeassert(ltassert_conditiongt)
- Não retorna valor
- Avalia assert_condition
- Termina se falso, continua se verdadeiro
- Predefinido na Biblioteca ltcassertgt
- Macros usadas semelhante a funções
29Um exemplo de macro assert
- Dada a Declaração de Funçãovoid calculaMoeda
( int valorDaMoeda, int numero, int
quantiaRestante)//Pré-condição 0 lt
valorDaMoeda lt 100 0 lt quantiaRestante
lt100//Pós-condição número fixado como igual ao
número máximo de moedas - Verificar a pré-condição
- assert ((0 lt moedaAtual) (moedaAtual lt 100)
(0 lt quantiaRestanteAtual)
(quantiaRestanteAtual lt 100)) - Se a pré-condição não foi satisfeita ? condição é
falsa ? programatermina a execução!
30Um exemplo de macro assert (cont)
- Útil na Depuração
- Pára a execução, assim um problema
- pode ser verificado
31assert liga/desliga
- O pré-processador fornece os meios
- define NDEBUGinclude ltcassertgt
- Adicionar a linha define antes da linha
include - Desliga todas as asserções através do programa
- Remover a linha define (ou torná-la
comentário) - Liga as asserções
32Stubs e Drivers
- Unidades de Compilação Separadas
- Cada função é projetada, codificada e testada
- separadamente
- Garante a validade de cada unidade
- Dividir e Conquistar
- Transformar uma tarefa grande ? menor e
- gerenciável
- Mas como testar independentemente?
- Programas Driver
33Exemplo de Programas Driver
Painel 4.9 página 111
34Exemplo de Programas Driver (cont)
Painel 4.9 página 112
35Stubs
- Desenvolver incrementalmente
- Escrever funções de alto-nível primeiro
- funções de baixo-nível por último
- Teste funções com Stubs até a implementação
- Exemplodouble precoUnidade (int diametro,
double preco) return (9.99) // inválido, mas
perceptível // um valor temporary - Chamadas para função ainda funcionarão
36Regra Fundamental de Teste
- Para escrever programascorretos
- Minimize erros, bugs
- Garanta a validade dos dados
- Cada função deve ser testada em um programa
- em que todas as outras funções já foram
totalmente - testadas e depuradas.
- Evite erros em cascata e resultados conflitantes
37Sumário 1
- Parâmetro Formal é um guardador de lugar,
preenchido com o argumento atual na chamada de
função - Parâmetros chamados por valor são cópias
locais no corpo da função que recebe - O argumento atual não pode ser modificado
- Chamados por referência passam o endereço
- de memória do argumento atual
- O argumento atual pode ser modificado
- O argumento DEVE ser uma variável, não
- uma constante
38Sumário 2
- É possível múliplas definições do mesmo nome
defunção chamado sobrecarga - Argumentos-Padrão permitem a chamada de
funçãoomitir alguns ou todos os argumentos da
lista - Se não fornecidos ? São atribuídos valores-padrão
- A macro assert finaliza o programa se as
asserções falharem - Funções deveriam ser testadas independentemente
- Como Unidades de Compilação Separadas,
- Com drivers