sexta-feira, 29 de novembro de 2019

C++ - Funções (Parte 2)


Esta é a parte 2 das funções de C++.

Diferença entre argumento e parâmetro
Até agora tenho me referido aos parâmetros como argumentos, mas existe uma diferença entre eles.
O parâmetro é a própria "variável" da função, isto é, o que está entre parêntesis quando a declaramos.
O argumento é o valor/variável que passamos para a função ao chamá-la.

Declaração e definição
A função é declarada e definida.
A declaração é o nome da função, o seu tipo e os seus parâmetros, e a definição é o código a executar.

Até agora declaramos e definimos a função de seguida. Ao fazer isto, temos de escrever a função sempre em cima da função main porque o compiler lê de cima para baixo.
Se apenas declararmos a função primeiro, podemos colocá-la abaixo de main.
Como declarar e depois definir:
int function();

int main(){
    function();
}

int function(){
    cout << "Hello" << endl;
}

Múltiplos parâmetros
As funções podem ter mais de um parâmetro.

void print_coordinates(int x, int y){
    cout << "X: " << x << endl;
    cout << "Y: " << y << endl;
}
Dois parâmetros, x e y.

Parâmetros padrão (default)
Quando uma função tem um parâmetro, esse pode já ser definido de uma forma padrão. Isto é, quando a função for chamada, não é necessário colocar nada como argumento porque a própria função já tem um parâmetro padrão.

void printX(int x = 3){
    cout << x << endl;
}

int main(){
    printX();
}
O parâmetro padrão é x = 3. Então quando a função for chamada e não lhe dermos um argumento, a função vai funcionar com x = 3.

Ou seja, terá output
3

Se não forem todos padrão, apenas alguns, apenas os últimos parâmetros (a partir direita) podem ser padrão, porque não há forma de o compiler saber qual é qual.

Isto é, esta função é válida:
int function(int x, int y, int z = 0){
    //código
}
Porque é possível chamá-la com dois argumentos, assim, por exemplo:
function(2, 3);
Onde z = 0.

Mas esta função não é válida:
int function(int x = 0, int y, int z){
    //código
}
Porque se fôssemos chamá-la da mesma forma, estaríamos a atribuir um valor a x, a y, mas não a z.

Então só é válido se só os parâmetros mais à direita forem padrões. Ou seja, à esquerda de um normal não pode haver um padrão. Todos padrões também é válido.

Manipulação da variável da função
Talvez não tenham percebido, mas a variável "parâmetro" da função é temporária e apenas válida dentro da função.
Se passarmos uma variável existente como argumento para uma função, e nessa função houver manipulação da variável de alguma forma, não é essa variável que muda. Na verdade, a variável da função é uma cópia da variável que passamos.

void function(int variable){
    variable += 6;
}

int main(){
    int variable = 5;
    function(variable);
    cout << variable << endl;
}

  • O inteiro variable de function é uma cópia do inteiro variable de main.
  • Têm o mesmo nome só mesmo para vos mostrar que são variáveis diferentes, terem o mesmo nome ou não é indiferente.
  • A variable de function torna-se 5 + 6, que é 11.
  • A variable de main continua igual.
Então o output será
5

Para fazer isto temos de usar pointers, mais especificamente endereços da variável (passar por referência), mas isso já é o seu próprio tema, que falarei no futuro.


Overloading
Funções diferentes podem ter o mesmo nome mas diferentes parâmetros
.
int printNum(int num){
    cout << num << endl;
}

float printNum(float num){
    cout << num << endl;
}

int printNum(int num, int num2){
    cout << num << endl;
    cout << num2 << endl;
}

Então quando for chamada, o compiler tem em atenção o tipo de dado do argumento e o número de argumentos.

Temos de ter atenção para que não haja discrepâncias quando formos chamar a variável, isto é, não podemos ter duas funções iguais mas uma delas tem mais um parâmetro que é padrão. O compiler não vai saber qual utilizar.

Programa exemplo
#include <iostream>
using namespace std;

int sum(int x, int y = 3){
    return x + y;
}

int sum(int x, int y, int z){
    return x + y + z;
}

int main()
{
    int x, y, z;
    cout << "Enter x:" << endl;
    cin >> x;
    cout << "Enter y:" << endl;
    cin >> y;
    cout << "Enter z:" << endl;
    cin >> z; 
    
    cout << "The sum of x and y is:" << sum(x, y) << endl;
    cout << "The sum of x, y and z is:" << sum(x, y, z) << endl;
}
  • Existem duas funções sum (que fazem overloading).
  • O programa pede três inteiros x, y e z.
  • É feito o print da soma de x e y, e de xy e z.

Se escrevermos, 3, 7, e 20, na consola vai estar:
Enter x:
3
Enter y:
7
Enter z:
20
The sum of x and y is:10
The sum of x, y and z is:30

Referências - 29/11/2019

Sem comentários:

Enviar um comentário

Comente de uma forma construtiva...

Mensagem em destaque

IoT está a transformar o mundo dos videojogos

Os videojogos ou games evoluíram muito desde o "pong", tornando-se uma das formas mais populares de entretenimento, gerando recei...