47
Programozás alapjai II. (1. ea) C++ C++ kialakulása, nem OO újdonságok: Szeberényi Imre, Somogyi Péter BME IIT <[email protected]> M Ű E G Y E T E M 1 7 8 2 2020.02.10. C++ programozási nyelv © BME-IIT Sz.I. -1-

Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Programozás alapjai II. (1. ea) C++

C++ kialakulása, nem OO újdonságok:

Szeberényi Imre, Somogyi Péter BME IIT

<[email protected]>

M Ű E G Y E T E M 1 7 8 2

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 1 -

Page 2: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

C++ kialakulása

C++

C + javítások

OOP elemek

Veszélyforrások csökkentése Objektum orientált szemlélet

A fejlődés során jelentős kölcsönhatások voltak aC és a C++ között

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 2 -

Page 3: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

C és C++ viszonya

C könyvtár

preprocesszor

buta C

C könyvtár

C++ könyvtár

preprocesszor

okos C

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 3 -

Page 4: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

C és C++változatai

1972 1978 1989 19991990

C

K&R C ANSI C

C90

C99 C11

1979

C++

C w. classes

1983

1985 1998

C++98

C++03

C++11

20112003

C++14

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 4 -

2014

C18

C++17

Page 5: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

C++11, C++14, C++17?

• A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként.

• Ezt tanítja és ezt kéri számon, de lehet az újabb változatok elemeit használni háziban, zh-ban.

• A teljes C++11 azonban lényegesen bonyolultabb, amit másik tárgy keretében lehet megismerni.

• Bjarne Stroustrup: „C++11 feels like a new language”

http://www.stroustrup.com/C++11FAQ.html

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 5 -

Page 6: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

C99

• deklarációk és utasítások vegyesenfor (int i = 1; i < 12; i++) ….

• // comment, const, enum, inline• változó hosszúságú tömb (függvényben)void f(int b) {int c[b]; // változó méretű tömb

}

• új típusok (pl. long long, double _Complex)• Pontosabb specifikáció pl: -3/5 = 0

-3%5= -3 // C89-ben lehetne -1 és +2 2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 6 -

Page 7: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Általános kódolási tanácsok (ism)

• Olvasható legyen a kód, ne trükkös!

• Mellékhatásoktól tartózkodni!

• Nem triviális szintaxist kerülni, akkor is, ha a C nyelv szerint az egyértelmű (a+++b)

• Nem feltétlenül kell haragudni a break-re és a continue-ra! Óra végén látni fogjuk, hogy C++-ban még a „goto”-t is gyakran használjuk (bár nem így hívjuk).

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 7 -

Page 8: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Mi történik, ha x > 2.3 ?

while (i < 12 && q != 0 && k > 87 && u < 3) {...................................

if (x > 2.3) q = 0;..................................}

while (i < 12 && k > 87 && u < 3) {...................................

if (x > 2.3) break;...................................}

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 8 -

Page 9: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Általános kódolási tanácsok/2

• Makrókat kerüljük, ha lehet#define MAX(a,b) a > b ? a : b

int a1 = 1;int x = MAX(a1&7, 3); // x = ???

#define MAX(a,b) (a) > (b) ? a : b

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 9 -

Page 10: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Általános kódolási tanácsok/2

• Memória foglalás: ki foglal és ki szabadít?char *valami(char *); // lefoglal? Mit csinál?

• Ha foglal, kinek kell felszabadítani ? • Oda kell írni kommentbe!

• Összetartozó adatok struktúrába• Konstansok, enum

• Elfogadott kódolási stílus betartása (pl: http://google-styleguide.googlecode.com/svn/trunk/cppguide.html

A lényeg a következetességen van!

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 10 -

Page 11: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Deklaráció és definíció

• A deklarációs pont továbbra is legtöbbször definíció is:– int a; float alma;– de: int fv(int x); - nem definíció

• A típus nem hagyható el !• Több deklaráció is lehet,

– extern int error;– extern int error;

• Definíció csak egy!

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 11 -

Page 12: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Ott deklaráljunk, ahol használjuk

y = 12; …

int z = 3; // és egyből inicializáljuk

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

z += i;

int k = i – 1;

y *= k;

}i és k itt már nem

