Szukaj…


Wprowadzenie

typedef i (od C ++ 11) using słów kluczowych, mogą być wykorzystane do nadania nowej nazwy do istniejącego typu.

Składnia

  • typedef type-specifier-seq init-declarator-list ;
  • atrybut-specifier-seq typedef decl-specifier-seq init-declarator-list ; // od C ++ 11
  • przy użyciu identyfikatora atrybut-specyfikator-seq ( opt ) = typ-id ; // od C ++ 11

Podstawowa składnia typedef

Deklaracja typedef ma taką samą składnię jak deklaracja zmiennej lub funkcji, ale zawiera słowo typedef . Obecność typedef powoduje, że deklaracja deklaruje typ zamiast zmiennej lub funkcji.

int T;         // T has type int
typedef int T; // T is an alias for int

int A[100];         // A has type "array of 100 ints"
typedef int A[100]; // A is an alias for the type "array of 100 ints"

Po zdefiniowaniu aliasu typu można go używać zamiennie z oryginalną nazwą typu.

typedef int A[100];
// S is a struct containing an array of 100 ints
struct S {
    A data;
};

typedef nigdy nie tworzy odrębnego typu. Daje to tylko inny sposób odwoływania się do istniejącego typu.

struct S {
    int f(int);
};
typedef int I;
// ok: defines int S::f(int)
I S::f(I x) { return x; }

Bardziej złożone zastosowania typedef

Reguła, że deklaracje typedef mają tę samą składnię, co zwykłe deklaracje zmiennych i funkcji, mogą być używane do odczytu i zapisu bardziej złożonych deklaracji.

void (*f)(int);         // f has type "pointer to function of int returning void"
typedef void (*f)(int); // f is an alias for "pointer to function of int returning void"

Jest to szczególnie przydatne w konstrukcjach o mylącej składni, takich jak wskaźniki do elementów niestatycznych.

void (Foo::*pmf)(int);         // pmf has type "pointer to member function of Foo taking int
                               // and returning void"
typedef void (Foo::*pmf)(int); // pmf is an alias for "pointer to member function of Foo
                               // taking int and returning void"

Trudno zapamiętać składnię następujących deklaracji funkcji, nawet dla doświadczonych programistów:

void (Foo::*Foo::f(const char*))(int);
int (&g())[100];

typedef może być użyty, aby ułatwić czytanie i pisanie:

typedef void (Foo::pmf)(int);  // pmf is a pointer to member function type
pmf Foo::f(const char*);       // f is a member function of Foo

typedef int (&ra)[100];        // ra means "reference to array of 100 ints"
ra g();                        // g returns reference to array of 100 ints

Deklarowanie wielu typów za pomocą typedef

typedef kluczowe typedef jest specyfikatorem, więc ma zastosowanie osobno do każdego deklaratora. Dlatego każda deklarowana nazwa odnosi się do typu, jaki miałaby ta nazwa bez typedef .

int *x, (*p)();         // x has type int*, and p has type int(*)()
typedef int *x, (*p)(); // x is an alias for int*, while p is an alias for int(*)()

Deklaracja aliasu z „za pomocą”

C ++ 11

Składnia using jest bardzo prosta: nazwa, która ma zostać zdefiniowana, znajduje się po lewej stronie, a definicja po prawej stronie. Nie musisz skanować, aby zobaczyć, gdzie jest nazwa.

using I = int;
using A = int[100];             // array of 100 ints
using FP = void(*)(int);        // pointer to function of int returning void
using MP = void (Foo::*)(int);  // pointer to member function of Foo of int returning void

Tworzenie aliasu typu za using przy using ma dokładnie taki sam efekt, jak tworzenie aliasu typu za pomocą typedef . Jest to po prostu alternatywna składnia do osiągnięcia tego samego.

W przeciwieństwie do typedef , using może być szablonowe. „Szablon typedef” utworzony przy using nazywany jest szablonem aliasu .



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow