iniline, friend

0

Cześć :)
Weźmy taką definicję:

template <typename T> 
class SmartPtr{
public:
....
inline friend bool operator==(const SmartPtr& lhs, const T* rhs){}

Pytania:

  1. Dlaczego autor zdecydował się tu na funkcję inline?
  2. Dlaczego ten operator jest zaprzyjaźnianiy, skoro jest składową klasy zatem powinien mieć dostęp.
  3. Dlaczego operator przyjmuje dwa argumenty, skoro jest definiowany w klasie, to domyślnie operandem lewostronnym jest *this?
2
  1. Bo takie miał widzimisię.
  2. Zaprzyjaźnia funkcję; To nie jest składowa klasy (tj: metoda).
  3. To taka "zewnętrzna, lecz wewnętrzna funkcja" - Jest traktowana jako zwykła, zewnętrzna funkcja, lecz jej definicja występuje od razu.
0

Zaprzyjaźnia funkcję; To nie jest składowa klasy (tj: metoda).

jak to?

0

Normalnie, to zwykla funkcja globalna. http://ideone.com/eqtgjS

0

ok, które słowo kluczowe mówi, że będzie to funkcja globalna, friend?
Czy metoda może być inline?

0
@mielony napisał(a)

ok, które słowo kluczowe mówi, że będzie to funkcja globalna, friend?
Czy metoda może być inline?

  1. Friend - zaprzyjaźnia z funkcją. Globalną.
  2. a: To jest funkcja; b: Zarówno funkcja jak i metoda mogą być inline.

Prosiłbym o odrobinę samodzielności.

1

tak dokładnie: friend. Jak coś jest poprzedzone friend'em, to automatycznie wylatuje poza klasę i przestaje być metodą. Nawet public/private już takiej funkcji nie dotyczy.

class A {
    private:
    friend inline int hello(const A&) { return 77; }
};

int main() {
    A object;
    hello(object);
    // ...
}

Czy metoda może być inline? Jasne, funkcja może być inline. Metoda jest jakąś-tam funkcją, więc inline'ować też ją można. Ba, jeśli podasz ciało metody natychmiast w środku klasy, to dostanie ona "inline" po cichu.

class A {
   public:
   int hello() { return 77; } // przy takiej metodzie nawet nie musisz pisać inline
};

1 użytkowników online, w tym zalogowanych: 0, gości: 1