Minimalni skup često postavljanih pitanja o C++-u
C++ je grozno kompliciran jezik. Ali to nije najgore.
Najgore je što za tu složenost postoje (uglavnom) jako dobri razlozi.
Međutim, dobra vijest je što za potrebe ovog kolegija
95% složenosti C++-a možemo naprosto - zanemariti.
Početniku je vrlo teško uvidjeti
kojih 1% cjelokupnog jezika
predstavlja jezgru od koje treba početi.
Kako bismo pomogli kolegama koji se
do sada nisu susretali s C++-om (ali znaju C)
da naprave taj najteži prvi korak,
ovdje smo sakupili pitanja
koja su se na kolegiju postavljala
tijekom prošlih godina.
Naša intencija je da ovaj skup pitanja
pokrije minimalni podskup jezika
koji bi bio dovoljan za ovaj kolegij.
Svi prijedlozi za proširivanje dokumenta biti će dobrodošli!
-
U kakvom su odnosu C i C++?
U praksi, najčešće vrijedi da je C++ nadskup C-a.
Gotovo svaki valjani C istovremeno je i valjani C++.
C++ je sve do pojave predložaka i iznimki bio običan preprocesor za C.
Međutim, C i C++ su dva odvojena jezika.
Izvorni kôd u C-u je najčešće oblikovno suboptimalan
ako ga promatramo u okviru mogućnosti koje pruža C++.
Dinamičke kolekcije, reference, polimorfizam,
iznimke, pametni pokazivači, jače tipiziranje,
imenici i predlošci
pružaju mogućnosti da se namjera programa
izrazi na relativno visokom stupnju apstrakcije.
Zbog toga kôd u C++-u može biti sažetiji i jasniji nego u C-u.
Filozofija C-a je omogućiti izražavanje postupaka
na jednostavan i prenosiv način, uz što manji gubitak
brzine izvođenja u odnosu na strojni kod.
C++ dodatno omogućava apstraktnije izražavanje,
uz zadržavanje približno jednake brzine izvođenja
kao i u okviru C-a.
Da budemo korektni, ovdje ćemo navesti i da C++
pruža brojne mogućnosti da se program napiše - loše,
kao i da tih mogućnosti ima više nego u C-u.
Još jedan razlog da početnik bude oprezan!
-
Kako predstaviti kolekcije u C++-u?
Korištenjem odgovarajućih tipova STL-a.
#include <iostream>
#include <vector>
int main(){
std::vector<double> myvec(5,3); std::cout <<"myvec=";
for (int i=0; i<myvec.size(); ++i){
std::cout <<myvec[i] <<" ";
}
std::cout <<"\n";
}
-
Kako prenosimo složene *ulazne* parametre potprograma
ako želimo izbjeći kopiranje objekata,
tj. ostvariti call by reference?
Korištenjem konstantne reference.
double mynorm(const std::vector<double>& inputVector){
double sum=0
for (int i=0; i<inputVector.size(); ++i){
sum +=inputVector[i]*inputVector[i]
}
return sum
}
int main(){
std::vector<double> vec(5,3);
double vecNorm=mynorm(vec);
}
-
Kako prenosimo složene *izlazne* parametre potprograma
ako želimo izbjeći kopiranje objekata,
tj. ostvariti call by reference?
Korištenjem izmjenjive reference.
void multiply(
const std::vector<double>& inputVector,
double scalar,
std::vector<double>& outputVector)
{
for (int i=0; i<inputVector.size(); ++i){
outputVector[i]=inputVector[i]*scalar;
}
}
int main(){
std::vector<double> vec1(5,3);
std::vector<double> vec2;
multiply(vec1, 42, vec2);
}
-
Što je to dinamički polimorfizam i kako ga postići u C++-u?
Pogledajte prvu laboratorijsku vježbu!