Jump to content

inline, virtual, namespace


Recommended Posts

Posted

Boas,

seria possível alguém explicar-me o que significa uma função ser inline , friend ou virtual?

Alguém me pode dizer também como especificar que várias classes pertencem a um mesmo namespace?

Isso deve ser definido no .h ou .cpp?

Tou agora a começar a aprender c++ 11 e tá díficil compreender as regras de separação dos .cpp e .h e o que se põe em cada um deles.

😕

Posted

estás a perguntar muita coisa, mas vamos lá por partes:

o que vai para o .h é a especificação das classes com os seu métodos, e nos .cpp é onde se encontra a implementação desses métodos. isto sempre para classes que não sejam template, porque essas necessitam que seja tudo no .h

exemplo:

// classe.h
class Class
{
public:
 int f();
}; // <--- nunca esquecer o ponto e virgula no final da declaração da classe !!!!!!!!!!

// classe.cpp
int Class::f()
{
 return 10;
}

--------------

a palavra reservada virtual serve para demarcar as funções como passíveis de serem "sobrepostas" nas classes derivadas.

exemplo:

#include <iostream>
using namespace std;

class A
{
 virtual int foo() { return 10; }
 int bar()         { return 20;}
};

class B : public A
{
 virtual int foo() { return 100; }
 int bar()         { return 200;}
};

int main()
{
 A * a = new A();
 A * b = new B();

 cout << "A.foo() >> " << a->foo() << endl; // output = 10
 cout << "A.bar() >> " << a->bar() << endl; // output = 20
 cout << "B.foo() >> " << b->foo() << endl; // output = 100
 cout << "B.bar() >> " << b->bar() << endl; // output = 20 (não é 200 porque a função não é virtual, a função chamada é a de A)

 return 0;
}

-------------------

a palavra reservada friend serve para dar acesso completo aos parâmetros e membros de uma classe a outra

exemplo:

class A;
class B;
class C;

class A
{
 friend class B;

protected:
 int i;
};

class B
{
 int foo(A a) {
   return A.i; // não existe problemas porque como a classe B é "friend" da classe A, tem acesso ao parâmetro "i" protegido
 }
};

class C
{
 int foo(A a) {
   return A.i; // erro de compilação porque a classe C não tem acesso ao parâmetro protegido "i" da classe A
 }
};

------------------------------

a palavra reservada inline é usada para optimização de código. é um ponto um bocado avançado e por tal não te deverias debruçar ainda muito nesse aspecto.

resumidamente, serve para sinalizar o compilador para que sempre que a função seja chamada, em vez de ocorrer o processo normal de "lançamento" de uma função, o código da função seja "embutido" no local da chamada. dai a designação : inline, o código não está noutro local, é sim inserido directamente no local da chamada.

isto normalmente leva a aumento de rapidez. mas quando metes de um lado, estás a tirar doutro. por isso é que é necessário saber bem o que se está a fazer quando se usa este tipo de processo.

nota : isto é feito no momento da compilação. tu escreves o código normalmente, é trabalho do compilador, de quando criar o ficheiro final de fazer este processo todo

  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.