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!

  1. 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!
    
    
  2. 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); // vec=[3,3,3,3,3]
           std::cout <<"myvec=";
           for (int i=0; i<myvec.size(); ++i){
             std::cout <<myvec[i] <<" ";
           }
           std::cout <<"\n";
         }
    
  3. 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);  
         }
    
  4. 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);  
         }
  5. Što je to dinamički polimorfizam i kako ga postići u C++-u?
    
        Pogledajte prvu laboratorijsku vježbu!