Konwersje standardoweStandard conversions

Język C++ definiuje konwersje między typami podstawowymi.The C++ language defines conversions between its fundamental types. Definiuje również konwersje dla typów pochodnych wskaźnika, odwołania i wskaźnika do elementu członkowskiego.It also defines conversions for pointer, reference, and pointer-to-member derived types. Te konwersje są nazywane konwersjemi standardowymi.These conversions are called standard conversions.

W tej sekcji omówiono następujące Konwersje standardowe:This section discusses the following standard conversions:

  • Promocje integralneIntegral promotions

  • Konwersje całkowiteIntegral conversions

  • Konwersje przestawneFloating conversions

  • Konwersje zmiennoprzecinkowe i całkowiteFloating and integral conversions

  • Konwersje arytmetyczneArithmetic conversions

  • Konwersje wskaźnikówPointer conversions

  • Konwersje odwołańReference conversions

  • Konwersje wskaźników do elementów członkowskichPointer-to-member conversions

    Uwaga

    Typy zdefiniowane przez użytkownika mogą określać własne konwersje.User-defined types can specify their own conversions. Konwersja typów zdefiniowanych przez użytkownika jest objęta konstruktorami i konwersjemi.Conversion of user-defined types is covered in Constructors and Conversions.

Poniższy kod powoduje konwersje (w tym przykładzie, Promocje całkowite):The following code causes conversions (in this example, integral promotions):

long  long_num1, long_num2;
int   int_num;

// int_num promoted to type long prior to assignment.
long_num1 = int_num;

// int_num promoted to type long prior to multiplication.
long_num2 = int_num * long_num2;

Wynik konwersji jest wartością l, tylko wtedy, gdy tworzy typ referencyjny.The result of a conversion is an l-value only if it produces a reference type. Na przykład zdefiniowana przez użytkownika konwersja zadeklarowana jako operator int&() zwraca odwołanie i jest l-wartością.For example, a user-defined conversion declared as operator int&() returns a reference and is an l-value. Jednak konwersja zadeklarowana jako operator int() zwraca obiekt i nie jest l-wartością.However, a conversion declared as operator int() returns an object and isn't an l-value.

Promocje integralneIntegral promotions

Obiekty typu całkowitego mogą być konwertowane na inne szerszego typu całkowitego, czyli typu, który może reprezentować większy zestaw wartości.Objects of an integral type can be converted to another wider integral type, that is, a type that can represent a larger set of values. Ten rozszerzony typ konwersji nazywa się promocją integralną.This widening type of conversion is called integral promotion. Dzięki promocji typu całkowitego można użyć następujących typów w wyrażeniu, w którym można wykorzystać inny typ całkowity:With integral promotion, you can use the following types in an expression wherever another integral type can be used:

  • Obiekty, literały i stałe typu char i short intObjects, literals, and constants of type char and short int

  • Typów wyliczeniowychEnumeration types

  • int pola bitoweint bit fields

  • Modułów wyliczającychEnumerators

Promocje w języku C++ są "z zachowaniem wartości", ponieważ wartość po podwyższeniu poziomu zostanie zagwarantowana na wartość wcześniejszą niż podwyższanie poziomu.C++ promotions are "value-preserving," as the value after the promotion is guaranteed to be the same as the value before the promotion. W promocjach z zachowaniem wartości, obiekty krótszych typów całkowitych (takie jak pola bitowe lub obiekty typu char ) są podwyższane do typu, int Jeśli int może reprezentować pełen zakres oryginalnego typu.In value-preserving promotions, objects of shorter integral types (such as bit fields or objects of type char) are promoted to type int if int can represent the full range of the original type. Jeśli int nie może reprezentować pełnego zakresu wartości, obiekt zostanie podwyższony do typu unsigned int .If int can't represent the full range of values, then the object is promoted to type unsigned int. Chociaż ta strategia jest taka sama jak używana w standardowym języku C, konwersje z zachowaniem wartości nie zachowują "podpisu" obiektu.Although this strategy is the same as the one used by Standard C, value-preserving conversions don't preserve the "signedness" of the object.