létezik !

élettartam, hatókör u.a, mint a C-ben

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 12 -

Page 13: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

C++ újdonságok, bővítések

• Struktúranév típussá válik• Csak preprocesszorral megoldható dolgok

nyelvi szintre emelése (const, enum, inline)• Kötelező prototípus, névterek• Referencia, cím szerinti paraméterátadás• Túlterhelt/többarcú függvények (overloaded)• Alapértelmezésű (default) argumentumok• Dinamikus memória nyelvi szint. (new, delete)• Változó definíció bárhol, ahol utasítás lehet

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 13 -

Page 14: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Típusok

• logikai

• char

• egész

• felsorolás

• valós

• mutató

• referencia

• void

• összetett adatszer-kezetek (tömb struktúra) és osztályok

integrális

aritmetikai

skalár

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 14 -

Page 15: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Logikai típus (új típus)

bool

false

true

aritmetikai bool automatikus típuskonverzió, ahogyan a C-ben megszoktuk.

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 15 -

C++-ban nyelvi elem

Page 16: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

bool

Aritmetikai és logikai konverzió

0 = hamis,a többi = igaz

Aritmetikai típus

értékkészlete

0 vagy 1

bool b1, b2, b3; int i;b1 = true; b2 = 3; i = b2; b3 = false;(b2 == true, i == 1)

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 16 -

Page 17: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Struktúra név típussá válik

struct Komplex {

float re;

float im;

};

srtruct Lista_elem {

int i;

Lista_elem *kov;

};

C++-ban a név típus értékű

önhivatkozó struktúránál kényelmes

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 17 -

Page 18: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Konstans (ism)

#define PI 3.14 helyett

const float PI = 3.14;

const:

Típusmódosító amely megtiltja az objektum átírását

(fordító nem engedi, hogy balértékként szerepeljen)

Mutatók esetén:

const char * p; //p által címzett terület nem módosítható

char const * p; // ua.

char * const q; //q-t nem lehet megváltoztatni

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 18 -

Page 19: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Két trükkös próbálkozás

const int x = 3;

int *px = &x;

*px = 4;

void f(int *i) { *i = 4; }

const int x = 3;

f(&x);

fordítási hiba

fordítási hiba

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 19 -

Page 20: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Felsorolás típus (szigorúbb lett)

enum Szinek {

piros, sarga, zold = 4

};

Szigorúbb ellenőrzés, mint az ANSI C-ben. Pl:

Szinek jelzo;

jelzo = 4;

jelzo = Szinek(8);

típus

fordítási hiba

nincs hiba, de meghatározatlan

érték létrehozása

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 20 -

Page 21: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Prototípus kötelező

Tipikus C hiba:

double z = sqrt(2);

C feltételezi, hogy int

(double) kellene

Előrehivatkozáskor kötelező

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 21 -

Page 22: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Miért baj ha elmarad?

a függvényt hívó rész a hívott függvénydouble z=sqrt(2); double sqrt(double x) {

verem x..return res;

int double

regiszterint

double ...}

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 22 -

Page 23: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Mutatók és címek (ism.)

• Minden változó és függvény memóriában levő helye (címe) képezhető. (pl: &valtozo)

• Ez a cím ún. pointerben vagy mutatóban tárolható.

• A pointer egy olyan típus, amelynek az értékkészlete cím, és mindig egy meghatározott típusú objektumra mutat.

int i, *ip;

float f, *fp;

ip = &i;

fp = &f;

int-re mutató pointer

float-ra mutató pointer

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 23 -

Page 24: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Indirekció (ism.)

int i;float f;

int *ip;float *fp;

*ip = 13;

13

ip = &i

i címe

Memória

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 24 -

Page 25: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Értékparaméter (ism.)

• A paraméterek nem változhatnak meg, mivel azok értéke adódik át.

• Azok eredeti tartalma az eredeti helyen megmarad.

• A függvény csak a függvényértéken keresztül tud a külvilágnak eredményt szolgáltatni. (Ez sokszor kevés.)

változó v. konstans

érté

k

függvény

fv.é

rték

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 25 -

Page 26: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Változó paraméter (ism.)

• A paraméter címét adjuk át, így az átadott paraméter elérhető, de meg is változtatható.

