link: https: //zhuanlan.zhihu.com/p/23782715
Fonte: sabe quase com
direitos autorais do autor. Para reimpressões comerciais, entre em contato com o autor para autorização. Para reimpressões não comerciais, indique a fonte.
declaração:
- O conteúdo do artigo foi coletado e compilado do "C ++ Primer Chinese Edition (5ª edição)", e os direitos autorais pertencem ao livro original.
- O livro original tem interpretações mais detalhadas e maravilhosas, por favor, compre livros genuínos para aprender.
- Este artigo é apenas para aprendizagem e comunicação, qualquer forma de reimpressão é proibida
A forma de devolver um valoréexatamente igual à forma de inicializar uma variável ou parâmetro formal
O valor de retorno para uma quantidade temporária de ponto de inicialização da chamada, a quantidade temporária é o resultado da chamada de função
Não retorne referências ou ponteiros para objetos locais
const string &manip()
{
string ret;
if( !ret.empty() )
{
return ret;
}
else
{
return "Empty";
}
}
Os dois retornos acima estão errados
- ret é uma variável local, é destruída após a execução da função, por isso não pode ser referenciada
- "Vazio" será usado para inicializar uma quantidade temporária do site de chamada, a quantidade temporária é o resultado da chamada de função, da mesma forma, não podemos nos referir a uma quantidade temporária
Acesso direto de membro
Se a função retornar um ponteiro, referência ou objeto de classe, você pode usar o resultado da chamada de função para acessar os membros do objeto de resultado
auto sz = shortString( s1, s2 ).size();
- Por um lado, está relacionado à precedência e associatividade do operador de chamada
- Por outro lado, deveria ter algo a ver com o valor provisório, no meu entendimento é que o membro visita o valor provisório, correto?
Referência retorna lvalue
Se a função retornar um objeto do tipo de referência, você pode atribuir diretamente o resultado da chamada da função
getVal( s, 0 ) = 'A';
Na verdade, atribua um valor ao objeto vinculado pela referência
Inicialização da lista
vector<string> process()
{
return {"Hi", "bye"};
}
Usamos isso quando escovamos Leetcode 01
valor de retorno do principal
Se a função principal não escrever uma instrução de retorno, o compilador adicionará automaticamente uma instrução de retorno
que retorna 0 para nós, mas é recomendado adicionar
Recursão
Função autodenominada
int fac( int val )
{
if( val > 1 )
{
return fac( val - 1 ) * val;
}
reutrn 1;
}
Deve haver um if, para garantir que haja um caminho que não inclua chamadas recursivas, caso contrário, ele terminará em um loop infinito
Retornar ponteiro de array
Como os arrays não podem ser copiados, as funções não podem retornar arrays. Mas você pode retornar um ponteiro ou referência a um array
Lembre-se da definição anterior de ponteiro para array
int (*p2)[10] = &arr;
Declarar uma função que retorna um ponteiro de array também é complicado
Type (*function(parameter_list)[dimension]
Mas a forma é semelhante à definição de um ponteiro para um array
int (*func(int i))[10];
Esta forma de escrever é inevitavelmente um pouco complicada e é fácil cometer erros. Temos três maneiras de simplificar
- Digite o alias
- Tipo de retorno de cauda
- decltype
Digite o alias
typedef int arrT[10];
arrT *func( int i );
Tipo de retorno de cauda
C ++ 11 novo padrão
auto func( int i ) -> int(*)[10];
decltype
int odd[] = { 1, 3 };
int even[] = { 2, 4 };
decltype(odd) *arrPtr( int i )
{
i;
return &odd;
}
Não é difícil ver que este método tem uma gama limitada de uso