logo

static_cast in C++

Een Cast-operator is een unaire operator waardoor het ene gegevenstype wordt geconverteerd naar een ander gegevenstype.

C++ ondersteunt 4 soorten casting:



  1. Statische cast
  2. Dynamische cast
  3. Const Cast
  4. Herinterpreteer cast

In dit artikel wordt de static_cast in detail besproken.

tijger leeuw verschil

Statische cast

Dit is het eenvoudigste type cast dat kan worden gebruikt. Het is een compilatie-time cast . Het doet zaken als impliciete conversies tussen typen (zoals int naar float of pointer naar void*), en het kan ook expliciete conversiefuncties aanroepen.

Syntaxis van static_cast

 static_cast < dest_type>(bron);>

De geretourneerde waarde van static_cast zal zijn van beste_type.



Voorbeeld van static_cast

Hieronder vindt u het C++-programma om static_cast te implementeren:

C++






// C++ Program to demonstrate> // static_cast> #include> using> namespace> std;> // Driver code> int> main()> {> >float> f = 3.5;> >// Implicit type case> >// float to int> >int> a = f;> >cout <<>'The Value of a: '> << a;> >// using static_cast for float to int> >int> b =>static_cast><>int>>(f);> >cout <<>' The Value of b: '> << b;> }>

>

>

Uitvoer

The Value of a: 3 The Value of b: 3>

Het gedrag van static_cast voor verschillende scenario's

1. static_cast voor verwijzingen naar primitieve gegevenstypen:

Laten we nu een paar wijzigingen aanbrengen in de bovenstaande code.

C++




// C++ Program to demonstrate> // static_cast char* to int*> #include> using> namespace> std;> // Driver code> int> main()> {> >int> a = 10;> >char> c =>'a'>;> > >// Pass at compile time,> >// may fail at run time> >int>* q = (>int>*)&c;> >int>* p =>static_cast><>int>*>(&c);> >return> 0;> }>

>

>

Uitvoer

error: invalid 'static_cast' from type 'int*' to type 'char*'>

Uitleg: Dit betekent dat zelfs als u denkt dat u op de een of andere manier een bepaalde objectaanwijzer naar een andere kunt typeren, maar het is illegaal, de static_cast u dit niet zal toestaan.

2. Een object converteren met behulp van een door de gebruiker gedefinieerde conversie-operator

static_cast kan de conversie-operator van de klasse aanroepen als deze is gedefinieerd. Laten we nog een voorbeeld nemen van het converteren van een object van en naar een klasse.

Voorbeeld:

C++




// C++ Program to cast> // class object to string> // object> #include> #include> using> namespace> std;> // new class> class> integer {> >int> x;> public>:> >// constructor> >integer(>int> x_in = 0)> >: x{ x_in }> >{> >cout <<>'Constructor Called'> << endl;> >}> >// user defined conversion operator to string type> >operator string()> >{> >cout <<>'Conversion Operator Called'> << endl;> >return> to_string(x);> >}> };> // Driver code> int> main()> {> >integer obj(3);> >string str = obj;> >obj = 20;> >// using static_cast for typecasting> >string str2 =>static_cast>(obj);> >obj =>static_cast>(30);> >return> 0;> }>

gzip voor Linux
>

>

Uitvoer

Constructor Called Conversion Operator Called Constructor Called Conversion Operator Called Constructor Called>

Uitleg: Laten we proberen de bovenstaande uitvoer regel voor regel te begrijpen:

  1. Wanneer obj wordt gemaakt, wordt de constructor aangeroepen, die in ons geval ook een Conversion Constructor is (voor C++14 zijn de regels een beetje gewijzigd).
  2. Wanneer je creëert str uit obj , zal de compiler geen fout genereren, omdat we de conversie-operator hebben gedefinieerd.
  3. Wanneer je het maakt obj = 20 , roept u feitelijk de conversieconstructor aan.
  4. Wanneer je het maakt str2 uit statische_cast , het lijkt veel op string str = obj ; maar met strenge typecontrole.
  5. Wanneer je schrijft obj = statische_cast (30) , converteer je 30 naar een geheel getal met behulp van static_cast.

3. static_cast voor overerving in C++

static_cast kan zowel upcasting als downcasting bieden in geval van overerving. Het volgende voorbeeld demonstreert het gebruik van static_cast in het geval van upcasting.

Voorbeeld:

C++




// C++ Program to demonstrate> // static_cast in inheritance> #include> using> namespace> std;> class> Base> {};> class> Derived :>public> Base> {};> // Driver code> int> main()> {> >Derived d1;> > >// Implicit cast allowed> >Base* b1 = (Base*)(&d1);> > >// upcasting using static_cast> >Base* b2 =>static_cast>(&d1);> >return> 0;> }>

>

>

Uitleg: De bovenstaande code wordt zonder enige fout gecompileerd.

  1. We hebben het adres van d1 genomen en het expliciet in Base gegoten en opgeslagen in b1.
  2. We namen het adres van d1 en gebruikten static_cast om het naar Base te casten en het op te slaan in b2.

In het bovenstaande voorbeeld hebben we de basisklasse als openbaar geërfd. Wat gebeurt er als we het als privé erven? Het onderstaande voorbeeld laat het volgende zien:

Hoe een array in Java te initialiseren

Voorbeeld:

C++




// C++ program to demonstrate> // static_cast in case of> // private inheritance> #include> using> namespace> std;> class> Base> {};> class> Derived:>private> Base> {> >// Inherited private/protected> >// not public> };> // Driver code> int> main()> {> >Derived d1;> > >// Implicit type cast allowed> >Base* b1 = (Base*)(&d1);> > >// static_cast not allowed> >Base* b2 =>static_cast>(&d1);> >return> 0;> }>

>

>

converteer tekenreeks naar int java

Compileerfout:

[Error] 'Base' is an inaccessible base of 'Derived'>

Uitleg: De bovenstaande code zal niet compileren zelfs als u het erft als beschermd .

Dus om static_cast te gebruiken in geval van overerving, moet de basisklasse toegankelijk, niet-virtueel en ondubbelzinnig zijn.

4. static_cast om ‘naar en van’ Void Pointer te casten

Met de static_cast-operator kunt u vanuit elk aanwijzertype casten naar een ongeldige aanwijzer en omgekeerd.

Voorbeeld:

C++




// C++ program to demonstrate> // static_cast to cast 'to and> // from' the void pointer> #include> using> namespace> std;> // Driver code> int> main()> {> >int> i = 10;> >void>* v =>static_cast><>void>*>(&i);> >int>* ip =>static_cast><>int>*>(v);> >cout << *ip;> >return> 0;> }>

>

>

Uitvoer

10>