• A magas szintű nyelvek elfedik ezt a trükköt. Sem az aktuális paraméterek átadásakor, sem a formális paraméterekre való hivatkozáskor nem kell jelölni.

• Csupán a paraméter jellegét (változó) kell megadni.

változó

függvény

fv.é

rték

cím

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 26 -

Page 27: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Referencia (új típus)

Referencia: alternatív név

tipus&

int i = 1;

int& r = i; // kötelező inicializálni, mert

// tudni kell, hogy kinek az alternatív neve

int x = r; // x = 1;

r = 2; // i = 2;

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 27 -

Page 28: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Változó paraméter referenciával

C:

void inc(int *a)

{

(*a)++;

}

int x = 2;

inc(&x);

C++:

void inc(int &a)

{

a++;

}

int x = 2;

inc(x);

könnyen lemarad

nem kell jelölni a

címképzést híváskor

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 28 -

Page 29: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Példa// két érték felcserélése

// Változó paraméter pointerrel

void csere(int* a, int* b) {

int tmp = *a;

*a = *b;

*b = tmp;

}

...

int x, y;

csere(&x, &y);

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 29 -

Page 30: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Példa// két érték felcserélése

// Változó paraméter referenciával

void csere(int& a, int& b) {

int tmp = a;

a = b;

b = tmp;

}

...

int x, y;

csere( x, y);

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 30 -

Page 31: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Paraméterátadás összefogl.

• érték szerint– skalár

– struct

• cím szerint (tömb, változtatni kell, hatékonyság)– típus&

– típus*

• Pointer paraméter és a változtatandó paraméter szétválik.

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 31 -

Page 32: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Paraméterátadás /2

• Pointer, referencia + const használatával a hozzáférés jól szabályozható:

struct Data { double dx[1000]; int px[2000]; } d;

void f1(Data); // f1(d); értékparaméter

void f2(const Data* ); // f2(&d); nem változhat

void f3(const Data&); // f3(d); nem változhat

void f4(Data*); // f4(&d); változhat

void f5(Data&); // f2(d); változhat

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 32 -

Page 33: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Függvény argumentumok

• Konvertert írunk, ami tetszőleges számrendszerbe tud konvertálni. A fv. a számrendszer alapját paraméterként kapja.

char *int2Ascii(int i, int base = 10);

Csak az argumentumlista végén lehetnek default argumentumok, akár több is.

• f(), f(void) - nincs paraméter

• f(...) - nem kell ellenőrizni

• f(int a, int) - nem fogjuk használni

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 33 -

Page 34: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Inline függvények

#define max(a,b) (a) > (b) ? a : b

x = 8, y = 1; z = max(x++, y++); x,y,z = ?

inline int max(int a, int b) {

return(a > b ? a: b);

}Nincs trükk. Pontosan úgy viselkedik, mint a függvény. A hívás helyére beilleszti a kódot (lehetőleg).

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 34 -

Page 35: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Inline fv. példa

inline int max(int a, int b) { return(a > b ? a: b); }

int x = 3, y = 4, z;

z = max(x++, y++);

// a hívás helyére beépül a kód, miközben

// fv. hívás szabályai érvényesülnek

z = a > b ? a : b; // a = 3, b = 4

Eredmény:

x -> 4, y -> 5, z -> 4optimalizáló ezen még optimalizálhat

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 35 -

Page 36: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Függvény overload

int max(int a, int b) {

return(a > b ? a: b);

}

double max(double a, double b) {

return(a > b ? a: b);

}

int x = max(1, 2);

double f = max(1.2, 0.2);

Túlterhelt (overloaded) függvények

Azt a változaot használja, ami illeszkedik a hívásra

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 36 -

Page 37: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

standard I/O, iostream

• cin• cout• cerr• clog

#include <iostream>

using namespace std;

int main() {

cout << ″Hello C++″ << endl;

}

előre definiált objektumok

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 37 -

Page 38: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Miért iostream ?

C-ben ezt írtuk:

printf("i=%d j=%d\n", i, j);

C++-ban ezt kell:

cout << "i = " << i << " j=" << j << endl;

Kinek jó ez ?• A printf, scanf nem biztonságos! Nem lehet

