C++ előadás és gyakorlat

Kitlei Róbert

2008/2009 tavaszi félév

Definíciók

Definíció: változó, alprogram vagy osztály létrehozása, megvalósítása

Előre deklarálás

struct T;       // T osztályt előre deklaráljuk

struct S { T* t; };
struct T { S* s; };

bool ptlan(int i);

bool ps(int i) {
return (i == 0) ? true : ptlan(i-1); }

bool ptlan(int i) {
return (i == 0) ? false : ps(i-1); }

Külső definíció

extern: más fordítási egységben definiált objektum deklarációja

Kifejezések

Kifejezések

j = i++ + i++;
k = f(v[i], i++);
m = m++;
n = f() + g();
// ahol f és g közös globális változót használnak

Kifejezések

Összetett kifejezések kiértékelése

Kifejezések

Értékadás: = operátor

2 * (i = 7) + 3
if (i = 3)  { ... }     // ez rossz, mindig igaz, és i megváltozik
if (3 == i) { ... } // ilyen sorrendben nem lehet elrontani

Kifejezések

Értékadás: = operátor

2 * (i = 7) + 3     // értéke 17

Kifejezések

További értékadó operátorok: +=, *= stb.

x += y;         ⇔       x = x + y;

Kifejezések

Vessző operátor

(1, 2, 3) + (4, 5, 6)
(1, 2, 3) + (0, 6)
// mindkét kifejezés értéke 9
f(1, 2, 3)
// három paraméterrel rendelkező függvény

Kifejezések

Vessző operátor

t[1,2,3]        // t[3]
(i = 46, ++i) + (j = 15, --j)
// i értéke 47 lesz
// j értéke 14 lesz
// a kifejezés értéke 61 lesz

Kifejezések

Feltételes kifejezés operátor

(6 == 1) ? (2 << 5) : (128 % 3)
// a feltétel hamis, ezért a kifejezés értéke 2

true ? (2 << 5) : (128 % 3)
// a feltétel igaz, ezért a kifejezés értéke 64

Kifejezések

Feltételes kifejezés operátor

false ? 4.0 : "a"
// 4.0 típusa double
// "a" típusa const char*
// fordítási hiba: nem kompatibilisek

Kifejezések

Feltételes kifejezés operátor

true  ? 'a' : 5
// 'a' típusa char, 5 típusa int
// kompatibilisek:
// char ↦ int automatikus konverzió
// a teljes kifejezés típusa int
// a feltétel igaz, ezért a kifejezés értéke 97
// 'a' ASCII kódja 97

Kifejezések

Rövidzáras (lusta kiértékelésű) logikai operátorok: ||, &&

true || x == true
false && x == false
x != 0 && 100 / x < 4
// nullával való osztás elkerülése
p && *p == 1
// nullmutató nem oldható fel

Kifejezések

Konstruktorok

T(e)
(int)15.7
int i = 1;
int i = int(1);
int i(1);

Explicit memóriagazdálkodás

Explicit lefoglalás és felszabadítás (allokáció és deallokáció)

int* pi = new int;
int* pi = new int(215);

Explicit memóriagazdálkodás

int* pi = new int[32];

Explicit memóriagazdálkodás

int* pi = new int;
int* pi2 = new int[32];
// ...
delete pi;
delete[] pi2;

Explicit memóriagazdálkodás

Operátorok

Fixitás: az operandusokhoz képest hol helyezkedik el az operátor szimbóluma?

++i             // prefix ++
i++ // posztfix ++
1 * 2 // infix *
true ? 1 : 2 // mixfix ?:

Operátorok

Precedencia: zárójelezési ("kötési") szabályok

1 + 2 * 31 + (2 * 3)

Operátorok

Asszociativitás: azonos precedenciájú operátorok kötésének meghatározására

a = b = c       ⇔       a = (b = c)
*p++*(p++)
a + b - c       ⇔       (a + b) - c

Operátorok

Asszociativitás: azonos precedenciájú operátorok kötésének meghatározására

std::cout << 1 << 4 << std::endl;
// kimenet: 14
std::cout << (1 << 4) << std::endl;
// kimenet: 16

Utasítások

Deklaráció

Deklaráció: egy vagy több név bevezetése

...
// itt nincsen szükség i változóra

int i;
// innentől használható

Blokk

{
int i;
{
double d;
{
char c;
}
}
}

Üres utasítás

for (;;)        ;
// végtelen ciklus

// csak az utolsó pontosvessző
// tartozik utasításhoz

Elágazások

if (i == 0)     j = 4;
if (i == 0)
{
j = 4;
}
if (i == 0);        // üres utasítás
{
j = 4; // ez a blokk mindig lefut
}

Elágazások

if (felt) {
// K&R
}
if (felt)
{
// ANSI C++
}
if (felt)
{
// GNU
}

Elágazások

if (3 == i)       ...
if (i = 3)       ...

Elágazások

if (p)          // ha p nem nullmutató...
{
*p = 3; // ... akkor feloldható
}

Elágazások

int j;
if (i < 3) {
j = 5; // igaz ág
} else {
j = 10; // hamis ág
}
int j = (i < 3) ? 5 : 10;

Elágazások

if (i == 3)         if (i == 3)
if (j == 4) if (j == 4)
k = 1; k = 1;
else else
k = 2; k = 2;

Több ágú elágazás

if (i < 3) {                if (i < 3) {
k = 1; k = 1;
} else if (j > 7) { } else {
k = 2; if (j > 7) {
} else { k = 2;
k = 3; } else {
} k = 3;
}
}

Több ágú elágazás

if (i < 3) {
k = 1;
}

if ( !(i < 3) && j > 7 ) {
k = 2;
}

if ( !(i < 3) && !(j > 7) ) {
k = 3;
}

Több ágú elágazás

int i;

switch (i) { case 1: f1();
break;

case 2: f2();
break;

default: f_def();
}

Több ágú elágazás

switch (i) {
case 1:
f1();
break;

case 2:
case 3:
f2_3();
break;

default:
f4();
}

Ciklus

while (i > 0) {
--i;
cout << i << endl;
}

Ciklus

while (true) {
// végtelen sokszor lefutó kódrészlet
}
while (true) {
...
if (lepjunk_ki()) break;
...
}

Ciklus

char c;
cin >> c;
while (!cin.eof()) { // itt cin.good() is állhatna
// ciklusmag
cin >> c;
}
char c;
while (cin >> c) {
// ciklusmag
}

Ciklus

do {
// ciklusmag
} while (feltétel);
// ciklusmag
while (feltétel) {
// ciklusmag
}

Leszámláló ciklus

for (inicializálás; feltétel; számlálás) utasítás

for (int i = 0; i < 10; ++i) j += i;

Leszámláló ciklus

// inicializálás
while (feltétel) {
// ciklusmag
// számláló léptetése
}

Leszámláló ciklus

for (;;) {
// végtelenített ciklusmag
}

Strukturált programozás

Vezérlésátadás