C++/Funcións
C++ | ||
Funcións |
Unha función é un anaco de código fonte que ten nome, e que pode chamarse dende outras partes do código. A definición dunha función segue a seguinte sintaxe:
«tipo de dato do resultado» «nome da función»(«lista de parámetros») { «Sentenzas que conforman a función» }
Un exemplo da definición dunha función podería ser a seguinte:
int funcion(char caracter, int numero)
{
if(caracter == 'a')
return numero * 2;
else
return numero * numero;
}
Función principal
editarTodo programa en C++ debe conter unha función chamada «main». Ao executarse o programa, será esta a función que se execute.
A función principal ten que devolver un valor enteiro. Este valor indicará se o programa se executou correctamente ou, de haber algún erro, para indicar o tipo de erro. Se o valor devolto é cero significará que o programa rematou a súa execución correctamente, mentres que se é distinto de cero significará que houbo algún tipo de erro.
A función principal é a única función na que non fai falla escribir explícitamente a sentenza de devolución, pero recoméndase facelo de todos xeitos.
Funcións membro
editarAs funcións membro, tamén coñecidas como “métodos” —aínda que prefírese empregar a denominación principal—, son aquelas que forman parte (son membro) dunha clase.
Encadeamento de métodos
editarO encadeamento de métodos é unha práctica que consiste en executar unha función membro sobre un obxecto que devolve á súa vez un obxecto, e executar seguidamente unha función membro sobre o obxecto devolto pola primeira función.
En código, o aspecto dun encadeamento de métodos sería o seguinte:
obxecto.funcionmembro1().funcionmembro2();
O primeiro en executarse sería obxecto.funcionmembro1()
. Esta función devolvería un obxecto, ben unha referencia ao propio obxecto
, ben outro obxecto calquera. Chámalle obxectoX
. obxectoX
pasa a ser entón o obxecto this
da función funcionmembro2()
Un exemplo claro do uso do encadeamento de métodos pode verse no uso da biblioteca iostream. O código cout << a << b
funciona grazas a que a función cout << a
devolve o propio obxecto cout
.
Outro uso non tan habitual pero máis mañoso do encadeamento de métodos é o modismo dos parámetros con nome.
Funcións membro puramente virtuais
editarSon declaracións de funcións que fan que unha clase pase a ser abstracta —como é o caso das clases base abstractas—. Normalmente, a definición só se inclúe nas clases derivadas.
A sintaxe básica das funcións membro puramente virtuais é a seguinte:
class Clase {
public:
virtual void funcion() const = 0; // «= 0» dá o matiz de «puramente virtual».
// [...]
};
- Nota: pódese fornecer unha definición para as funcións puramente virtuais, pero á xente sen moita experiencia isto pode resultarlles confuso, polo que mellor farán en evitalo.
Funcións substitutas
editarAs funcións substitutas son aquelas para as que o compilador substitúe as chamadas polo código da definición. Por exemplo, o compilador convertería o seguinte código:
inline int sumar(int sumando1, int sumando2) {
return sumando1 + sumando2;
}
main() {
int a, b, c;
a = sumar(b,c);
}
Nestoutro:
main() {
int a, b, c;
a = b + c;
}
Conceptualmente trátase de algo similar ao que se fai con #define
.
En calquera caso, cómpre saber que o compilador pode perfectamente ignorar esta calidade das funcións. É dicir, o compilador pode substituír todas as funcións substitutas, só algunhas, ou mesmo ningunha. Esta flexibilidade, malia o que poida parecer, é unha grande vantaxe.
Designar funcións substitutas
editarA declaración da función substituta non é distinta da de calquera outra función. A parte que cambia é a da definición. Ao definir unha función substituta, debe prefixarse coa palabra clave inline
, e a definición debe estar nun ficheiro de cabeceira.
Funcionamento da substitución
editarPara entendermos mellor a utilidade deste tipo de funcións, nada como vermos un exemplo. Considérese a seguinte chamada á función funcion()
:
void main() {
int x, y, z;
// Código que fai uso das tres variables.
funcion(x, y, z);
// Máis código que emprega as variables.
}
Partindo da base dunha aplicación de C++ típica con rexistros e rima (stack), os rexistros e parámetros escríbense na rima xusto antes da chamada a funcion()
, logo dende funcion()
lense os parámetros da rima, e vólvense ler para restablecer os rexistros cando funcion()
volve a main()
. Pero trátase de moitos procesos de lectura e escritura innecesarios, especialmente nos casos en que o compilador pode empregar rexistros para as tres variables, nos que as variables se escribirían dúas veces (como rexistro e como parámetro) e se lerían outras tantas (ao empregalas dentro de funcion()
e para restablecer os rexistros na devolución a main()
).
Se o compilador substitúe a chamada polo código da definición, poderían aforrarse todas esas operacións. Ao non haber unha chamada a unha función, non habería necesidade ningunha de tocar os rexistros, e como os parámetros xa están no rexistro, non habería necesidade de ler ou escribir os parámetros.
Por suposto, isto non ten por que ocorrer deste xeito, e existen moitas circunstancias que condicionan o que ocorra en realidade ante situacións similares.
Mellora do rendemento
editarO uso de funcións substitutas pode mellorar o rendemento, empeoralo, ou non afectar a este de xeito algún. E que ocorra unha cousa ou a outra depende de tantos factores que a única maneira de estar seguro de cal foi o resultado e probar a empregar as funcións das dúas formas, e comprobalo[1].
Uso dentro de clases
editarAs funcións substitutas poden empregarse dentro de clases. Isto supón contar coas vantaxes de capsular e coa velocidade do acceso directo.
Cando usar #define
e cando funcións substitutas
editar
Cómpre evitar os #define
sempre que non haxa unha boa razón para empregalos, e rara vez haberá tal razón. As funcións substitutas son superiores aos #define
en practicamente todos os aspectos.
Pero cómpre tamén non esquecer que os #define
están aí, e pode que nalgunha (remota) situación o seu uso sexa preferible ao das funcións substitutas.
Notas
editar- ↑ «Melloran as funcións substitutas o rendemento?», Respostas a preguntas habituais sobre C++ (en inglés).
C++ | ||
Funcións |