Zachowujące wartość promocje i promocje, które zachowują znak zazwyczaj generują te same wyniki.Value-preserving promotions and promotions that preserve signedness normally produce the same results. Jednak mogą generować różne wyniki, jeśli podwyższony obiekt jest wyświetlany jako:However, they can produce different results if the promoted object appears as:

  • Operand / ,,, % , /= , %= , < <= > lub >=An operand of /, %, /=, %=, <, <=, >, or >=

    Operatory te opierają się na znaku w celu określenia wyniku.These operators rely on sign for determining the result. Zachowywanie wartości i oszczędność z zachowaniem konta daje różne wyniki w przypadku zastosowania do tych operandów.Value-preserving and sign-preserving promotions produce different results when applied to these operands.

  • Lewy operand >> lub >>=The left operand of >> or >>=

    Te operatory traktują podpisane i niepodpisane liczby inaczej w operacji przesunięcia.These operators treat signed and unsigned quantities differently in a shift operation. W przypadku cyfr ze znakiem operacja przesunięcia w prawo propaguje bit znaku do pozycji opuszczone bit, natomiast pozycje bitu opuszczone są puste od zera w niepodpisanych ilościach.For signed quantities, a right shift operation propagates the sign bit into the vacated bit positions, while the vacated bit positions are zero-filled in unsigned quantities.

  • Argument funkcji przeciążonej lub operand przeciążonego operatora, który zależy od typu argumentu operacji dla dopasowywania argumentów.An argument to an overloaded function, or the operand of an overloaded operator, that depends on the signedness of the operand type for argument matching. Aby uzyskać więcej informacji na temat definiowania przeciążonych operatorów, zobacz przeciążone operatory.For more information about defining overloaded operators, see Overloaded operators.

Konwersje całkowiteIntegral conversions

Konwersje całkowite są konwersjami między typami całkowitymi.Integral conversions are conversions between integral types. Typy całkowite to char , short (lub short int ), int , long i long long .The integral types are char, short (or short int), int, long, and long long. Te typy mogą być kwalifikowane z signed lub unsigned i unsigned mogą być używane jako skróty dla unsigned int .These types may be qualified with signed or unsigned, and unsigned can be used as shorthand for unsigned int.

Podpisana do niepodpisanegoSigned to unsigned

Obiekty podpisanych typów całkowitych można przekonwertować na odpowiednie typy bez znaku.Objects of signed integral types can be converted to corresponding unsigned types. Gdy te konwersje wystąpią, faktyczny wzorzec bitowy nie zmienia się.When these conversions occur, the actual bit pattern doesn't change. Jednak interpretacja zmian danych.However, the interpretation of the data changes. Rozważmy ten kod:Consider this code:

#include <iostream>

using namespace std;
int main()
{
    short  i = -3;
    unsigned short u;

    cout << (u = i) << "\n";
}
// Output: 65533

W poprzednim przykładzie, signed short i ,, jest zdefiniowany i zainicjowany do liczby ujemnej.In the preceding example, a signed short, i, is defined and initialized to a negative number. Wyrażenie (u = i) powoduje i przekonwertowanie na element unsigned short przed przypisaniem do u .The expression (u = i) causes i to be converted to an unsigned short before the assignment to u.

Niepodpisane z podpisemUnsigned to signed

Obiekty niepodpisanych typów całkowitych można przekonwertować na odpowiednie typy podpisane.Objects of unsigned integral types can be converted to corresponding signed types. Jeśli jednak wartość bez znaku jest poza zaprezentowanym zakresem typu podpisanego, wynik nie będzie miał poprawnej wartości, jak pokazano w następującym przykładzie:However, if the unsigned value is outside the representable range of the signed type, the result won't have the correct value, as demonstrated in the following example:

#include <iostream>

using namespace std;
int main()
{
short  i;
unsigned short u = 65533;

cout << (i = u) << "\n";
}
//Output: -3

W poprzednim przykładzie u jest unsigned short obiektem całkowitym, który musi zostać przekonwertowany na liczbę ze znakiem, aby oszacować wyrażenie (i = u) .In the preceding example, u is an unsigned short integral object that must be converted to a signed quantity to evaluate the expression (i = u). Ponieważ jej wartość nie może być poprawnie reprezentowana w signed short , dane są interpretowane jako pokazane.Because its value can't be properly represented in a signed short, the data is misinterpreted as shown.

