1
Capítulo 3 - Funções
Índice
3.1
Introdução
3.2
Componentes de Programa em C++
3.3
Biblioteca de Funções Matemáticas
3.4
Funções
3.5
Definição de Funções
3.6
Protótipos de Funções
3.7
Arquivos Header
3.8
Geração de Números Randômicos
3.9
Exemplo: Um Jogo de Azar e Introduzindo enum
3.10
Classes de Armazenamento
3.11
Regras de Escopo
3.12
Recursão
3.13
Exemplo Usando Recursão: A Série de Fibonacci
3.14
Recursão vs. Iteração
3.15
Funções com Lista de Parâmetros Vazia
2
Capítulo 3 - Funções
Índice
3.16
Funções inline
3.17
Referências e Parâmetros por Referência
3.18
Argumentos Default
3.19
Operador Unário de Resolução de Escopo
3.20
Sobrecarga de Funções
3.21
Funções Template
3
3.1
Introdução
• Dividir e conquistar
– Construir um programa a partir de pequenas peças ou
componentes
– Cada peça mais gerenciável que o programa original
4
3.2
Componentes de Programa em C++
• Programas escritos
– Combinando novas funções com funções “pré-empacotadas”
da biblioteca padrão do C++.
– A biblioteca padrão fornece uma rica coleção de funções
.
• Funções são invocadas por uma chamada de
função
– Uma chamada de função especifica o nome da função e
fornece informação (como argumentos) que a função
chamada necessita
– Analogia chefe para empregado:
Um chefe (que chama a função ou caller) pede ao empregado
(a função chamada) a executar uma tarefa e retornar (isto é,
informar de volta) os resultados quando a tarefa for
completada.
5
3.2
Componentes de Programa em C++
• Definição de funções
– Escritas apenas uma vez
– Seus comandos estão ocultos de outras funções.
– Analogia chefe para empregado:
O chefe não sabe como o empregado vai fazer o trabalho; ele
apenas quer que o trabalho seja feito
6
3.3
Biblioteca de Funções Matemáticas
• Biblioteca de funções matemáticas
– Permite ao programador a executar cálculos matemáticos
comuns
– São usadas incluindo o arquivo header <cmath>
• Formato de chamadas de função
nomeFuncao (argumento)
• Exemplo
cout << sqrt( 900.0 );
– Chama a função sqrt (raiz quadrada). O comando irá
imprimir 30
– A função sqrt toma um argumento do tipo double e
retorna um resultado do tipo double
7
3.3
Biblioteca de Funções Matemáticas
• Argumento de funções podem ser
– Constantes
sqrt( 4 );
– Variáveis
sqrt( x );
– Expressões
sqrt( sqrt( x ) ) ;
sqrt( 3 - 6x );
83.4
Funções
• Funções
– Permitem ao programador modularizar o programa
• Variáveis locais
– Conhecidas apenas dentro da função em que são definidas
– Todas as variáveis declaradas em uma definição de função
são variáveis locais
• Parâmetros
– Variáveis locais passadas quando a função é chamada que
fornecem informação externa à função
9
3.5
Definição de Funções
• Crie funções customizadas para
– Ler dados
– Executar operações
– Retornar resultados
• Formato para definição de funções:
tipo-de-valor-de-retorno nome-da-funcao( lista-de-parâmetros )
{
declarations and statements
}
• Exemplo
:
int square(int y)
{
return y * y;
}
Índice
101. Protótipo da Função
2. Laço
•
Definição da Função
Saída do Programa
1 // Fig. 3.3: fig03_03.cpp2 // Creating and using a programmer-defined function
3 #include <iostream> 4
5 using std::cout; 6 using std::endl; 7
8 int square( int ); // function prototype
9 10int main() 11{ 12 for ( int x = 1; x <= 10; x++ ) 13 cout << square( x ) << " "; 14 15 cout << endl; 16 return 0; 17} 18 19// Function definition
20int square( int y ) 21{
22 return y * y; 23}
1 4 9 16 25 36 49 64 81 100
Note como parâmetros e retorno são
declarados.
Índice
111. Protótipo da Função
(3 parâmetros)
2. Valores de Entrada
2.1 Chamada da Função
1 // Fig. 3.4: fig03_04.cpp2 // Finding the maximum of three integers
3 #include <iostream> 4 5 using std::cout; 6 using std::cin; 7 using std::endl; 8
9 int maximum( int, int, int ); // function prototype
10 11int main() 12{ 13 int a, b, c; 14
15 cout << "Enter three integers: "; 16 cin >> a >> b >> c; 17
18 // a, b and c below are arguments to
19 // the maximum function call
20 cout << "Maximum is: " << maximum( a, b, c ) << endl;
Índice
12•
Definição da função
Saída no Programa
21 22 return 0; 23} 2425// Function maximum definition
26// x, y and z below are parameters to
27// the maximum function definition
28int maximum( int x, int y, int z ) 29{ 30 int max = x; 31 32 if ( y > max ) 33 max = y; 34 35 if ( z > max ) 36 max = z; 37 38 return max; 39}
Enter three integers: 22 85 17 Maximum is: 85
Enter three integers: 92 35 14 Maximum is: 92
Enter three integers: 45 19 98 Maximum is: 98
13
3.6
Protótipo de Funções
• Protótipo de Função
– Nome da função
– Parâmetros
• Informação que a função recebe
– Tipo de retorno
• Tipo da informação que a função passa de volta ao caller (default
int)
• void significa que a função não retorna nada
– Somente necessária se a definição da função vier após a
chamada da função no programa
• Exemplo:
int maximum( int, int, int );
– Recebe 3 ints
– Retorna um int
14
3.7
Arquivos Header
• Arquivo header
– Contém protótipo de funções para biblioteca de funções
– <cstdlib> , <cmath>, etc.
– Carregado com #include <filename>
• Exemplo:
#include <cmath>
• Arquivo header customizado
– Definido pelo programador
– Salvo como filename.h
– Carregado no programa usando
#include "filename.h"
15
3.8
Geração de Números Randômicos
• Função rand
i = rand();
– Carregue <cstdlib>
– Gera um número pseudorandômico entre 0 and RAND_MAX
(normalmente 32767)
• Um números pseudorandômico é uma seqüência pré-definida de números
“randômicos"
• A mesma seqüência é gerada a cada execução do programa
• Função srand
– Pula pra uma nova localização base (seed) de uma seqüência
“randômica”
srand( seed );
srand( time( 0 ) ); //deve incluir <ctime>
– time( 0 )
• A hora em que o programa foi compilado
– Muda o seed cada vez que o programa é compilado, portanto permitindo
rand gerar números randômicos
16
3.8
Geração de Números Randômicos
• Escala
– Reduz o número randômico a uma determinada faixa
– Operador Modulus ( % )
• Reduz o número entre 0 e RAND_MAX para um número entre 0
e um fator de escala
– Exemplo
i = rand() % 6 + 1;
• Gera um número entre 1 e 6
Índice
171. Define o laço
•
Imprime o número
randômico
Saída do Programa
1 // Fig. 3.7: fig03_07.cpp2 // Shifted, scaled integers produced by 1 + rand() % 6
3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 7 8 #include <iomanip> 9 10using std::setw; 11 12#include <cstdlib> 13 14int main() 15{
16 for ( int i = 1; i <= 20; i++ ) { 17 cout << setw( 10 ) << ( 1 + rand() % 6 ); 18 19 if ( i % 5 == 0 ) 20 cout << endl; 21 } 22 23 return 0; 24}
Note rand() % 6 . Isto retorna um número
entre 0 e 5 (escala). Adicione 1 para ter um
número entre 1 e 6.
Executando o programa novamente gera
a mesma seqüência “randômica” de
lançamentos de um “dado”.
5 5 3 5 5 2 4 2 5 5 5 3 2 2 1 5 1 4 6 4Índice
181. Inicializa o seed
2. Valor de entrada para
o seed
2.1 Use srand para
alterar a seqüência
randômica
2.2 Define o laço
3. Gera e imprime os
números randômicos
1 // Fig. 3.9: fig03_09.cpp2 // Randomizing die-rolling program
3 #include <iostream> 4 5 using std::cout; 6 using std::cin; 7 using std::endl; 8 9 #include <iomanip> 10 11using std::setw; 12 13#include <cstdlib> 14 15int main() 16{ 17 unsigned seed; 18
19 cout << "Enter seed: "; 20 cin >> seed; 21 srand( seed ); 22
23 for ( int i = 1; i <= 10; i++ ) { 24 cout << setw( 10 ) << 1 + rand() % 6; 25 26 if ( i % 5 == 0 ) 27 cout << endl; 28 } 29 30 return 0; 31}
Índice
19Saída do Programa
Enter seed: 67 1 6 5 1 4 5 6 3 1 2 Enter seed: 432 4 2 6 4 3 2 5 1 4 4 Enter seed: 67 1 6 5 1 4 5 6 3 1 2Note como os lançamentos
do “dado” muda com o
seed.
20
3.9
Exemplo: Um Jogo de Azar e
Introduzindo enum
• Enumeração – conjunto de inteiros com
identificadores
enum nomeTipo {constante1, constante2…};
– Constantes começam em 0 (default), incrementado por 1
– Nomes de contantes únicos
– Exemplo:
enum Status {CONTINUE, WON, LOST};
• Criando uma variável de enumeração do tipo
nomeTipo
– Variável é constante, seu valor não pode ser reatribuído
Status enumVar; // cria variável
enumVar = WON; // atribui com valor WON
enumVar = 1; // ERRO
21
Exemplo: Um Jogo de Azar e
Introduzindo enum
• Constantes de enumeração podem ter valores
pré-definidos
enum Months { JAN = 1, FEB, MAR, APR, MAY, JUN,
JUL, AUG, SEP, OCT, NOV, DEC};
– Começa em 1, incrementado por 1
• Regras do simulador de Craps (jogo de dados)
– Jogue dois dados
• 7 ou 11 no primeiro lance, o jogador ganha
• 2, 3, ou 12 no primeiro lance, o jogador perde
• 4, 5, 6, 8, 9, 10
– o valor se torna os “pontos” do jogador
– para vencer, jogador deve jogar os dados novamente
tentando repetir seus pontos antes de tirar um 7
Índice
221. Protótipo da função
rollDice
1.1 Inicializa variáveis e
o enum
1.2 Define o seed com
srand
2. Define comando
switch para
win/loss/continue
1 // Fig. 3.10: fig03_10.cpp 2 // Craps 3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 7 8 #include <cstdlib> 9 10#include <ctime> 11 12using std::time; 1314int rollDice( void ); // function prototype
15 16int main() 17{
18 enum Status { CONTINUE, WON, LOST }; 19 int sum, myPoint;
20 Status gameStatus; 21
22 srand( time( 0 ) );
23 sum = rollDice(); // first roll of the dice
24
25 switch ( sum ) { 26 case 7:
27 case 11: // win on first roll
28 gameStatus = WON; 29 break; 30 case 2: 31 case 3:
32 case 12: // lose on first roll
33 gameStatus = LOST; 34 break;
Note como o
enum é definido
Índice
232.1 Define laço para
continuar jogando
2.2 Imprime se perdeu
ou ganhou
35 default: // remember point
36 gameStatus = CONTINUE; 37 myPoint = sum;
38 cout << "Point is " << myPoint << endl; 39 break; // optional
40 } 41
42 while ( gameStatus == CONTINUE ) { // keep rolling
43 sum = rollDice(); 44
45 if ( sum == myPoint ) // win by making point
46 gameStatus = WON; 47 else
48 if ( sum == 7 ) // lose by rolling 7
49 gameStatus = LOST; 50 }
51
52 if ( gameStatus == WON ) 53 cout << "Player wins" << endl; 54 else
55 cout << "Player loses" << endl; 56 57 return 0; 58} 59
Índice
243. Define a função
rollDice
Saída do Programa
Player rolled 6 + 5 = 11 Player wins Player rolled 6 + 5 = 11 Player wins Player rolled 4 + 6 = 10 Point is 10 Player rolled 2 + 4 = 6 Player rolled 6 + 5 = 11 Player rolled 3 + 3 = 6 Player rolled 6 + 4 = 10 Player wins Player rolled 1 + 3 = 4 Point is 4 Player rolled 1 + 4 = 5 Player rolled 5 + 4 = 9 Player rolled 4 + 6 = 10 Player rolled 6 + 3 = 9 Player rolled 1 + 2 = 3 Player rolled 5 + 2 = 7 Player loses60introllDice( void)
61{
62 int die1, die2, workSum;
63
64 die1 = 1 + rand() % 6;
65 die2 = 1 + rand() % 6;
66 workSum = die1 + die2;
67 cout << "Player rolled " << die1 << " + " << die2
68 << " = " << workSum << endl;
69
70 return workSum;
25
3.10 Classes de Armazenamento
• Especificadores de classe de armazenamento
– Classe de armazenamento
• Onde o objeto existe na memória
– Escopo
• Onde o objeto é referenciado no programa
– Ligação (linkage)
• Onde um identificador é conhecido
• Armazenamento automático
– Objeto criado e destruído dentro de seu bloco
– auto
• Default para variáveis locais.
• Exemplo:
auto float x, y;
– register
• Tenta colocar variáveis em registros de alta velocidade
– Só pode ser utilizado com variáveis locais e parâmetros
26
3.10 Classes de Armazenamento
• Armazenamento estático
– Variáveis existem para toda a execução do programa
– static
• Variáveis locais definidas em funções
• Mantém o valor após o fim da função
• Somente conhecidas em sua própria função
– extern
• Default para variáveis globais e funções
• Conhecidas em qualquer função
27
3.11 Regras de Identificador de Escopo
• Escopo de arquivo
– Definido fora de uma função, conhecido em todas as funções
– Exemplos incluem, variáveis globais, definição de funções e protótipos
de funções
• Escopo de função
– Só pode ser referenciado dentro do corpo de uma função
– Somente labels (start:, case:, etc.)
• Escopo de bloco
– Declarado dentro de um bloco. Começa na declaração, termina com }
(fecha chaves)
– Variáveis, parâmetros de função (variáveis locais à função)
– Blocos externos são “escondidos” de blocos internos no caso de
variáveis com mesmo nome
• Escopo de protótipo de função
– Identificadores na lista de parâmetros
– Nomes no protótipo de função são opcionais (são ignorados pelo
compilador)
Índice
281. Protótipos de função
1.1 Inicializa variáveis
globais
1.2 Inicializa variáveis
locais
1.3 Inicializa variável
local ao bloco
2. Chama funções
3. Imprime resultados
1 // Fig. 3.12: fig03_12.cpp 2 // A scoping example 3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 78 void a( void ); // function prototype
9 void b( void ); // function prototype
10void c( void ); // function prototype
11
12int x = 1; // global variable
13 14int main() 15{
16 int x = 5; // local variable to main
17
18 cout << "local x in outer scope of main is " << x << endl; 19
20 { // start new scope
21 int x = 7; 22
23 cout << "local x in inner scope of main is " << x << endl; 24 } // end new scope
25
26 cout << "local x in outer scope of main is " << x << endl; 27
28 a(); // a has automatic local x
29 b(); // b has static local x
30 c(); // c uses global x
31 a(); // a reinitializes automatic local x
32 b(); // static local x retains its previous value
33 c(); // global x also retains its value
34
x é diferente dentro e fora do
bloco.
local x in outer scope of main is 5 local x in inner scope of main is 7 local x in outer scope of main is 5
Índice
293.1 Define funções
35 cout << "local x in main is " << x << endl; 36 37 return 0; 38} 39 40void a( void ) 41{
42 int x = 25; // initialized each time a is called
43
44 cout << endl << "local x in a is " << x 45 << " after entering a" << endl; 46 ++x;
47 cout << "local x in a is " << x 48 << " before exiting a" << endl; 49}
50
51void b( void ) 52{
53 static int x = 50; // Static initialization only
54 // first time b is called.
55 cout << endl << "local static x is " << x 56 << " on entering b" << endl; 57 ++x;
58 cout << "local static x is " << x 59 << " on exiting b" << endl; 60}
61
62void c( void ) 63{
64 cout << endl << "global x is " << x 65 << " on entering c" << endl; 66 x *= 10;
67 cout << "global x is " << x << " on exiting c" << endl; 68}
Variáveis locais automáticas
são criadas e destruídas toda
vez que a é chamada.
Variáveis locais estáticas
não são destruídas quando a
função termina.
Variáveis globais são sempre
acessíveis. A função c
referencia a variável global x.
local x in a is 25 after entering a local x in a is 26 before exiting a
local static x is 50 on entering b local static x is 51 on exiting b
global x is 1 on entering c global x is 10 on exiting c
Índice
30Saída do Programa
local x in outer scope of main is 5 local x in inner scope of main is 7 local x in outer scope of main is 5 local x in a is 25 after entering a local x in a is 26 before exiting a local static x is 50 on entering b local static x is 51 on exiting b global x is 1 on entering c global x is 10 on exiting c local x in a is 25 after entering a local x in a is 26 before exiting a local static x is 51 on entering b local static x is 52 on exiting b global x is 10 on entering c global x is 100 on exiting c local x in main is 5
31
3.12 Recursão
• Funções recursivas
– São funções que chamam a si próprias
– Só podem resolver um caso base
– Se não for o caso base, a função quebra o problema em um
problema um pouco menor, mais simples que lembra o
problema original e
• Lança uma nova cópia de si mesma para trabalhar o problema
menor, vagarosamente convergindo ao caso base
• Faz uma chamada a si mesma no comando return
– Em algum ponto, o caso base é resolvido e o valor segue seu
caminho de volta para resolver todo o problema
32
3.12 Recursão
• Exemplo: fatorial
n! = n * ( n – 1 ) * ( n – 2 ) * … * 1
– Relacionamento recursivo ( n! = n * ( n – 1 )! )
5! = 5 * 4!
4! = 4 * 3!…
– Caso base (1! = 0! = 1)
333.13 Exemplo Usando Recursão:
A Série de Fibonacci
• A série de Fibonacci: 0, 1, 1, 2, 3, 5, 8...
– Cada número é a soma dos dois números anteriores
– Exemplo de uma fórmula recursiva:
fib(n) = fib(n-1) + fib(n-2)
• Código C++ para a função fibonacci
long fibonacci( long n )
{
if ( n == 0 || n == 1 ) // caso base
return n;
else return fibonacci( n - 1 ) +
fibonacci( n – 2 );
}
34
3.13 Exemplo Usando Recursão:
A Série de Fibonacci
• Diagrama da função de Fibonnaci
f( 3 ) f( 1 ) f( 2 ) f( 1 ) f( 0 ) return 1 return 1 return 0 return + + return
Índice
351. Protótipo da função
1.1 Inicialização das
variáveis
2. Entrada de um inteiro
2.1 Chamada à função
fibonacci
2.2 Impressão dos
resultados.
3. Define fibonacci
recursivamente
1 // Fig. 3.15: fig03_15.cpp2 // Recursive fibonacci function
3 #include <iostream> 4 5 using std::cout; 6 using std::cin; 7 using std::endl; 8
9 unsigned long fibonacci( unsigned long ); 10
11int main() 12{
13 unsigned long result, number; 14
15 cout << "Enter an integer: "; 16 cin >> number;
17 result = fibonacci( number );
18 cout << "Fibonacci(" << number << ") = " << result << endl; 19 return 0;
20} 21
22// Recursive definition of function fibonacci
23unsigned long fibonacci( unsigned long n ) 24{
25 if ( n == 0 || n == 1 ) // base case
26 return n;
27 else // recursive case
28 return fibonacci( n - 1 ) + fibonacci( n - 2 ); 29}
Apenas os casos bases retornam
valores. Todos os outros casos
chamam a função fibonacci
novamente.
Índice
36Saída do Programa
Enter an integer: 0 Fibonacci(0) = 0 Enter an integer: 1 Fibonacci(1) = 1 Enter an integer: 2 Fibonacci(2) = 1 Enter an integer: 3 Fibonacci(3) = 2 Enter an integer: 4 Fibonacci(4) = 3 Enter an integer: 5 Fibonacci(5) = 5 Enter an integer: 6 Fibonacci(6) = 8 Enter an integer: 10 Fibonacci(10) = 55 Enter an integer: 20 Fibonacci(20) = 6765 Enter an integer: 30 Fibonacci(30) = 832040 Enter an integer: 35 Fibonacci(35) = 922746537
3.13 Exemplo Usando Recursão:
A Série de Fibonacci
• Implementação ineficiente
– Problema não é da recursão, mas como a
recursão foi utilizada
– Sequência de Fibonacci é uma seqüência
aditiva
• Cada novo número é formado pela soma de números
anteriores
• Existe uma forma mais eficiente de implementar
seqüências aditivas
38
3.13 Exemplo Usando Recursão:
A Série de Fibonacci
• Valor de termos em uma seqüência aditiva
– Seja a sequência:
t(0) t(1) t(2) t(3) t(4) t(5) t(6) t(7)
3 7 10 17 27 44 71 115
• Computar t(0) e t(1) é trivial
• Como definir o sexto termo na sequência?
– O valor do n-ésimo termo em uma sequência
aditiva é simplesmente o (n-1)-esimo termo na
sequência que começa um passo depois
• Redefenir programa anterior usando
seqüência aditiva
39
3.13 Exemplo Usando Recursão:
A Série de Fibonacci
int SequenciaAditiva (int n, int t0, int t1);
int Fib (int n){
return (SequenciaAditiva (n, 0, 1);
}
int SequenciaAditiva (int n, int t0, int t1){
if (n == 0) return (t0);
if (n == 1) return (t1);
return (SequenciaAditiva (n-1, t1, t0 + t1);
}
Função
empacotadora
}
403.14 Recursão vs. Iteração
• Repetição
– Iteração: laço explícito
– Recursão: chamadas de função repetidas
• Terminação
– Iteração: condição do laço falha
– Recursão: caso base é reconhecido
• Ambos podem ter laços infinitos
• Equilíbrio entre desempenho (iteração) e boa
engenharia de software (recursão)
41
3.15 Funções com Lista de Parâmetros Vazia
• Lista de parâmetros vazia
– Ou escrevendo void ou deixando a lista de parâmetros
vaiza indica que a função não leva argumentos
void print();
ou
void print( void );
– Função print não toma nenhum argumento e não retorna
nenhum valor
Índice
421. Protótipos de função
(não toma
argumentos)
2. Chamada das funções
•
Definição das funções
Saída do Programa
1 // Fig. 3.18: fig03_18.cpp
2 // Functions that take no arguments
3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 7 8 void function1(); 9 void function2( void ); 10 11int main() 12{ 13 function1(); 14 function2(); 15 16 return 0; 17} 18 19void function1() 20{
21 cout << "function1 takes no arguments" << endl; 22}
23
24void function2( void ) 25{
26 cout << "function2 also takes no arguments" << endl; 27}
function1 takes no arguments function2 also takes no arguments
Note as duas formas de
declarar nenhum
argumento para uma
função.
43
3.16 Funções inline
• Funções inline
– Reduz o overhead (sobrecarga) da chamada de função
– Pede ao compilador para copiar o código no programa ao invés
de usar uma chamada de função
– O compilador pode ignorar a declaração inline
– Deve ser usada para funções pequenas e usadas com freqüência
• Exemplo:
inline double cube( const double s )
{ return s * s * s; }
44
3.17 Referências e Parâmetros por Referência
• Passagem por valor
– Cópia do dado é passada para a função
– Alterações na cópia não são refletidas no original
– Usado para prevenir efeitos colaterais indesejados
• Passagem por referência
– Função pode acessar o dado diretamente
– Alterações afetam o original
• Alias do parâmetro por referência para argumento
– & é usado para significar referência
void change( int &variable )
{ variable += 3; }
– Adiciona 3 à variável de entrada
int y = &x.
– Uma alteração em y irá afetar x também
Índice
451. Protótipos de função
1.1 Inicialização de
variáveis
2. Imprime x
2.1 Chamada de função e
impressão de x
2.2 Imprime z
2.3 Chamada de função e
impressão z
3. Definição da função
squareByValue
1 // Fig. 3.20: fig03_20.cpp2 // Comparing call-by-value and call-by-reference
3 // with references. 4 #include <iostream> 5 6 using std::cout; 7 using std::endl; 8
9 int squareByValue( int ); 10void squareByReference( int & ); 11
12int main() 13{
14 int x = 2, z = 4; 15
16 cout << "x = " << x << " before squareByValue\n" 17 << "Value returned by squareByValue: " 18 << squareByValue( x ) << endl
19 << "x = " << x << " after squareByValue\n" << endl; 20
21 cout << "z = " << z << " before squareByReference" << endl; 22 squareByReference( z );
23 cout << "z = " << z << " after squareByReference" << endl; 24
25 return 0; 26} 27
28int squareByValue( int a ) 29{
30 return a *= a; // caller's argument not modified
31}
Note o uso do operador &
Índice
463.1 Definição da Função
squareByReference
Saída do Programa
x = 2 before squareByValue Value returned by squareByValue: 4 x = 2 after squareByValue z = 4 before squareByReference z = 16 after squareByReference
32
33void squareByReference( int &cRef )
34{
35 cRef *= cRef; // caller's argument modified
36}
47
3.18 Argumentos Default
• Se o parâmetro da função for omitido, o valor
default é assumido
– Podem ser constantes, variáveis globais ou chamadas de
função
– Se não são especificados parâmetros suficientes, os
parâmetros default são assumidos da direita para esquerda
• Defina parâmetros default no protótipo da função
int defaultFunction( int x = 1,
int y = 2, int z = 3 );
Índice
481. Protótipo de função
2. Imprime volume
default
2.1 Imprime volume com
um parâmetro
2.2 Imprime com dois
parâmetros
2.3 Imprime com todos
os parâmetros
3. Definição da função
1 // Fig. 3.23: fig03_23.cpp
2 // Using default arguments
3 #include <iostream> 4
5 using std::cout; 6 using std::endl; 7
8 int boxVolume( int length = 1, int width = 1, int height = 1 ); 9
10int main() 11{
12 cout << "The default box volume is: " << boxVolume() 13 << "\n\nThe volume of a box with length 10,\n" 14 << "width 1 and height 1 is: " << boxVolume( 10 ) 15 << "\n\nThe volume of a box with length 10,\n" 16 << "width 5 and height 1 is: " << boxVolume( 10, 5 ) 17 << "\n\nThe volume of a box with length 10,\n" 18 << "width 5 and height 2 is: " << boxVolume( 10, 5, 2 ) 19 << endl;
20 21 return 0; 22} 23
24// Calculate the volume of a box
25int boxVolume( int length, int width, int height ) 26{
27 return length * width * height; 28}
Índice
49Saída do Programa
The default box volume is: 1 The volume of a box with length 10, width 1 and height 1 is: 10 The volume of a box with length 10, width 5 and height 1 is: 50 The volume of a box with length 10, width 5 and height 2 is: 100
Note como os parâmetros
mais à direita assumem os
valores default.
50
3.19 Operador Unário de Resolução de Escopo
• Operador unário de resolução de escopo (::)
– Acessa variáveil globais se uma variável local possui o
mesmo nome
– Não é necessário se os nomes são diferentes
– Em vez de variable use ::variable
Índice
511. Define variáveis
2. Imprime variáveis
Saída do Programa
1 // Fig. 3.24: fig03_24.cpp
2 // Using the unary scope resolution operator
3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 7 8 #include <iomanip> 9 10using std::setprecision; 11 12const double PI = 3.14159265358979; 13 14int main() 15{
16 const float PI = static_cast< float >( ::PI ); 17
18 cout << setprecision( 20 )
19 << " Local float value of PI = " << PI 20 << "\nGlobal double value of PI = " << ::PI << endl; 21
22 return 0; 23}
Local float value of PI = 3.141592741012573242 Global double value of PI = 3.141592653589790007
Notice the use of ::
52
3.20 Sobrecarga de Funções
• Sobrecarga de funções
– Funções com o mesmo nome mas parâmetros diferentes
– Devem realizar tarefas similares (isto é, uma função para
elevar ao quadrado ints, e uma para floats).
int square( int x) {return x * x;}
float square(float x) { return x * x; }
– O programa escolhe a função pela assinatura
• Assinatura é determinada pelo nome da função e tipo dos
parâmetros
– Podem ter o mesmo tipo de retorno
Índice
531. Define função
sobrecarregada
2. Chamada da função
Saída do Programa
1 // Fig. 3.25: fig03_25.cpp2 // Using overloaded functions
3 #include <iostream> 4
5 using std::cout; 6 using std::endl; 7
8 int square( int x ) { return x * x; } 9
10double square( double y ) { return y * y; } 11
12int main() 13{
14 cout << "The square of integer 7 is " << square( 7 ) 15 << "\nThe square of double 7.5 is " << square( 7.5 ) 16 << endl;
17 18 return 0; 19}
The square of integer 7 is 49 The square of double 7.5 is 56.25
Funções com o mesmo nome,
mas parâmetros diferentes
54