5. Typy złożone

5.2. Napisy

W C++ podstawowym typem napisowym jest string, tyle że nie jest to część języka, lecz jeden z kontenerów z biblioteki STL. W starym C wbudowanego typu napisowego w ogóle nie było - napisy były przechowywane i przetwarzane jako tablica o elementach typu char. Dzięki temu tablicę taką możemy inicjalizować stałą napisową:


char napis[20] = "Lolek"; // równoważne { 'L','o','l','e','k','\0' }

Zwróćcie uwagę na ostatni znak w tablicy – zawsze powinien być to znak o kodzie 0, podany jawnie lub niejawnie. Takie podejście jest istotą tak zwanych "null-terminated strings" – techniki bardzo niewygodnej, lecz przez tak długi czas będącej standardem, że nie można jej pominąć do dziś.

Wymieńmy niedogodności:

  • skoro nie można bezpośrednio kopiować tablic, to nie można także bezpośrednio kopiować napisów,
  • nie można ich porównywać (w większości innych języków istnieje domyślny operator dokonujący porównania leksykalnego),
  • nie ma także domyślnego działania operatora dodawania, który powinien łączyć napisy,
  • do tablicy musimy wpisywać napisy literka po literce (używa się do tego odpowiednich funkcji, pochodzących z biblioteki standardowej C, co nie zmienia braku naturalności takiego podejścia),
  • często też powstają problemy z terminatorem napisu – znakiem o kodzie 0. Wstawienie go wewnątrz napisu powodowało skrócenie go do miejsca gdzie było wstawione 0.

Wszystkich wspomnianych wad pozbawiony jest typ string – lecz jak wspomnieliśmy – nie jest możliwe zupełne pominięcie go, choćby dlatego, że literały napisowe są zamieniane na stałe „null-terminated strings”