Konwersje zmiennoprzecinkoweFloating point conversions

Obiekt typu zmiennoprzecinkowego może być bezpiecznie konwertowany na bardziej precyzyjny typ zmiennoprzecinkowy — to znaczy, że konwersja nie powoduje utraty znaczenia.An object of a floating type can be safely converted to a more precise floating type — that is, the conversion causes no loss of significance. Na przykład konwersje z float do double lub z double do long double są bezpieczne, a wartość nie jest zmieniana.For example, conversions from float to double or from double to long double are safe, and the value is unchanged.

Obiekt typu zmiennoprzecinkowego może być również konwertowany na mniej dokładny typ, jeśli znajduje się w zakresie, który jest zaprezentowany przez ten typ.An object of a floating type can also be converted to a less precise type, if it's in a range representable by that type. (Zobacz limity przestawne dla zakresów typów zmiennoprzecinkowych). Jeśli pierwotna wartość nie jest możliwa do zaprezentowania, można ją przekonwertować na następną wyższą lub następną dolną wartość.(See Floating Limits for the ranges of floating types.) If the original value isn't representable precisely, it can be converted to either the next higher or the next lower representable value. Wynik jest niezdefiniowany, jeśli taka wartość nie istnieje.The result is undefined if no such value exists. Rozpatrzmy następujący przykład:Consider the following example:

cout << (float)1E300 << endl;

Wartość maksymalna do zaprezentowania przez typ float to 3.402823466 E38 — dużo mniejsza liczba niż 1E300.The maximum value representable by type float is 3.402823466E38 — a much smaller number than 1E300. W związku z tym liczba jest konwertowana na nieskończoność, a wynikiem jest "inf".Therefore, the number is converted to infinity, and the result is "inf".

Konwersje między typami całkowitymi i zmiennoprzecinkowymiConversions between integral and floating point types

Niektóre wyrażenia mogą spowodować przekonwertowanie obiektów typu zmiennoprzecinkowego na typy całkowite lub odwrotnie.Certain expressions can cause objects of floating type to be converted to integral types, or vice versa. Gdy obiekt typu całkowitego jest konwertowany na typ zmiennoprzecinkowy, a oryginalna wartość nie jest możliwa do zaprezentowania dokładnie, wynikiem jest kolejna wyższa lub Następna Dolna wartość.When an object of integral type is converted to a floating type, and the original value isn't representable exactly, the result is either the next higher or the next lower representable value.

Gdy obiekt typu zmiennoprzecinkowego jest konwertowany na typ całkowity, część ułamkowa jest obcinana lub zaokrąglana w kierunku zera.When an object of floating type is converted to an integral type, the fractional part is truncated, or rounded toward zero. Liczba, na przykład 1,3, jest konwertowana na 1, a-1,3 jest konwertowana na-1.A number like 1.3 is converted to 1, and -1.3 is converted to -1. Jeśli wartość obcięta jest większa niż największa wartość, lub mniejsza niż najmniejsza wartość, wynik jest niezdefiniowany.If the truncated value is higher than the highest representable value, or lower than the lowest representable value, the result is undefined.

Konwersje arytmetyczneArithmetic conversions

Wiele operatorów binarnych (omówionych w wyrażeniach z operatorami binarnymi) powoduje konwersje argumentów operacji i daje wyniki w taki sam sposób.Many binary operators (discussed in Expressions with binary operators) cause conversions of operands, and yield results the same way. Konwersje te powodują, że są to typowe konwersje arytmetyczne.The conversions these operators cause are called usual arithmetic conversions. Konwersje arytmetyczne operandów o różnych typach natywnych są wykonywane jak pokazano w poniższej tabeli.Arithmetic conversions of operands that have different native types are done as shown in the following table. Typy typedef zachowują się zgodnie z ich podstawowymi typami natywnymi.Typedef types behave according to their underlying native types.

Warunki konwersji typówConditions for type conversion

