C i C++ - najistotniejsze róznice
Transkrypt
C i C++ - najistotniejsze róznice
C i C++ - najistotniejsze różnice Bogdan Kreczmer ZPCiR IIAiR PWr pokój 307 budynek C3 [email protected] c 2005–2008 Bogdan Kreczmer? Copyright ? Niniejszy dokument zawiera materiały do wykładu na temat programowania obiektowego. Jest on udostepiony ˛ pod warunkiem wykorzystania wyłacznie ˛ do własnych prywatnych potrzeb i może on być kopiowany wyłacznie ˛ w całości, razem z niniejsza˛ strona˛ tytułowa. ˛ 1 C++ nie jest nadzbiorem C • Deklaracja stałych. Zachowanie zgodności wymaga jawnego dowiazania. ˛ ANSI C: const int Zm=23; ≡ extern const int Zm=23; ANSI/ISO C++: const int Zm=23; ≡ static const int Zm=23; • Rozmiary stałych znakowych: ANSI C: sizeof (’a’) ≡ sizeof (int) ANSI/ISO C++: sizeof (’a’) ≡ sizeof (char) • Nie zadeklarowane funkcje: ANSI C: przyjmowane jest automatycznie int fun(...). ANSI/ISO C++: jest to niedopuszczalne. • Deklaracja extern int fun(): ANSI C: równoważna extern int fun(...). ANSI/ISO C++: extern int fun(void). 2 Programowanie w C (prosty przykład) #include<stdio.h> struct LZespolona { /∗ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∗/ double re, im; }; /∗ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∗/ LiczbaZespolona Dodaj( LiczbaZespolona Z1, LiczbaZespolona Z2) { Z2.re += Z1.re; Z2.im += Z1.im; return Z2; } int main( ) { struct LZespolona A, B; A.im = 1; A.re = 2; B = A; A = Dodaj(A,B); printf("%g %gi\n",A.re,A.im); return 0; } 3 Rozszerzenie struktur do klas w C++ (prosty przykład) #include<iostream> using namespace std; struct LiczbaZespolona { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . double re, im; LiczbaZespolona Dodaj( LiczbaZespolona Z ); }; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . LiczbaZespolona LiczbaZespolona::Dodaj( LiczbaZespolona Z ) { Z.re += re; Z.im += im; return Z; } int main() { LiczbaZespolona A, B; A.im = 1; A.re = 2; B = A; A = A.Dodaj(B); cout << A.re << ” ” << A.im << endl; } 4 Rozszerzenie struktur do klas w C++ z operatorami #include<iostream> using namespace std; struct LiczbaZespolona { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . double re, im; LiczbaZespolona operator + ( LiczbaZespolona Z ); }; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . LiczbaZespolona LiczbaZespolona::operator + ( LiczbaZespolona Z ) { Z.re += re; Z.im += im; return Z; } int main() { LiczbaZespolona A, B; A.im = 1; A.re = 2; B = A; A = A + B; cout << A.re << ” ” << A.im << endl; } 5 Jawne wywołanie operatora #include<iostream> using namespace std; struct LiczbaZespolona { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . double re, im; LiczbaZespolona operator + ( LiczbaZespolona Z ); }; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . LiczbaZespolona LiczbaZespolona::operator + ( LiczbaZespolona Z ) { Z.re += re; Z.im += im; return Z; } int main() { LiczbaZespolona A, B; A = A + B; A.im = 1; A.re = 2; B = A; A = A.operator+(B); cout << A.re << ” ” << A.im << endl; } 6 Pytania i ćwiczenia 1. Czy wymuszajac ˛ kompilacje˛ programu w jezyku ˛ C kompilatorem jezyka ˛ C++ mamy pewność, że po uruchomieniu program ten da takie same wyniki jak po kompilacji kompilatorem jezyka ˛ C? 2. Czy program poprawny składniowo w jezyku ˛ C jest również zawsze poprawny w sensie składni jezyka ˛ C++ ?