Parâmetros das funções
passando argumentos por valor
Podemos, de modo errado, supor que toda vez que passamos valores na forma de argumentos para outras funções, estas, ao manipular esses dados, estariam alterando o valor original das mesmas. Observe o exemplo, onde criamos uma função para manipular os dados recebidos de ButtonClick():
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
void Impr_Label_1(int a, int b); // Protótipo da função
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int a = 10, b = 40; // declara e inicializa duas inteiras
/* imprime os valores de a e b em Label1*/
Label1 -> Caption = "Valor de a = " + String(a) + "\n" +
"Valor de b = " + String(b) + "\n";
Impr_Label_1(a, b); // chama a função Impr_Label_1 pasando argumentos por valor
/* após o comando retornar para Button1Click(), imprime novamente o valor local
de a e b no Label, adicionando esta impressão aos valores que já estavem no Label*/
Label1 -> Caption = Label1 -> Caption + "\n" +
"Valor de a após a chamada a Impr_Label_1() = "
+ String(a) + "\n" +
"Valor de b após a chamada a Impr_Label_1() = "
+ String(b) + "\n";
}
//---------------------------------------------------------------------------
void Impr_Label_1(int a, int b)
{
/* A função Impr_Label_1() recebe dois valores e
cria cópias dessas variáveis para operar */
a = 100; // altera o valor da variável a (cópia) para 100
b = 400; // altera o valor da variável b (cópia) para 400
/*Imprime o valor das variáveis originais e das cópias no label*/
Form1 -> Label1 -> Caption = Form1 -> Label1 -> Caption + "\n" +
"Valor de a em Impr_Label_1() = " + String(a) + "\n" +
"Valor de b em Impr_Label_1() = " + String(b) + "\n";
return; // não há valores a retornar
}
Na execução deste programa. ocorre o seguinte: Quando o usuário dá um clique no botão, o valor das variáveis a e b são imprimidos no Label e é chamada a função Impr_Label_1(a, b) que recebe os valores de a e b como argumentos. Impr_Label_1() cria uma cópia para cada argumento que lhe foi passado e opera sobre essas cópias, alterando e imprimindo os novos valores no Label. Quando a função retorna o controle para a função chamadora, todas as cópias criadas em Impr_Label_1(a, b) são destruídas e, então, ButtonClick() imprime novamente no Label os valores das variáveis a e b que, nessa função, permanecem inalterados.
Passar argumentos dessa forma, onde a função cria cópias dos valores transmitidos, dá-se o nome de: passar argumentos por valor.
Podemos, então, concluir que os valores passados dessa forma a uma função funcionam como variáveis locais a essa função.
|
HOME || MAPA DO SITE || CURSOS || TUTORIAIS || LINKS || FORUM || CONTATO |