Spełnione warunkiConditions Met KonwersjaConversion
Oba operandy są typu long double .Either operand is of type long double. Inny operand jest konwertowany na typ long double .Other operand is converted to type long double.
Poprzedni warunek nie został spełniony i oba operandy są typu double .Preceding condition not met and either operand is of type double. Inny operand jest konwertowany na typ double .Other operand is converted to type double.
Powyższe warunki nie zostały spełnione, a oba operandy są typu float .Preceding conditions not met and either operand is of type float. Inny operand jest konwertowany na typ float .Other operand is converted to type float.
Powyższe warunki nie są spełnione (żaden z operandów nie jest typu zmiennoprzecinkowego).Preceding conditions not met (none of the operands are of floating types). Operandy otrzymują całkowite promocje w następujący sposób:Operands get integral promotions as follows:

-Jeśli oba operandy są typu unsigned long , drugi operand jest konwertowany na typ unsigned long .- If either operand is of type unsigned long, the other operand is converted to type unsigned long.
-Jeśli poprzedni warunek nie został spełniony i jeśli którykolwiek z operandów jest typu long i innego typu unsigned int , oba operandy są konwertowane na typ unsigned long .- If preceding condition not met, and if either operand is of type long and the other of type unsigned int, both operands are converted to type unsigned long.
— Jeśli powyższe dwa warunki nie są spełnione, a jeśli oba operandy są typu long , drugi operand jest konwertowany na typ long .- If the preceding two conditions aren't met, and if either operand is of type long, the other operand is converted to type long.
— Jeśli powyższe trzy warunki nie są spełnione i jeśli oba operandy są typu unsigned int , drugi operand jest konwertowany na typ unsigned int .- If the preceding three conditions aren't met, and if either operand is of type unsigned int, the other operand is converted to type unsigned int.
-Jeśli żaden z powyższych warunków nie zostanie spełniony, oba operandy są konwertowane na typ int .- If none of the preceding conditions are met, both operands are converted to type int.

Następujący kod ilustruje reguły konwersji opisane w tabeli:The following code illustrates the conversion rules described in the table:

double dVal;
float fVal;
int iVal;
unsigned long ulVal;

int main() {
   // iVal converted to unsigned long
   // result of multiplication converted to double
   dVal = iVal * ulVal;

   // ulVal converted to float
   // result of addition converted to double
   dVal = ulVal + fVal;
}

Pierwsza instrukcja w powyższym przykładzie pokazuje mnożenie dwóch typów całkowitych: iVal i ulVal.The first statement in the preceding example shows multiplication of two integral types, iVal and ulVal. Spełniony warunek polega na tym, że żaden operand nie jest typu zmiennoprzecinkowego, a jeden operand jest typu unsigned int .The condition met is that neither operand is of floating type, and one operand is of type unsigned int. W związku z tym drugi operand iVal jest konwertowany na typ unsigned int .So, the other operand, iVal, is converted to type unsigned int. Następnie wynik zostanie przypisany do dVal .The result is then assigned to dVal. Warunek został spełniony to, że jeden operand jest typu double , dlatego unsigned int wynik mnożenia jest konwertowany na typ double .The condition met here is that one operand is of type double, so the unsigned int result of the multiplication is converted to type double.

Druga instrukcja w powyższym przykładzie pokazuje Dodawanie float typu a i całkowity typ: fVal i ulVal .The second statement in the preceding example shows addition of a float and an integral type: fVal and ulVal. ulValZmienna jest konwertowana na typ float (Trzeci warunek w tabeli).The ulVal variable is converted to type float (third condition in the table). Wynik dodawania jest konwertowany na typ double (drugi warunek w tabeli) i przypisany do dVal .The result of the addition is converted to type double (second condition in the table) and assigned to dVal.

Konwersje wskaźnikówPointer conversions

Wskaźniki można przekonwertować podczas przypisywania, inicjowania, porównywania i innych wyrażeń.Pointers can be converted during assignment, initialization, comparison, and other expressions.

Wskaźnik do klasPointer to classes

Istnieją dwa przypadki, w których wskaźnik do klasy można przekonwertować na wskaźnik do klasy bazowej.There are two cases in which a pointer to a class can be converted to a pointer to a base class.

