Różnice między C oraz C++

Język C++ powstał na bazie C. Oba języki utrzymują prawie całkowitą kompatyblność, jednak jest kilka aspektów, którymi się różnia. Prowadzi to do sytuacji, że nie zawsze daje się bezproblemowo skompilować kod napisany w jednym języku przy użyciu kompilatora do drugiego. Niniejszy tekst opisuje zwięźle różnice, o których powinien pamiętać programista.

Niejawne rzutowanie typu void*.
—————————————————————
W C++ to błąd.

int *x = malloc(sizeof(int) * 10);

W języku C, niejawne rzutowanie typu void* jest dopuszczalne, a nawet całkowicie akceptowalne. W języku C++ jest ono niemożliwe.

Alokacja i zwalnianie pamięci
—————————————————————
W C było tak.

int *x = malloc( sizeof(int) );
int *x_array = malloc( sizeof(int) * 10 );
free( x );
free( x_array )

W języku C do alokacji pamięci używaliśmy funkcji malloc lub calloc. Zwalnialiśmy zaalokowaną pamięć funkcją free. Nie występowało w tym przypadku rozróżnienie na tablice i pojedyncze elementy.

W C++ jest tak.

int *x = new int;
int *x_array = new int[10];
delete x;
delete[] x;

W C++ do alokacji pamięci używamy operatora new, a do zwalniania pamięci używamy operatora delete. Dodatkowo, występuje tu rozróżnienie na tablicę i pojedynczy element.

Brak deklaracji funkcji
—————————————————————
W C++ to błąd.

int main(){
    foo();
    return 0;
}
int foo(){
    printf( "Hello world" );
}

W języku C++ konieczne jest zadeklarowanie (lub zdefiniowanie) funkcji przed jej użyciem. W C nie było to wymagane.

Brak słowa struct (enum) przy deklaracji struktury (enumaracji).
—————————————————————
W C to błąd.

struct a_struct{
    int x;
};
a_struct struct_instance;

W języku C powyższy kod jest błędem, gdyż brak słowa struct przed deklaracją zmiennej. Jest na to rada – wykorzystanie typedef.

Automatyczne linkowanie w C++.
—————————————————————
W C++ jest tak.

% g++ foo.cc

W C było tak.

% gcc foo.c -lm

Kompilator C++ linkuje niektórze biblioteki automatycznie, kompilator C – nie. Przykładowo, dla operacji matematycznych w C musimy podlinkować sami odpowiednią bibliotekę.

Brak typu boolean w C
—————————————————————
W C jest tak.

typedef enum {FALSE, TRUE} bool;

Język C nie ma natywnie zaimplementowanego typu boolean, dlatego musi on być symulowany enumeracją.

Automatyczne zwracanie wartości 0 przez funkcję main()
—————————————————————
W C++ jest tak.

int main(){
    printf( "Hello, World" );
}

W C było tak.

int main(){
    printf( "Hello, World" );
    return 0;
}

W języku C++ funkcja main() automatycznie zwraca wartość 0, gdy nie podamy inaczej. W C musimy zami o to zadbać