Show
Nesta aula vamos aprender sobre passagem de parâmetros por valor e por referência em portugol. Até o momento, toda vez que passamos algum parâmetro para nossas funções e procedimentos, fizemos uma passagem de parâmetro por valor. Isso significa que o computador literalmente faz uma cópia da variável passada como parâmetro. Contudo, há outra forma bem interessante conhecida como passagem de parâmetro por referência, que iremos aprender nesta aula. Passando uma variável como parâmetro por referência, o computador cria uma referência para a variável original, uma espécie de ponteiro. Dessa forma, qualquer alteração feita dentro da função / procedimento, irá alterar também a variável original. No código a seguir observe o procedimento imprimir. Ele recebe dois parâmetros, um inteiro i e um caracter l. Perceba que à esquerda de l há um e comercial (&). Este & comercial indica que será feito aí uma passagem de parâmetro por referência, ou seja, não será feito uma cópia da variável original, mas uma referencia para ela. Qualquer alteração na variável l irá alterar também nossa variável original. A variável i, por outro lado, não possui o & à esquerda. Isso significa que temos uma passagem de parâmetro por valor, ou seja, será feita uma cópia da variável original e, qualquer alteração feita, será feita nesta cópia, não alterando nossa variável original. programa{ /* Passagem de parâmetros por VALOR e por REFERÊNCIA Código escrito por Wagner Gaspar Abril de 2021 */ funcao imprimir(inteiro i, caracter &l){ escreva(i, "\t", l, "\n") i = 50 // altera a variável i, que é uma cópia de idade l = 'W' // altera a variável letra, pois l é uma referência para letra } funcao inicio() { inteiro idade = 35 caracter letra = 'A' imprimir(idade, letra) escreva("Idade: ", idade, "\n") // idade não foi alterada escreva("letra: ", letra, "\n") // letra foi alterada } }
Wagner GasparCapixaba de São Gabriel da Palha, Espírito Santo. Bacharel em Ciência da Computação pela Universidade Federal do Amazonas e mestre em informática pela Universidade Federal do Espírito Santo. Avançar para o conteúdo principal Não há mais suporte para esse navegador. Atualize o Microsoft Edge para aproveitar os recursos, o suporte técnico e as atualizações de segurança mais recentes. Funções (C++)
Neste artigoUma função é um bloco de
código que executa alguma operação. Opcionalmente, uma função pode definir parâmetros de entrada que permitem que os chamadores passem argumentos para a função. Uma função também pode retornar um valor como saída. As funções são úteis para encapsular operações comuns em um só bloco reutilizável, idealmente com um nome que descreve de modo claro o que a função faz. A função a seguir aceita dois inteiros de um chamador e retorna sua soma; a e b são parâmetros do tipo
A função pode ser invocada ou chamada de qualquer número de locais no programa. Os valores que são passados para a função são os argumentos, cujos tipos devem ser compatíveis com os tipos de parâmetro na definição de função.
Não há limite prático para o comprimento da função, mas um bom design visa funções que executam uma só tarefa bem definida. Algoritmos complexos devem ser divididos em funções mais simples de fácil compreensão sempre que possível. As funções definidas no escopo da classe são chamadas de funções de membro. Em C++, ao contrário de outras linguagens, uma função também pode ser definida no escopo do namespace (incluindo o namespace global implícito). Essas funções são chamadas de funções livres ou funções não de membro; elas são usadas extensivamente na Biblioteca Padrão. As funções podem estar sobrecarregadas, o que significa que diferentes versões de uma função podem compartilhar o mesmo nome se forem diferentes pelo número e/ou tipo de parâmetros formais. Para mais informações, confira Sobrecarga de funções. Partes de uma declaração de funçãoUma declaração de função mínima consiste no tipo de retorno, no nome da função e na lista de parâmetros (que pode estar vazia), além de palavras-chave opcionais que dão mais instruções ao compilador. O seguinte exemplo é uma declaração de função:
Uma definição de função consiste em uma declaração, além do corpo, que é todo o código entre as chaves:
Uma declaração de função seguida de ponto e vírgula pode aparecer em vários locais em um programa. Ela deve aparecer antes de qualquer chamada para essa função em cada unidade de tradução. A definição de função deve aparecer apenas uma vez no programa, de acordo com a ODR (Regra de Definição de Um). As partes necessárias de uma declaração de função são:
Partes opcionais de uma declaração de função são:
A figura a seguir mostra as partes de uma definição de função. A área sombreada é o corpo da função. Partes de uma definição de função Definições de funçãoUma definição de função consiste na declaração e no corpo da função, entre chaves, que contém declarações, instruções e expressões variáveis. O seguinte exemplo mostra uma definição de função completa:
As variáveis declaradas dentro do corpo são chamadas de variáveis locais ou locais. Elas saem do escopo quando a função é encerrada; portanto, uma função nunca deve retornar uma referência a um local.
Funções const e constexprVocê pode declarar uma função de membro Declarar uma função como Modelos de funçãoUm modelo de função é semelhante a um modelo de classe; gera funções concretas com base nos argumentos de modelo. Em muitos casos, o modelo é capaz de inferir os argumentos de tipo, portanto, não é necessário especificá-los explicitamente.
Para mais informações, confira Modelos de Função Parâmetros e argumentos de funçãoUma função tem uma lista de parâmetros separada por vírgulas de zero ou mais tipos, cada um dos quais tem um nome pelo qual pode ser acessado dentro do corpo da função. Um modelo de função pode especificar parâmetros de tipo ou valor adicionais. O chamador passa argumentos, que são valores concretos cujos tipos são compatíveis com a lista de parâmetros. Por padrão, os argumentos são passados para a função por valor, o que significa que a função recebe uma cópia do objeto que está sendo passado. Para objetos grandes, fazer uma cópia pode ser caro e nem sempre é necessário. Para passar os argumentos por referência (especificamente, referência lvalue), adicione um quantificador de referência ao parâmetro:
Quando uma função modifica um argumento passado por referência, ela modifica o objeto original, não uma cópia local. Para impedir que uma função modifique esse argumento, qualifique o parâmetro como const&:
C++ 11: para lidar explicitamente com argumentos que são passados por rvalue-reference ou lvalue-reference, use um e comercial duplo no parâmetro para indicar uma referência universal:
Uma função declarada com a única palavra-chave
Embora seja ilícito especificar um argumento
Argumentos padrãoO último parâmetro ou parâmetros em uma assinatura de função pode ser atribuído a um argumento padrão, o que significa que o chamador pode deixar de fora o argumento ao chamar a função, a menos que deseje especificar algum outro valor.
Para mais informações, confira Argumentos padrão. Tipos de retorno de funçãoUma função pode não retornar outra função ou uma matriz interna; no entanto, ela pode retornar ponteiros para esses tipos, ou um lambda, que produz um objeto
de função. Exceto nesses casos, uma função pode retornar um valor de qualquer tipo que esteja no escopo ou não retornar nenhum valor, nesse caso, o tipo de retorno é Tipo de retorno à direitaUm tipo de retorno "comum" está localizado no lado esquerdo da assinatura de função. Um tipo de retorno à direita está localizado no lado direito da assinatura e é precedido pelo operador
Quando Variáveis locais de funçãoUma variável declarada dentro de um corpo de função é chamada de variável local ou simplesmente de local. Locais não estáticos só ficam visíveis dentro do corpo da função e, se forem declarados na pilha, sairão do escopo quando a função for encerrada. Quando você constrói uma variável local e a retorna por valor, o compilador geralmente pode executar a otimização de valor retornado nomeada para evitar operações de cópia desnecessárias. Se você retornar uma variável local por referência, o compilador emitirá um aviso porque qualquer tentativa do chamador de usar essa referência ocorrerá depois que o local tiver sido destruído. No C++, uma variável local pode ser declarada como estática. A variável só é visível dentro do corpo da função, mas existe uma só cópia da variável para todas as instâncias da função. Os objetos estáticos locais são destruídos durante o término especificado por Dedução de tipo em tipos de retorno (C++14)No C++14, você pode usar Neste exemplo,
Observe que O exemplo a seguir (com base no código de N3493), mostra
Como retornar diversos valores de uma funçãoHá várias maneiras de retornar mais de um valor de uma função:
Ponteiros de funçãoO C++ dá suporte a ponteiros de função da mesma maneira que a linguagem C. No entanto, uma alternativa mais fortemente tipada geralmente é usar um objeto de função. É recomendável que
Se isso não for feito, a sintaxe adequada para a declaração de função pode ser deduzida da sintaxe do declarador para o ponteiro de função substituindo o identificador (
A declaração anterior é equivalente à declaração que usa Confira tambémSobrecarga de função Quais são os tipos de passagem de parâmetros utilizados?A passagem de parâmetro pode ser feita de duas formas: Passagem de Parâmetro por Valor e Passagem de Parâmetro por Referência.
O que é passagem de parâmetros por valor e por referência?Outro tipo de passagem de parâmetros para uma função ocorre quando alterações nos parâmetros formais, dentro da função, alteram os valores dos parâmetros que foram passados para a função. Este tipo de chamada de função tem o nome de "chamada por referência".
O que é passagem de parâmetros e quando ela acontece?Até o momento, toda vez que passamos algum parâmetro para nossas funções e procedimentos, fizemos uma passagem de parâmetro por valor. Isso significa que o computador literalmente faz uma cópia da variável passada como parâmetro.
O que é passagem por valor?Existem dois métodos de passagem de parâmetros para funções: Passagem por valor – permite usar dentro de uma função uma cópia do valor de uma variável, porém não permite alterar o valor da variável original (somente a cópia pode ser alterada).
|