Pierwszym przypadkiem jest to, że określona klasa bazowa jest dostępna, a konwersja jest niejednoznaczna.The first case is when the specified base class is accessible and the conversion is unambiguous. Aby uzyskać więcej informacji na temat niejednoznacznych odwołań klas podstawowych, zobacz wiele klas bazowych.For more information about ambiguous base-class references, see Multiple base classes.

Określa, czy klasa bazowa jest dostępna, zależy od rodzaju dziedziczenia używanego do wyprowadzania.Whether a base class is accessible depends on the kind of inheritance used in derivation. Rozważ dziedziczenie zilustrowane na poniższej ilustracji.Consider the inheritance illustrated in the following figure.

Wykres dziedziczenia pokazujący dostępność klasy podstawowej-Inheritance graph showing base-class accessibility
Wykres dziedziczenia dla ilustracji Base-Class ułatwienia dostępuInheritance Graph for Illustration of Base-Class Accessibility

W poniższej tabeli przedstawiono dostępność klasy podstawowej dla sytuacji zilustrowanej na rysunku.The following table shows the base-class accessibility for the situation illustrated in the figure.

Typ funkcjiType of Function PochodnychDerivation Konwersja zConversion from

B * na * prawną?B* to A* Legal?
Funkcja zewnętrzna (nieobjęta zakresem klasy)External (not class-scoped) function PrywatnyPrivate NieNo
ProtectedProtected NieNo
PublicznePublic TakYes
B funkcja członkowska (w zakresie B)B member function (in B scope) PrywatnyPrivate TakYes
ProtectedProtected TakYes
PublicznePublic TakYes
Funkcja członkowska języka c (w zakresie języka C)C member function (in C scope) PrywatnyPrivate NieNo
ProtectedProtected TakYes
PublicznePublic TakYes

Drugi przypadek, w którym wskaźnik do klasy może być konwertowany na wskaźnik do klasy bazowej, jest używany w przypadku jawnej konwersji typu.The second case in which a pointer to a class can be converted to a pointer to a base class is when you use an explicit type conversion. Aby uzyskać więcej informacji na temat jawnych konwersji typów, zobacz operator Explicit konwersji typu.For more information about explicit type conversions, see Explicit type conversion operator.

Wynikiem takiej konwersji jest wskaźnik do podobiektu, część obiektu, która jest całkowicie opisana przez klasę bazową.The result of such a conversion is a pointer to the subobject, the portion of the object that is completely described by the base class.

Poniższy kod definiuje dwie klasy A i B , gdzie pochodzi B od A .The following code defines two classes, A and B, where B is derived from A. (Aby uzyskać więcej informacji na temat dziedziczenia, zobacz klasy pochodne). Następnie definiuje bObject obiekt typu B i dwa wskaźniki ( pA i pB ) wskazujące na obiekt.(For more information on inheritance, see Derived Classes.) It then defines bObject, an object of type B, and two pointers (pA and pB) that point to the object.

// C2039 expected
class A
{
public:
    int AComponent;
    int AMemberFunc();
};

class B : public A
{
public:
    int BComponent;
    int BMemberFunc();
};
int main()
{
   B bObject;
   A *pA = &bObject;
   B *pB = &bObject;

   pA->AMemberFunc();   // OK in class A
   pB->AMemberFunc();   // OK: inherited from class A
   pA->BMemberFunc();   // Error: not in class A
}

Wskaźnik pA jest typu A * , który może być interpretowany jako "wskaźnik do obiektu typu" A .The pointer pA is of type A *, which can be interpreted as meaning "pointer to an object of type A." Elementy członkowskie bObject (takie jak BComponent i BMemberFunc ) są unikatowe dla typu B i są w związku z tym niedostępne w pA .Members of bObject (such as BComponent and BMemberFunc) are unique to type B and are therefore inaccessible through pA. pAWskaźnik zezwala na dostęp tylko do tych cech (funkcji składowych i danych) obiektu, które są zdefiniowane w klasie A .The pA pointer allows access only to those characteristics (member functions and data) of the object that are defined in class A.

Wskaźnik do funkcjiPointer to function

