Klasa jako parametr funkcji

0

Witam!
W pewnej książce spotkałem się z zapisem:

Lista& operator +(Lista &, Lista &)
{
//wnętrze funkcji
}

O ile mi wiadomo, klasy są typami referencyjnymi, więc czy zapis poniższy jest równoważny?

Lista operator +(Lista, Lista)
{
//wnętrze funkcji
}

Dlaczego autor użył ampersand'ów? Książka traktuje o C++.

0
Mr. Incredible napisał(a)

...
O ile mi wiadomo, klasy są typami referencyjnymi...

Nie, klasa to jest po prostu definicja jakiegoś typu. Instancja klasy nie jest referencją.

W pierwszym przykładzie bawisz się referencjami, a w drugim pracujesz na kopiach obiektów.

0

Klasy są typami referencyjnymi w Javie.

0

A czy pierwszy przykład nie jest przypadkiem do unmanaged C++, a ten drugi do CLI C++?
W pierwszym Lista nie jest pobierana przez referencję, chyba że podasz ją do funkcji jako "Lista&". W CLI C++ klasy są przekazywane przez referencję, więc wtedy zgadzałoby się to co napisałeś.

0

Pracuję cały czas w Visual Studio, środowisku .NET i korzystam z C#. Ktoś kiedyś powiedział mi, że klasy są typami referencyjnymi, ale dotyczyło to .NET. Czy rzeczywiście tam są typami referencyjnymi (z dośw. wiem że są i bardzo dobrze), a w C++ nie? Szkoda. Pisanie ampersandów jest męczące.

0

Nie znam C#, ale zakładam, że referencja w C# i w C++ to zupełnie różne sprawy. Z C# do C++ raczej ciężko się tak po prostu przerzucić bez jakiejś książki o C++

0

Czasem mam wrażenie, że wiele osób z tego forum nie jest świadoma różnicy między natywnym C++ a C++ z .NET. Nie wiem czy ty jesteś jedną z tych osób.

Ogólnie:

  1. jeśli tworzysz projekt w zwykłym C++ (czyli twój kod jest kompilowany do języka maszynowego), to żaden typ nie jest przekazywany do funkcji przez referencję, chyba że wprost to powiemy kompilatorowi przez dodanie "&" w liście parametrów metody/funkcji.
  2. jesli tworzysz projekt w .NET, to możesz użyc wielu języków programowania (C++, C#, VB a nawet IronPython), ale nie zmienia to faktu, że taki program pracuje pod .NET framework. Jesli z tych języków wybierzesz C++, to ma on takie same zasady jak np. C# i wtedy klasy są domyślnie typami referencyjnymi i nie musisz podawać "&" w nazwie metody (a chyba nawet nie możesz).
0
Tomek2 napisał(a)
  1. jesli tworzysz projekt w .NET, to możesz użyc wielu języków programowania (C++, C#, VB a nawet IronPython), ale nie zmienia to faktu, że taki program pracuje pod .NET framework. Jesli z tych języków wybierzesz C++, to ma on takie same zasady jak np. C# i wtedy klasy są domyślnie typami referencyjnymi i nie musisz podawać "&" w nazwie metody (a chyba nawet nie możesz).

Dlaczego zawsze najwięcej do powiedzenia mają osoby, które nie mają pojęcia? Tacy jak Ty tylko utrudniają korzystanie z serwisu - nie wiesz to nie pisz; nie jesteś pewien, sprawdź zanim innych w błąd wprowadzisz.

C++ i C++/CLI to dwa różne języki. C++/CLI oferuje dwa typy klas, klasy natywne i zarządzane, zaś obiekty zarządzane trzyma się przez zarządzane referencje:

class Natywna {};
ref class Zarządzana {};
//...
int main() {
    Natywna *natywna = new Natywna();
    Zarządzana ^zarządzana = gcnew Zarządzana();
    // ...
    delete natywna;
    zarzadzana = nullptr; // co najwyżej zerujesz referencję, zwalnianiem zajmie się GC
}

@mosses: "klasy" w C++ to nic innego jak struktury z domyślnym modyfikatorem dostępu private, nie różnią się niczym innym. Co więcej, definicja może się różnić "rodzajem" od deklaracji poprzedzającej:

class Struktura;

struct Struktura {
    // ... domyślnie public
};
0

Zapomniałem najważniejszego: w C++ wszystko jest value type jeżeli nie zostanie jawnie objęte wskaźnikiem lub referencją. C++/CLI wprowadza dodatkowy typ referencji, obiekty zarządzane nie mogą być używane przez wartość.

0

A tak z ciekawości zapytam. Czy w C# może istnieć funkcja swap znana z C++? Bo jak domyślam się, referencja w rozumieniu C# jest inna od tej z C++.

0

nie rozumiem, dlaczego wszyscy demonizują C++/CLI. spełnia on praktycznie całość standardu C++. nie można więc wskazywać różnic między natywnym C++ a C++/CLI w sensie zmian języka, można mówić tylko co doszło (typy zarządzane).
przykładowo, skompilowałem kiedyś wielką, ogromną bibliotekę Qt jako C++/CLI. Trzeba było trochę pożonglować parametrami kompilacji, ale potrzebna była raptem jedna zmiana w całym kodzie, która tak naprawdę była bugiem: autorzy niedoczytali MSDN-a co funkcja WinAPI zwraca.

To raczej ciekawostka, bo raz że wydajnościowo lepiej zostawić Qt jako bibliotekę natywną (a taką też da się wlinkować do programu w C++/CLI) a dwa że gdy mamy .Net Framework to nie potrzebujemy Qt...

Czy w C# może istnieć funkcja swap znana z C++?

static void Swap(ref MojTyp a, ref MojTyp b)
{
  MojTyp c = a;
  a = b;
  b = c;
}

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