Retornando uma referência de uma função em C ++

É possível retornar uma referência de uma função. Mas tenha cuidado se você tentar fazer isso: Você não quer retornar uma referência a uma variável local dentro de uma função - porque quando a função termina, o espaço de armazenamento para as variáveis ​​locais vai embora. Não é bom!

Mas você pode retornar uma referência a uma variável global. Ou, se a função é uma função de membro, você pode retornar uma referência a uma variável de membro.

Por exemplo, aqui está uma classe que tem uma função que retorna uma referência a uma das suas variáveis:

classe DigInto {private: int secreta público: DigInto () {secret = 150-} int GetSecretVariable () {return Secret} Escrever void () {cout lt; lt; segredo lt; lt; endl-}} -

Observe as lojas do construtor 150 na segredo variável, que é privado. o GetSecretVariable () função retorna uma referência para a variável privada chamada segredo. E a Escreva() função escreve o valor da segredo variável. Lotes de segredos aqui! E algumas surpresas também. Você pode usar essa classe da seguinte forma:

int main (int argc, char * argv []) {DigInto inst-inst.Write () - int pry = inst.GetSecretVariable () - erguer = 30 inst.Write () - retornar 0-}

Quando você executar isso, você vê o seguinte resultado:

15030

A primeira linha é o valor no direito variável segredo após a aplicação cria a instância. Mas olhe para o código com cuidado: A variável chamada alavanca é uma referência a um número inteiro, e torna-se os resultados de GetSecretVariable (). E o que é que resultado?

É uma referência para a variável privada chamada segredo - o que significa que alavanca em si é agora uma referência para essa variável. Sim, uma variável fora da classe agora se refere diretamente a um membro particular da instância! Depois disso, você definir alavanca a 30. Quando você chamar Escreva() novamente, a variável privada vai realmente mudar.

Isso parece uma má idéia? Você faz a variável privada. E agora o GetSecretVariable () função praticamente eliminou qualquer sentido da variável realmente demais privada. o a Principal() função era capaz de agarrar uma referência a ele e picar ao redor e alterá-lo no entanto, ele queria, como se não fosse privada! Problema em terra C ++!

Isso é um problema com referências: Eles podem potencialmente deixar o seu código aberto. Portanto pense duas vezes antes de retornar uma referência a uma variável. Aqui está um dos maiores riscos: Alguém pode estar usando esse código, pode não entender as referências e pode não perceber que a variável chamada alavanca tem um link direto para o privado segredo variável.

Tal programador inexperiente pode, em seguida, escrever código que utiliza e mudanças alavanca - sem perceber que a variável de membro está mudando junto com ele. Mais tarde, em seguida, uma erro resultados - um bastante desagradável para isso!

Como as funções de retornar referências podem deixar programadores inocentes e menos experientes C ++ com um pouquinho demasiado poder em suas mãos, tenha cuidado com referências. Não, você não tem que evitá-los altogether- basta ter cuidado. Use-os apenas se você realmente achar que deve. Mas lembre-se também que uma melhor abordagem nas aulas é ter acesso funções de membro que pode proteger as variáveis ​​particulares.

No entanto, as referências pode ser muito poderosa, desde que você entender o que eles fazem. Quando você usa uma referência, você pode facilmente modificar outra variável sem ter que ir através de ponteiros - o que pode tornar a vida muito mais fácil às vezes. Então, por favor: Use seus poderes recém-descobertos com cuidado.

menu