Wskaźnik do funkcji można przekonwertować na typ void * , jeśli typ void * jest wystarczająco duży, aby pomieścić ten wskaźnik.A pointer to a function can be converted to type void *, if type void * is large enough to hold that pointer.

Wskaźnik na typ voidPointer to void

Wskaźniki do typu void mogą być konwertowane na wskaźniki do dowolnego innego typu, ale tylko w przypadku jawnego rzutowania typu (w przeciwieństwie do języka C).Pointers to type void can be converted to pointers to any other type, but only with an explicit type cast (unlike in C). Wskaźnik do dowolnego typu można przekonwertować niejawnie na wskaźnik do typu void .A pointer to any type can be converted implicitly to a pointer to type void. Wskaźnik do niekompletnego obiektu typu można przekonwertować na wskaźnik do void (niejawnie) i z powrotem (jawnie).A pointer to an incomplete object of a type can be converted to a pointer to void (implicitly) and back (explicitly). Wynik takiej konwersji jest równy wartości oryginalnego wskaźnika.The result of such a conversion is equal to the value of the original pointer. Obiekt jest uznawany za niekompletny, jeśli jest zadeklarowany, ale nie ma wystarczających informacji, aby określić jego rozmiar lub klasę bazową.An object is considered incomplete if it's declared, but there's insufficient information available to determine its size or base class.

Wskaźnik do dowolnego obiektu, który nie jest const lub volatile może być niejawnie konwertowany na wskaźnik typu void * .A pointer to any object that is not const or volatile can be implicitly converted to a pointer of type void *.

const i volatile, wskaźnikiconst and volatile pointers

Język C++ nie dostarcza standardowej konwersji z const typu lub volatile do typu, który nie jest const lub volatile .C++ doesn't supply a standard conversion from a const or volatile type to a type that's not const or volatile. Jednak każde sortowanie konwersji można określić za pomocą jawnego rzutowania typu (w tym konwersje, które są niebezpieczne).However, any sort of conversion can be specified using explicit type casts (including conversions that are unsafe).

Uwaga

Wskaźniki języka C++ do elementów członkowskich, z wyjątkiem wskaźników do statycznych elementów członkowskich, różnią się od normalnych wskaźników i nie mają tych samych konwersji standardowych.C++ pointers to members, except pointers to static members, are different from normal pointers and don't have the same standard conversions. Wskaźniki do statycznych elementów członkowskich są normalnymi wskaźnikami i mają takie same konwersje jak normalne wskaźniki.Pointers to static members are normal pointers and have the same conversions as normal pointers.

Konwersje wskaźnika o wartości nullnull pointer conversions

Wyrażenie stałej całkowitej, którego wynikiem jest wartość zero lub takie rzutowanie wyrażenia na typ wskaźnika, jest konwertowane na wskaźnik o nazwie wskaźnik o wartości null.An integral constant expression that evaluates to zero, or such an expression cast to a pointer type, is converted to a pointer called the null pointer. Ten wskaźnik zawsze porównuje nierówne wskaźnikiem z dowolnym prawidłowym obiektem lub funkcją.This pointer always compares unequal to a pointer to any valid object or function. Wyjątek jest wskaźnikiem do obiektów opartych na obiektach, które mogą mieć te same przesunięcie i nadal wskazują na inne obiekty.An exception is pointers to based objects, which can have the same offset and still point to different objects.

W języku C++ 11, typ nullptr powinien być preferowany dla wskaźnika o wartości null w stylu C.In C++11, the nullptr type should be preferred to the C-style null pointer.

Konwersje wyrażeń wskaźnikaPointer expression conversions

Dowolne wyrażenie z typem tablicowym można przekonwertować na wskaźnik tego samego typu.Any expression with an array type can be converted to a pointer of the same type. Wynikiem konwersji jest wskaźnik do pierwszego elementu tablicy.The result of the conversion is a pointer to the first array element. Poniższy przykład ilustruje taką konwersję:The following example demonstrates such a conversion:

char szPath[_MAX_PATH]; // Array of type char.
char *pszPath = szPath; // Equals &szPath[0].

