Ključna beseda const v C++
V tem članku so različne funkcije ključna beseda const ki se nahaja v C++ se razpravlja. Kadarkoli ključna beseda const je pritrjen s katero koli metodo(), spremenljivko, spremenljivka kazalca , in s predmetom razreda preprečuje to specifično objekt/metoda()/spremenljivka da spremenite vrednost svojih podatkovnih elementov.
Konstantne spremenljivke :
Obstaja določen niz pravil za deklaracijo in inicializacijo konstantnih spremenljivk:
- The spremenljivka const v času dodelitve ni mogoče pustiti neinicializiranega.
- Nikjer v programu mu ni mogoče dodeliti vrednosti.
- Konstantni spremenljivki je bilo treba zagotoviti eksplicitno vrednost v času deklaracije konstantne spremenljivke.
Spodaj je program C++ za predstavitev zgornjega koncepta:
C++ // C++ program to demonstrate the // the above concept #include using namespace std; // Driver Code int main() { // const int x; CTE error // x = 9; CTE error const int y = 10; cout < < y; return 0; } Izhod
10
Napaka zaradi napačne deklaracije : Če poskušate inicializirati spremenljivko const brez dodelitve eksplicitne vrednosti, se ustvari napaka med prevajanjem (CTE).
Konstantna ključna beseda s spremenljivkami kazalca :
Kazalce je mogoče deklarirati s ključno besedo const. Torej obstajajo trije možni načini uporabe ključne besede const s kazalcem, ki so naslednji:
Ko spremenljivka kazalca kaže na konstantno vrednost :
Sintaksa:
const data_type* var_name;
Spodaj je program C++ za implementacijo zgornjega koncepta:
C++ // C++ program to demonstrate the // above concept #include using namespace std; // Driver Code int main() { int x{ 10 }; char y{ 'M' }; const int* i = &x; const char* j = &y; // Value of x and y can be altered, // they are not constant variables x = 9; y = 'A'; // Change of constant values because, // i and j are pointing to const-int // & const-char type value // *i = 6; // *j = 7; cout < < *i < < ' ' < < *j; } Izhod
9 A
Pojasnilo: V zgornjem primeru sta i in j dve spremenljivki kazalca, ki kažeta na pomnilniško lokacijo const int-type in char-type, vendar je mogoče vrednost, shranjeno na teh ustreznih lokacijah, spremeniti, kot smo storili zgoraj.
V nasprotnem primeru , the pojavila se bo naslednja napaka: Če poskušamo spremeniti vrednost spremenljivke const.
Ko spremenljivka kazalca const kaže na vrednost :
Sintaksa:
data_type* const var_name;
Spodaj je primer za prikaz zgornjega koncepta:
C++ // C++ program to demonstrate the // above concept #include using namespace std; // Driver Code int main() { // x and z non-const var int x = 5; int z = 6; // y and p non-const var char y = 'A'; char p = 'C'; // const pointer(i) pointing // to the var x's location int* const i = &x; // const pointer(j) pointing // to the var y's location char* const j = &y; // The values that is stored at the memory location can // modified even if we modify it through the pointer // itself No CTE error *i = 10; *j = 'D'; // CTE because pointer variable // is const type so the address // pointed by the pointer variables // can't be changed // i = &z; // j = &p; cout < < *i < < ' and ' < < *j < < endl; cout < < i < < ' and ' < < j; return 0; } Izhod
10 and D 0x7ffe21db72b4 and D
Pojasnilo: Vrednosti, ki so shranjene v ustrezni kazalni spremenljivki i in j, je mogoče spreminjati, vendar lokacij, ki jih kažejo spremenljivke konstantnega kazalca, kjer so shranjene ustrezne vrednosti x in y, ni mogoče spreminjati.
V nasprotnem primeru se prikaže naslednja napaka: Spremenljivke kazalca so const in kažejo na lokacije, kjer sta shranjena x in y, če poskušamo spremeniti lokacijo naslova, se bomo soočili z napako.
Ko kazalec const kaže na spremenljivko const :
Sintaksa:
const data_type* const var_name;
Spodaj je program C++ za predstavitev zgornjega koncepta:
C++ // C++ program to demonstrate // the above concept #include using namespace std; // Driver code int main() { int x{ 9 }; const int* const i = &x; // *i=10; // The above statement will give CTE // Once Ptr(*i) value is // assigned, later it can't // be modified(Error) char y{ 'A' }; const char* const j = &y; // *j='B'; // The above statement will give CTE // Once Ptr(*j) value is // assigned, later it can't // be modified(Error) cout < < *i < < ' and ' < < *j; return 0; } Izhod
9 and A
Pojasnilo: Tukaj spremenljivka kazalca const kaže na spremenljivko const. Torej vam ni dovoljeno spreminjati konst spremenljivka kazalca (*P) niti vrednost, shranjena na lokaciji, ki jo to kaže spremenljivka kazalca (*P).
V nasprotnem primeru se prikaže naslednja napaka: Tu sta spremenljivka kazalca in lokacije, na katere kaže spremenljivka kazalca, konstantne, tako da se bo, če je katera od njih spremenjena, pojavila naslednja napaka:
Posredovanje vrednosti argumenta const nekonstantnemu parametru funkcije povzroči napako : Posredovanje vrednosti argumenta const parametru funkcije, ki ni const, ni veljavno, povzroči napako med prevajanjem.
Spodaj je program C++ za predstavitev zgornjega koncepta:
C++ // C++ program to demonstrate // the above concept #include using namespace std; int foo(int* y) { return *y; } // Driver code int main() { int z = 8; const int* x = &z; cout < < foo(x); return 0; } Izhod: Napaka v času prevajanja, ki se prikaže, kot da je vrednost const posredovana kateremu koli nekonstantnemu argumentu funkcije, potem se pojavi naslednja napaka v času prevajanja:
Poleg tega podajanje kazalca const ne bo povzročilo nobene napake, ker je ustvarjen drug kazalec, ki prav tako kaže na isto pomnilniško lokacijo.
C++ //C++ program to demonstrate the above concept #include using namespace std; void printfunc(int* ptr) { cout < < 'Value :' < < *ptr < < endl; cout < < 'Address of ptr :' < < &ptr < < endl; } //Driver Code int main() { int x = 10; int* const i = &x; printfunc(i); cout < < 'Address of i :' < < &i < < endl; } Izhod
Value :10 Address of ptr :0x7ffff0189b48 Address of i :0x7ffff0189b70
Koda se izvede brez napak in oba kazalca imata različna naslova.
Na kratko lahko zgornjo razpravo zaključimo takole:
1. int vrednost = 5; // nekonstantna vrednost
2. const int *ptr_1 = &value; // ptr_1 kaže na vrednost const int, torej je to kazalec na vrednost const.
3. int *const ptr_2 = &value; // ptr_2 kaže na int, torej je to konstanten kazalec na nekonstantno vrednost.
4. const int *const ptr_3 = &value; // ptr_3 kaže na vrednost const int, torej je to kazalec const na vrednost const.
Konstantne metode :
Tako kot funkcije članov in argumente funkcij članov je tudi objekte razreda mogoče deklarirati kot konst . Objekta, deklariranega kot const, ni mogoče spreminjati in zato lahko prikliče samo funkcije člana const, saj te funkcije zagotavljajo, da se objekt ne spremeni.
Sintaksa:
const Class_Name Object_name;
- Ko je funkcija deklarirana kot const, jo je mogoče poklicati na katero koli vrsto objekta, const objekt kot tudi nekonstanten objekt.
- Kadarkoli je objekt deklariran kot const, ga je treba inicializirati v času deklaracije. Vendar pa je inicializacija objekta med deklariranjem možna samo s pomočjo konstruktorjev.
Obstajata dva načina a stalna funkcija izjava:
Deklaracija navadne funkcije const :
const void foo() { //void foo() const Not valid } int main() { foo(); } Konstantna članska funkcija razreda :
class { void foo() const { //..... } } Spodaj je primer konstantne funkcije:
C++ // C++ program to demonstrate the // constant function #include using namespace std; // Class Test class Test { int value; public: // Constructor Test(int v = 0) { value = v; } // We get compiler error if we // add a line like 'value = 100;' // in this function. int getValue() const { return value; } // a nonconst function trying to modify value void setValue(int val) { value = val; } }; // Driver Code int main() { // Object of the class T Test t(20); // non-const object invoking const function, no error cout < < t.getValue() < < endl; // const object const Test t_const(10); // const object invoking const function, no error cout < < t_const.getValue() < < endl; // const object invoking non-const function, CTE // t_const.setValue(15); // non-const object invoking non-const function, no // error t.setValue(12); cout < < t.getValue() < < endl; return 0; } Izhod
20 10 12
Naslednja napaka se pojavi, če poskusite poklicati nekonstantno funkcijo iz objekta const
Parametri konstantne funkcije in vrnjena vrsta :
Parametri funkcije() in povratni tip funkcije() je mogoče deklarirati kot konstanto. Konstantnih vrednosti ni mogoče spremeniti, ker bo vsak tak poskus povzročil napako med prevajanjem.
Spodaj je program C++ za implementacijo zgornjega pristopa:
C++ // C++ program to demonstrate the // above approach #include using namespace std; // Function foo() with variable // const int void foo(const int y) { // y = 6; const value // can't be change cout < < y; } // Function foo() with variable int void foo1(int y) { // Non-const value can be change y = 5; cout < < '
' < < y; } // Driver Code int main() { int x = 9; const int z = 10; foo(z); foo1(x); return 0; } Izhod
10 5
Pojasnilo: Če je v funkciji foo() uporabljen stavek y = 6, bo prikazana naslednja napaka:
- // y = 6; vrednosti const ni mogoče spremeniti ali spremeniti.
Za povratni tip const : Tip vrnitve funkcije() je const, zato nam vrne konstantno celoštevilsko vrednost. Spodaj je program C++ za implementacijo zgornjega pristopa:
C++ // C++ program for the above approach #include using namespace std; const int foo(int y) { y--; return y; } int main() { int x = 9; const int z = 10; cout < < foo(x) < < '
' < < foo(z); return 0; } Izhod
8 9
Vrnjena vrednost bo konstantna vrednost.
Prav tako ni nobene bistvene težave pri posredovanju spremenljivke const ali non-const funkciji, dokler jo posredujemo po vrednosti, ker je ustvarjena nova kopija. Težava se pojavi, ko poskušamo posredovati konstantno spremenljivko s sklicevanjem na funkcijo, katere parameter ni konstanten. To ne upošteva kvalifikatorja const, kar vodi do naslednje napake:
Za povratni tip const in parameter const : Tukaj sta vrnjeni tip in parameter funkcije konstantnega tipa. Spodaj je program C++ za implementacijo zgornjega pristopa:
C++ // C++ program for the above approach #include using namespace std; const int foo(const int y) { // y = 9; it'll give CTE error as // y is const var its value can't // be change return y; } // Driver code int main() { int x = 9; const int z = 10; cout < < foo(x) < < '
' < < foo(z); return 0; } Izhod
9 10
Pojasnilo: Tukaj lahko kot parameter const v funkcijo posredujemo tako konstantne kot nekonstantne vrednosti, vendar nam ni dovoljeno spremeniti vrednosti posredovane spremenljivke, ker je parameter const. V nasprotnem primeru se bomo soočili s spodnjo napako:
// y=9; dal bo napako med prevajanjem, ker je y const var, njegove vrednosti ni mogoče spremeniti.