ellenőrizni a paraméterek típusát.

• A printf, scanf nem bővíthető új típussal.

• Lehet vegyesen ? (sync_with_stdio())

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 38 -

Page 39: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

A << és a >> új operátor?

• Nem új operatorok! A már ismert << és >> operatorok túlterhelése (overload).

• Az operatorok a C++ -ban függvények a függvények pedig többarcúak.

• A cout egy otstream típusú objektum, amihez léteznek

ostream& operator<<(ostream& os, int i);ostream& operator<<(ostream& os, double d);ostream& operator<<(ostream& os, const char *p);... alakú függvények. (Később pontosítjuk)

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 39 -

Page 40: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Függvény, mint balérték?

int main() {

cout << ″Hello C++″ << endl;

}

ostream& operator<<(ostream& os, const char *p);alakra illeszkedik. Bal oldalon van a függvény?

Referencia értékű függvény lehet bal oldalon is.

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 40 -

Page 41: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Egyszerű példa

int x; // ronda globális!int& f1( ) { return x; }double& f2(double& d) { return d; }

int main( ) {f1( ) = 5;f1( )++;double y = 0.1;f2(y) *= 100;cout << "x=" << x << " y=" << y << endl;

} // kiírás: x=6 y=10

Referenciát, azaz alternatív nevet szolgáltatnak

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 41 -

Page 42: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Példa: nagyobb

// Fájl: nagyobb_main.cpp

#include <iostream>#include "fuggvenyeim.h"using namespace std;

int main() {cout << "Kerek ket egesz szamot:" << endl;int i, j;cin >> i >> j; // i és j értékének beolvasásaint k = max(i, j);cout << "A nagyobb: " << k << endl; // nagyobb kiírása

}

fv prototípusok, konstansok, típusok, egyéb deklarációk

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 42 -

Page 43: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Példa: nagyobb /2// Fájl: fuggvenyeim.cpp

// Ebben valósítom meg a gyakran használt függvényeket.

#include "fuggvenyeim.h"

// Két int adat felcserélésevoid csere(int& a, int& b) {

int tmp = a; a = b;b = tmp;

}// ....

Saját header-t is célszerű behúzni ellenőrzés miatt

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 43 -

Page 44: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Példa: nagyobb /3// Fájl: fuggvenyeim.h

// Ebben találhatók a függvények prototípusai, típusok ....

#ifndef FUGGVENYEIM_H

#define FUGGVENYEIM_H

/* csere

* Két int adat felcserélése

* @param a - egyik adat

* @param b - másik adat

*/

void csere(int& a, int& b);

Függvény prototípusa

Egy fordítási egységben csak egyszer

Automatikus dok. generálás

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 44 -

Page 45: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Példa: nagyobb /4/*

* max

* Két int adat közül a nagyobb

* @param a - egyik adat

* @param b - másik adat

*/

// Ez egy inline függvény, amit minden fordítási egységben

// definiálni kell.

inline int max(int a, int b) { return a > b ? a : b; }

#endif // FUGGVENYEIM_H

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 45 -

Page 46: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Példa fordításaFordítás parancssorból:

g++ nagyobb_main.cpp fuggvenyeim.cpp –o nagyobb_main

Fordítás IDE segítségével:

Projektet kell készíteni, ami tartalmazza a 3 fájlt:

nagyobb_main.cpp

fuggvényeim.cpp

fuggvényeim.h

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 46 -

Page 47: Programozás alapjai II. (1. ea) C++ · 2020-02-10 · C++11, C++14, C++17? • A tárgy a 2003-ban elfogadott C++ nyelvet használja az OO paradigmák bemutatásához eszközként

Példa fordítása /2Fordítás parancssorból make segítségével:

1. Elő kell állítani a függésegeket leíró Makefile-t pl:# kicsit hibás, mert nem veszi figyelembe a header változását.

OBJS = nagyobb_main.o fuggvenyeim.o

CC=g++

CPPFLAGS = -Wall

nagyobb_main: $(OBJS)

$(CC) -o $@ $(OBJS)

2. le kell futtatni a make programotmake

2020.02.10.C++ programozási nyelv © BME-IIT Sz.I. - 47 -