Wyrażenie, które powoduje zwrócenie funkcji zwracającej określony typ, jest konwertowane na wskaźnik do funkcji zwracającej ten typ, z wyjątkiem sytuacji, gdy:An expression that results in a function returning a particular type is converted to a pointer to a function returning that type, except when:

  • Wyrażenie jest używane jako operand do operatora address-of ( & ).The expression is used as an operand to the address-of operator (&).

  • Wyrażenie jest używane jako argument operacji operatora wywołania funkcji.The expression is used as an operand to the function-call operator.

Konwersje odwołańReference conversions

Odwołanie do klasy może być konwertowane na odwołanie do klasy bazowej w takich przypadkach:A reference to a class can be converted to a reference to a base class in these cases:

  • Określona klasa bazowa jest dostępna.The specified base class is accessible.

  • Konwersja jest niejednoznaczna.The conversion is unambiguous. (Aby uzyskać więcej informacji na temat niejednoznacznych odwołań klas podstawowych, zobacz wiele klas bazowych).(For more information about ambiguous base-class references, see Multiple base classes.)

Wynikiem konwersji jest wskaźnik do podobiektu, który reprezentuje klasę bazową.The result of the conversion is a pointer to the subobject that represents the base class.

Wskaźnik do elementu członkowskiegoPointer to member

Wskaźniki do elementów członkowskich klasy mogą być konwertowane podczas przypisywania, inicjowania, porównywania i innych wyrażeń.Pointers to class members can be converted during assignment, initialization, comparison, and other expressions. W tej sekcji opisano następujące Konwersje wskaźników do elementów członkowskich:This section describes the following pointer-to-member conversions:

Wskaźnik do składowej klasy bazowejPointer to base class member

Wskaźnik do składowej klasy bazowej można przekonwertować na wskaźnik do elementu członkowskiego klasy pochodnej, gdy spełnione są następujące warunki:A pointer to a member of a base class can be converted to a pointer to a member of a class derived from it, when the following conditions are met:

  • Konwersja odwrotna ze wskaźnika do klasy pochodnej na wskaźnik klasy podstawowej jest dostępna.The inverse conversion, from pointer to derived class to base-class pointer, is accessible.

  • Klasa pochodna nie dziedziczy praktycznie z klasy bazowej.The derived class does not inherit virtually from the base class.

Gdy argument operacji po lewej stronie jest wskaźnikiem do elementu członkowskiego, prawy operand musi być typu wskaźnika do składowej lub być wyrażeniem stałym, którego wynikiem jest 0.When the left operand is a pointer to member, the right operand must be of pointer-to-member type or be a constant expression that evaluates to 0. To przypisanie jest prawidłowe tylko w następujących przypadkach:This assignment is valid only in the following cases:

  • Prawy operand jest wskaźnikiem do składowej tej samej klasy, co lewy argument operacji.The right operand is a pointer to a member of the same class as the left operand.

  • Lewy operand jest wskaźnikiem do składowej klasy pochodnej publicznie i jednoznacznie z klasy argumentu operacji po prawej stronie.The left operand is a pointer to a member of a class derived publicly and unambiguously from the class of the right operand.

pusty wskaźnik do konwersji elementów członkowskichnull pointer to member conversions

Wyrażenie stałej całkowitej, którego wynikiem jest zero, jest konwertowane na wskaźnik o wartości null.An integral constant expression that evaluates to zero is converted to a null pointer. Ten wskaźnik zawsze porównuje nierówne wskaźnikiem z dowolnym prawidłowym obiektem lub funkcją.This pointer always compares unequal to a pointer to any valid object or function. Wyjątek jest wskaźnikiem do obiektów opartych na obiektach, które mogą mieć te same przesunięcie i nadal wskazują na inne obiekty.An exception is pointers to based objects, which can have the same offset and still point to different objects.

Poniższy kod ilustruje definicję wskaźnika do składowej i w klasie A .The following code illustrates the definition of a pointer to member i in class A. Wskaźnik, pai , jest zainicjowany do 0, który jest wskaźnikiem o wartości null.The pointer, pai, is initialized to 0, which is the null pointer.

class A
{
public:
int i;
};

int A::*pai = 0;

int main()
{
}

Zobacz teżSee also

Dokumentacja języka C++C++ language reference