ARCHIV |
|||||
Software (10844)
Distribuce (131)
Skripty (697)
Menu
Diskuze
Informace
|
C/C++ (34) - Drobná vylepšení C++C++ nepřináší jen "velké" vlastnosti, jakými jsou podpora objektově orientovaného programování nebo šablony. Oproti C nabízí celou řadu drobných vylepšení a některá z nich si dnes probereme. KomentářC++ umožňuje jednořádkový komentář uvozený //. // Tohle je komentář ve stylu C++ /* Tohle je komentář ve stylu C */ Je ovšem pravda, že komentář uvozený // umožňuje i norma C z roku 1999 a často jej tolerují i starší překladače C. C++ komentář je možné vložit do C komentáře, lze tedy psát například
/*
Tuhle funkci nepotřebujeme, ale zatím ji nebudeme mazat.
// Komentář k funkci
void funkce(void) {
// Komentář k implementaci
}
*/
Tradiční řešení ve stylu C je trochu neohrabané, neboť komentář /* */ nelze vkládat do sebe. #if 0 Tuhle funkci nepotřebujeme, ale zatím ji nebudeme mazat. /* Komentář k funkci */ void funkce(void) { /* Komentář k implementaci */ } #endif Hlavičkové souboryHlavičkové soubory standardní knihovny jazyka C jsou v C++ dostupné buď původním způsobem tj. například
#include <stdio.h>
nebo pomocí předpony c a bez .h.
#include <cstdio>
U souborů specifických pro standardní knihovnu C++ tuto volbu nemáme, inkludují se bez předpony i bez přípony.
#include <vector>
Inline funkceVolání funkce na úrovni strojového kódu vyžaduje určitou režii spojenou s předáváním parametrů, adresy volajícího kódu, návratové hodnoty i s provedením skoků na adresu volané funkce a zpět. V případě velmi jednoduchých funkcí typu sečti dvě čísla je tato režie větší než doba strávená vykonáním těla funkce. V C se považuje za standardní řešení makro, které se na textové úrovni rozvine v místě volání. C++ nabízí navíc klíčové slovo inline, kterým doporučujeme překladači, aby na úrovni přeloženého kódu funkci v místech volání rozvinul, podobně jako makro na úrovni kódu zdrojového. Funkce potom bude součástí volajícího kódu, existovat tedy bude v tolika instancích, kolikrát je volána. inline int plus(int x, int y) { return x + y; } Je zřejmé, že přílišnou duplikací kódu (ať už pomocí inline funkcí, maker nebo dokonce prostého kopírování na úrovni zdrojového kódu) můžeme výsledný program naopak zpomalit. Z hlediska keše na úrovni procesoru je výhodnější malé výkonné jádro programu a to může být důležitější než ušetření režie při volání funkce. Přístupnost globálních identifikátorůV C++ je možné zpřístupnit překrytý globální identifikátor pomocí čtyřtečky. #include <stdio.h> const char *s = "globální řetězec"; int main(void) { const char *s = "lokální řetězec"; printf("V C++ je přístupný %s i %s.\n", s, ::s); return 0; } Při procedurálním programování ve stylu C v dobře navrženém programu podobné překrytí globálního identifikátoru není příliš pravděpodobné, ale při použití objektově orientovaného programování podobný konflikt hrozí častěji. Je zcela přirozené definovat třeba třídu Socket s metodou listen, která přes čtyřtečku může zavolat překrytou knihovní funkci listen. Později si ukážeme, že čtyřtečka v C++ zapadá do obecnější koncepce prostorů identifikátorů. Ternární operátorTernární operátor ?: vrací v C++ l-hodnotu, pokud je jeho druhý i třetí parametr l-hodnota.
(polozka < 0 ? maDati : dal) += polozka;
V C tomu tak není, a tak je třeba rozepsat kód do čitelnější podoby s if a else.
if (polozka < 0) maDati += polozka; else dal += polozka;
Definice proměnnýchV C++ je možné definovat lokální proměnnou kdekoli v bloku, nikoli jen na jeho začátku. Běžně se toho využívá a proměnná se často definuje až v místě prvního použití. Definice ovšem nesmí být přeskočena pomocí break nebo goto, pokud zároveň nepřeskočíme celý blok, v němž je proměnná definována. void funkce1(void) { int i; i = 1; // V C++ OK int j; } void funkce2(void) { // chyba, přeskočení definice goto konec; int j; konec:; } void funkce3(void) { // OK, přeskočení celého bloku goto konec; { int j; } konec:; } Je zajímavé, že g++ bez problémů přeloží i test funkce2 (že by chyba?), ale stačí místo typu int použít třeba std::string (#include <string>) a překlad skončí takhle: c.cpp: In function 'void funkce2()': c.cpp:17: error: jump to label 'konec' c.cpp:15: error: from here c.cpp:16: error: crosses initialization of 'std::string j' Proměnnou lze dokonce definovat i v řídících strukturách if, switch, for a while. V tom případě má platnost pouze v následujícím bloku nebo příkazu. for (int i = 0; i < 10; i++) { printf("%i\n", i); } // Tady už i není definované Známou chybou starší, ale dosud používané verze MS Visual C++ 6.0 je prodloužení platnosti proměnné, jako kdyby byla definována těsně před řídící strukturou. Programátorům, kterým záleží na maximální přenositelnosti kódu mezi různými překladači, bych proto doporučil podobné definice nepoužívat. V gcc funguje vše správně. Domácí úkoly
Pokračování příštěV příštím dílu se podíváme na reference a na volání funkcí s různými sadami parametrů.
Související články
Předchozí Celou kategorii (seriál) Další
C/C++ (1) - Úvod
C/C++ (2) - První program C/C++ (3) - Proměnné a konstanty C/C++ (4) - Funkce printf C/C++ (5) - Funkce printf podruhé C/C++ (6) - Operátory C/C++ (7) - Podmínka C/C++ (8) - Cykly C/C++ (9) - Pole C/C++ (10) - Standardní vstup a výstup C/C++ (11) - Čtení a konverze čísel C/C++ (12) - Preprocesor C/C++ (13) - Preprocesor podruhé C/C++ (14) - Funkce C/C++ (15) - Proměnné C/C++ (16) - Hlavičkové soubory C/C++ (17) - Makefile C/C++ (18) - Makefile podruhé C/C++ (19) - Příkaz switch a bitové operátory C/C++ (20) - Alokace paměti C/C++ (21) - Práce s řetězci C/C++ (22) - Struktury C/C++ (23) - Seznam C/C++ (24) - Soubory C/C++ (25) - Funkce s proměnným počtem parametrů C/C++ (26) - Standardní knihovna C/C++ (27) - Standardní knihovna podruhé C/C++ (28) - Standardní knihovna potřetí C/C++ (29) - Standardní knihovna počtvrté C/C++ (30) - Výčtový typ a nestandardní knihovny C/C++ (31) - Jazyk C++, historie, charakteristika, vztah k C C/C++ (32) - Omezení C++ oproti C C/C++ (33) - Rozdíly mezi C a C++ C/C++ (35) - Reference, funkce C/C++ (36) - Prostory jmen C/C++ (37) - Prostory jmen podruhé C/C++ (38) - Prostory jmen potřetí C/C++ (39) - Objektově orientované programování C/C++ (40) - Dědičnost a virtuální metody GCC vs. CLANG C++ Binární vyhledávací stromy C++ Datová struktura zásobník C++ - Hashování C++ - Vyhledávání v textu - Brute Force algoritmus C++ šablony Grafy a grafové algoritmy I Grafy a grafové algoritmy II C++ výjimky C++ Funktory neboli funkční objekty Grafy a grafové algoritmy III. C++ a garbage collector Předchozí Celou kategorii (seriál) Další
|
Vyhledávání software
Vyhledávání článků
28.11.2018 23:56 /František Kučera 12.11.2018 21:28 /Redakce Linuxsoft.cz 6.11.2018 2:04 /František Kučera 4.10.2018 21:30 /Ondřej Čečák 18.9.2018 23:30 /František Kučera 9.9.2018 14:15 /Redakce Linuxsoft.cz 12.8.2018 16:58 /František Kučera 16.7.2018 1:05 /František Kučera
Poslední diskuze
31.7.2023 14:13 /
Linda Graham 30.11.2022 9:32 /
Kyle McDermott 13.12.2018 10:57 /
Jan Mareš 2.12.2018 23:56 /
František Kučera 5.10.2018 17:12 /
Jakub Kuljovsky | |||
ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2024) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze |