Przegląd składowej klasy
Element class
lub struct
składa się z jego elementów członkowskich. Praca wykonywana przez klasę jest wykonywana przez jego funkcje składowe. Stan, który utrzymuje, jest przechowywany w jego elementach członkowskich danych. Inicjowanie elementów członkowskich odbywa się przez konstruktory, a oczyszczanie, takie jak zwalnianie pamięci i zwalnianie zasobów jest wykonywane przez destruktory. W języku C++11 i nowszych składowe danych mogą (i zwykle powinny) być inicjowane w punkcie deklaracji.
Rodzaje składowych klasy
Pełna lista kategorii elementów członkowskich jest następująca:
Specjalne funkcje składowe.
Omówienie funkcji składowych.
Modyfikowalne i statyczne elementy członkowskie danych, w tym wbudowane typy i inne typy zdefiniowane przez użytkownika.
Operatory
Deklaracje klas zagnieżdżonych i.)
Aliasy i definicje typów.
Uwaga
Elementy zaprzyjaźnione są ujęte w powyższej liście, ponieważ są zawarte w deklaracji klasy. Jednak nie są one prawdziwymi składowymi klasy, ponieważ nie są one w zakresie tej klasy.
Przykładowa deklaracja klasy
W poniższym przykładzie przedstawiono prostą deklarację klasy:
// TestRun.h
class TestRun
{
// Start member list.
// The class interface accessible to all callers.
public:
// Use compiler-generated default constructor:
TestRun() = default;
// Don't generate a copy constructor:
TestRun(const TestRun&) = delete;
TestRun(std::string name);
void DoSomething();
int Calculate(int a, double d);
virtual ~TestRun();
enum class State { Active, Suspended };
// Accessible to this class and derived classes only.
protected:
virtual void Initialize();
virtual void Suspend();
State GetState();
// Accessible to this class only.
private:
// Default brace-initialization of instance members:
State _state{ State::Suspended };
std::string _testName{ "" };
int _index{ 0 };
// Non-const static member:
static int _instances;
// End member list.
};
// Define and initialize static member.
int TestRun::_instances{ 0 };
Ułatwienia dostępu do składowych
Składowe klasy są deklarowane na liście składowej. Lista składowa klasy może być podzielona na dowolną liczbę private
protected
sekcji i public
przy użyciu słów kluczowych znanych jako specyfikatory dostępu. Dwukropek :
musi być zgodny ze specyfikatorem dostępu. Te sekcje nie muszą być ciągłe; oznacza to, że dowolne z tych słów kluczowych może pojawić się kilka razy na liście elementów członkowskich. Słowo kluczowe wyznacza dostęp do wszystkich elementów członkowskich aż do następnego specyfikatora dostępu lub nawiasu zamykającego. Aby uzyskać więcej informacji, zobacz Kontrola dostępu do składowych (C++).
Statyczne elementy członkowskie
Składowa danych może być zadeklarowana jako statyczna, co oznacza, że wszystkie obiekty klasy mają dostęp do tej samej kopii. Funkcja składowa może być zadeklarowana jako statyczna, w tym przypadku może ona uzyskiwać dostęp tylko do statycznych składowych danych klasy (i nie this
ma wskaźnika). Aby uzyskać więcej informacji, zobacz Statyczne elementy członkowskie danych.
Specjalne funkcje składowe
Specjalne funkcje składowe to funkcje, które kompilator udostępnia automatycznie, jeśli nie określisz ich w kodzie źródłowym.
Konstruktor domyślny.
Konstruktor kopiujący
(C++11) Konstruktor przenoszenia
Operator przypisania kopiowania
(C++11) Operator przypisania przenoszenia
Destruktor
Aby uzyskać więcej informacji, zobacz Specjalne funkcje składowe.
Inicjowanie mądrej składowej
W języku C++11 lub nowszym deklaratory niestacjonalnych składowych mogą zawierać inicjatory.
class CanInit
{
public:
long num {7}; // OK in C++11
int k = 9; // OK in C++11
static int i = 9; // Error: must be defined and initialized
// outside of class declaration.
// initializes num to 7 and k to 9
CanInit(){}
// overwrites original initialized value of num:
CanInit(int val) : num(val) {}
};
int main()
{
}
Jeśli element członkowski ma przypisaną wartość w konstruktorze, ta wartość zastępuje wartość przypisaną przy deklaracji.
Istnieje tylko jedna współdzielona kopia składowych danych statycznych dla wszystkich obiektów danego typu klasy. Dane statyczne członków muszą być zdefiniowane i mogą być zainicjowane w zakresie pliku. Aby uzyskać więcej informacji o statycznych elementach członkowskich danych, zobacz Statyczne elementy członkowskie danych. W poniższym przykładzie pokazano, jak zainicjować składowe danych statycznych:
// class_members2.cpp
class CanInit2
{
public:
CanInit2() {} // Initializes num to 7 when new objects of type
// CanInit are created.
long num {7};
static int i;
static int j;
};
// At file scope:
// i is defined at file scope and initialized to 15.
// The initializer is evaluated in the scope of CanInit.
int CanInit2::i = 15;
// The right side of the initializer is in the scope
// of the object being initialized
int CanInit2::j = i;
Uwaga
Nazwa klasy CanInit2
musi znajdować się przed i
, aby określić, że definiowany i
jest składową klasy CanInit2
.
Zobacz też
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla