Avatar billede intel4004 Novice
22. februar 2003 - 10:44 Der er 29 kommentarer og
2 løsninger

Forskellen mellem C og C++

Jeg vil gerne forstå forskellem mellem C og C++ :) Hvor ligger den rent kode-mæssigt. Jeg troede at konsol programmering med Borland C++ Builder (dem med cout mm) faktisk var ren C. Men det lader til at jeg nok har misforstået noget. Jeg sidder i en gruppe på Aalborg Universitet Esbjerg og vi har planer om at bygge et projektstyringssystem i PHP. De if-sætninger og løkker der eksisterer i php, minder meget om c++, eller er det kun c???

Så vidt jeg kan se er sproget c++ allerede over 20 år gammelt og opfundet af en dansker. Men hvordan fungerer den "gamle" c-kode så??

Intel4004
Avatar billede arne_v Ekspert
22. februar 2003 - 10:55 #1
C++ er en objekt-orienteret overbygning på C.

Faktisk var der nogle af de første C++ compilere der oversatte
C++ til C og så brugte C compileren.

C++ er et næsten rent superset af C d.v.s. at næsten alt C
kode virker med en C++ compiler (men altså ikke alt).

C++ er et betydeligt større sprog end C.

GUI versus console programmer har intet med C++ versus C at
gøre. Man kan skrive begge i begge.

PC compilere har traditionelt været C/C++ compilere mens
det på andre systemer tit har været 2 helt forskellige
compilere.

C er over 30 år gammelt og er altså noget ældre end C++.
Avatar billede doctorseb Nybegynder
22. februar 2003 - 11:08 #2
Populært sagt er C++ et superset af C (alt hvad du kan i C - næsten - kan du også i C++). Der er dog en del mere til det...

C er et proceduralt sprog og minder som sådan meget om pascal. Skriv en million funktioner og kald dem fra en million andre. Det er helt fint indtil der er for mange af dem. Overskueligheden forsvinder og spaghettien banker på...

C++ er objekt orienteret. Objekt orienteret programmering har taget den procedurelle indgangsvinkel et kæmpeskridt videre ved tilføjelsen af de tre hjørnesten i OOP: Indkapsling, nedarvning og polymorfisme (hedder det sådan på dansk?).

Indkapsling udvider den modul-baserede opbygning der kendes fra de precedurelle sprog. Data og operation stoppes ind i en klasse, der derefter kun kan bruges vha. et (forhåbentligt) veldefineret interface. Hvad der er inde i klassen og hvordan den fungerer er irellevant for brugeren.

Vha. af nedarvning kan man genbruge eksisterende klasser og udvide/specialisere disse.

Polymorfisme er hård at forklare, det skal prøves. Det er ekstremt brugbart, men man skal ha' fingrene i grøden for ligesom at forstå hvad det går ud på (og hvorfor det er smart). Jeg bruger det flittigt, men synes stadig det er enormt abstrakt. Det er lidt ligesom at køre bil; lær at bruge det, men prøv ikke at tænke for meget over det ;) Der er sikkert andre der kan vise nogle eksempler på hvorfor det er smart...
Avatar billede tosssen Nybegynder
22. februar 2003 - 12:03 #3
doctorseb>> Udmærket forklaring! For en god ordens skyld så hedder det polymorfi på dansk ;-)
Avatar billede intel4004 Novice
22. februar 2003 - 13:40 #4
doctorseb>

Lyder også som en glimrende forklaring, men jeg aner mildest talt ikke hvad en klasse er (en skoleklasse ?? )...:)

Jeg har gang i noget andet i et andet spg. med dig doctorseb - så du kan nok se at jeg er nybegynder. Dog så har jeg en middel erfaring med PHP/Mysql web-programmering, og her kommer C++ også ind i billedet...

Det er fordi jeg tror jeg har bildt folk ind at PHP ikke bruger C++ syntaks, men C - dette er forkert, er det ikke??

Vil det sige at det C jeg møder i bøger og andre steder, faktisk altid vil være C++ (nu står der jo også C++ på dem)... ??? Er C stadig brugt??

Intel4004
Avatar billede arne_v Ekspert
22. februar 2003 - 13:48 #5
En klasse et et nøgle-begreb i objekt orienteret programmering.

En struct indeholder members. En class indeholder både members
og methods (=funktioner). Sådan lidt forsimplet.

C og C++ deler rigtig meget syntax og for mange sprog så kan man
tale om at de bruger C/C++ syntax.

Man bruger stadigvæk C mange steder. Der er stadigvæk en meget stor
del af Unix/Linux programmering der laves i C. Der er stadig en meget
stor del af embedded programmering der laves i C. På PC tror
jeg de fleste idag bruger en C++ compiler.

Det er svært at sige om det er C eller C++ i de bøger du læser. Det
afhænger jo af hvilke bøger det er.
Avatar billede doctorseb Nybegynder
22. februar 2003 - 16:01 #6
Hejsa,

Som arne_v skriver så er C's syntax meget lig C++'s. Jeg synes ikke det giver mening at snakke om, at ét sprog benytter et andet sprogs syntax. Derimod giver det mening at kategorisere dem. C og Pascal er procedurelle sprog. C++ og Object Pascal er objekt orienterede sprog. Der findes desuden funtionssprog, logiksprog og sikkert et hav andre.
Jeg kender ikke PHP, men da det er populært scriptsprog vil jeg umiddelbart tro at det hører hjemme procedurelle...

C er stadig meget udbredt og bruges stadig regtig mange steder.

I OOP er en klasse populært sagt en klump der beskriver et stykke virkelighed(!). I C++ kan du f.eks. beskrive en bil således:

class CBil
{
private:
  char m_Maerke[100];
  double m_Vaegt;
  //osv.osv.
public:
  void Start();
  void Stop();
  //osv.osv.
};

Brugeren (læs programmøren) af klassen bekymrer sig ikke om, hvordan bilen fungerer. Han kan alligevel kun bruge metoderne Start() og Stop(). Resten af klassen er lukket land for ham. Dermed INDKAPSLING.
Han kan så specialisere klassen of f.eks. lave en Opel:

class COpel : public CBil
{
public:
  void TilfaeldigRustGenerator();   
};

COpel har nu ARVET CBil's egenskaber, tilføjede sine egne særpræ og dermed specialiseret klassen.

CBil og COpel kan bruges som en hver anden type i C (C++)...
Avatar billede arne_v Ekspert
22. februar 2003 - 16:09 #7
doktoseb>

Der er visse syntax træk som en del sprog har arvet fra C/C++:
  {} i.s.f. begin end eller begin endxxx
  = i.s.f :=
  == i.s.f. =
  != i.s.f. <>
  case sensitive
  for løkken
  do while i.s.f. repeat until

Der er en klar forskel på sprog der bruger C/C++ lignende syntax
og sprog der bruger Pascal/Modula-2 lignende syntax.
Avatar billede stringbuffer Nybegynder
25. februar 2003 - 01:37 #8
Nogle praktiske forskelle:

cout er en stream defineret i C++ io bibliotek iostream.h, så det er IKKE ren C når du laver konsolprogrammer i C++ Builder, langt fra!

Hvis du er vant til C++ så vil du nok savne muligheden for funktions-overloading, som ikke findes i C.
I C har du ikke nogen "new" operator - du skal allokere en stump hukommelse og initialisere den selv. Sålænge det er simple arrays osv. er forskellen nok ikke specielt stor, men hvis du bruger egne datastrukturer kan du straks mærke det.
Du skal ligeledes selv frigøre hukommelsen, da du i C ikke har nogle destruktorer (da du ikke har klasser).

Sært at du nævner PHP i denne sammenhæng. PHP er sit helt eget sprog, men det er rigtig nok at syntaksen ligner C/C++/Java/JavaScript (og sikkert også andre).
PHP er jo ikke et rigtigt programmeringssprog, det er et scriptsprog, og bør derfor ikke sammenligned med hverken C eller C++, selv hvis syntaksen var 100% den samme.

Der er dog nogle ting, der ikke umiddelbart er mulige med C, f.eks. polymorfi.
Avatar billede stringbuffer Nybegynder
25. februar 2003 - 01:41 #9
PHP har forresten noget, der hedder klasser, men de er nok mere hvad structs er blevet til i C++
Avatar billede arne_v Ekspert
25. februar 2003 - 08:21 #10
To kommentarer (til de iøvriget meget rigtige betratgninger):

cout er i ANSI C++ compilere erklæret i iostream ikke i iostream.h

pendenten i ren C er stdio.h (gode gamle printf !)
Avatar billede stringbuffer Nybegynder
25. februar 2003 - 14:12 #11
Jep, og (f)printf er fanme nemmere og mere elegant at bruge end << operatoren.
Avatar billede arne_v Ekspert
25. februar 2003 - 14:25 #12
Til de simple typer er printf dejlig.

Men << og >> giver mulighed for at definere dem for
sine egne klasser.
Avatar billede tson Nybegynder
25. februar 2003 - 14:33 #13
Et par kommentarer:

1. C++ er ikke et OO sprog, men et multiparadigme sprog. Du kan selv vælge om du vil kode proceduralt, objekt orienteret eller om du ville vride alt til templates. En styrke og en enorm ulempe.

2. (f)printf er ikke nær så elegant som iostreams. Du kan selv override stream operatoren og bestemme hvordan dine objekter skal streames. Desuden kan du streame til filer, netværk, zip filer osv osv. Desuden er iostreams typestærke, hvilket (f|s)printf ikke er hvorfor du kan lave noget være rod hvis din parameter liste ikke passer til din format streng.

3. Polymorfi er nemt at forklare: Det betyder i alt sin enkelthed at du får kaldt den metode der er knyttet til netop den instans du kalder metoden på uanset om du håndtere objektet via en pointer eller en reference til en base-klasse. For at udnytte dette skal du erklære dine metoder virtuelle


4. Angående tidligere forklaring om forskellen på struct og class så er den forkert. Den angivede forskel er forskellen mellem en C struct og en C++ class(/struct). I C++ er en struct og en class fuldstændig detsamme bortset fra at default acccessibility i en struct er public, mens den er private i en class, og at nedarvning fra en struct default er public, mens det default er private for en class.

Altså er det her det samme:

struct MyClass {
  MyClass() {}
  int myMethod();
private:
  int a;
};

class MyClass {
public:
  MyClass() {}
  int myMethod();
private:
  int a;
};

5: Du kan godt lave polymorfi i C ved at bruge funktions pointere og gemme dem i din struct, så forskellen er ikke så meget ved tilstedeværelsen af polymorfi, som ved den forskel at C ikke har et indbygget klassebegreb.

6. Jeg kan slet ikke forstå at der ikke er nogen der har nævnt templates endnu. C++ er det mest udbredte programmeringssprog med support for parametriserede typer, hvilket betyder at man kan bevare den stærke statiske typing samtidig med at man opnår en del af den fleksibilitet som man har i dynamisk typede sprog. For at indse styrken af templates vil jeg anbefale at man kigger på STL/C++ standard librarys vector template og de algoritmer der findes til at operere på containere. Det viser lidt af styrken. Hvis man så kigger på koden kan man også se lidt af svagheden: Syntaksen for templates er meget "verbose" - og logikken kan let drukne i al den syntaks.
Avatar billede olennert Nybegynder
25. februar 2003 - 14:53 #14
tson, parametriserede typer er dejlige at have.

Men man skal passe rigtig godt på hvis man selv vil lave en template-klasse. At instantiere STL-klasser er ikke det store problem, men du kan komme ud i et frygteligt rod med eksplosion i kodestørrelsen (export ikke implementeret i nogen oversætter jeg kender), og mildt sagt besværlig kode hvis ikke du ved hvad du foretager dig. Som Bjarne Stroustrup selv skulle have sagt det:

"C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, it blows away your whole leg."

Og det gælder efter min bedste overbevisning specielt med templates.
Avatar billede stringbuffer Nybegynder
25. februar 2003 - 15:08 #15
tson <- ad 4. Bortset fra doctorsebs udsagn "CBil og COpel kan bruges som en hver anden type i C (C++)..." hvor er det lige at nogen forklarer noget forkert om forskellen på structs i C og C++ ?
Avatar billede tson Nybegynder
25. februar 2003 - 15:10 #16
stringbuffer,

arne_v skriver: "En struct indeholder members. En class indeholder både members
og methods (=funktioner). Sådan lidt forsimplet."

Den skelnen mellem struct og class er forkert i C++. No big deal.
Avatar billede tson Nybegynder
25. februar 2003 - 15:14 #17
olennert,

Templates er dejlige at have og at skrive :-) Men som jeg skrev er syntaksen efter min smag lidt voldsom. Uden templates er det statiske type system hele tiden i vejen. Jeg skriver Java og C# til daglig og her er der ikke support for parametriserede typer, hvilket betyder at næsten alt andet end den mest banale kode enten skal duplikeres (duplikeret kode er en dødssynd) eller også må man bruge object og en masse casting. Ærgeligt. Iøvrigt er parametriserede typer/templates med i java 1.5, det er vi nogle stykker der glæder os til. :-)
Avatar billede stringbuffer Nybegynder
25. februar 2003 - 15:14 #18
Nå ja, kommer jo an på om man mener struct i C og class i C++, det var sådan jeg oprindeligt opfattede forklaringen.
Avatar billede stringbuffer Nybegynder
25. februar 2003 - 15:23 #19
En sidebemærkning... C# oversat til DLL og kaldt fra ASP.NET er ca 6 gange hurtigere end C++ implementering kørt i CGI-program.... MEGET OVERRASKENDE!!!
Avatar billede stringbuffer Nybegynder
25. februar 2003 - 15:23 #20
Hihi, det var vist lige lovligt langt fra emnet... :)
Avatar billede tson Nybegynder
25. februar 2003 - 15:27 #21
stringbuffer,

Det er efter min mening en æbler til pære sammenligning. Det er unfair at sammenligne en "stateful" afvikling i ASP hvor applikationen bliver liggende i hukommelsen med en CGI afvikling hvor hele applikationen startes forfra for hver request. Det ville være mere fair at sammenligne kald fra ASP.NET til et C# og et C++ COM objekt.

CGI er jo en ekstrem simpel mekanisme hvor et http request omdirigeres til et separat program som startes med stdin og stdout omdirrigeret til processen og hvor eventuelle parametre er tilgængelige via kommandolinie params og/eller environment variable. Det er lidt tungt at starte et helt program for hvert request :-)
Avatar billede arne_v Ekspert
25. februar 2003 - 16:24 #22
stringbuffer>

Hvorfor tror du man har opfundet: ASP, PHP, servlets, JSP, ASP.NET
etc. når man havde CGI ?

Fordi CGI notorisk er langsomt !
Avatar billede stringbuffer Nybegynder
25. februar 2003 - 16:45 #23
tson <- det er ikke afviklingen af hele programmet, men den del af det, hvor der foretages metodekald i et loop. Ja, det er klart at CGI nok er en del langsommere når det kommer til mange HTTP-requests/sekund, men da koden er oversat til maskinkode burde den køre hurtigere under behandlingen af et request, der kræver mange beregninger.
Avatar billede arne_v Ekspert
25. februar 2003 - 16:57 #24
Hvis det kun er selve loopet med kald du har målt, så må C# jo havde
lavet en bedre optimering end C++ i det tilfælde.

Jeg tror dog ikke at du skal generalisere ud fra det.
Avatar billede stringbuffer Nybegynder
25. februar 2003 - 18:09 #25
"så må C# jo havde
lavet en bedre optimering end C++ "

Ja, mon ikke!
Avatar billede stringbuffer Nybegynder
26. februar 2003 - 13:56 #26
Heh, tror jeg fandt en forklaring: det hele skyldes memory management. I .NET (sålænge man ikke overskrider et eller andet tal) koster memory allocation til at inkrementere en pointer, og er derfor hurtig.
Kilde: http://www.codeproject.com/csharp/strings.asp
Avatar billede segmose Nybegynder
26. februar 2003 - 15:49 #27
stringbuffer: hvad er det for noget C++ kode du har oversat.
hvordan har du foretaget måling.
bruger C++ koden externe dll der først skal initialiseres.
er det forskellige metoder der er brugt i C# og C++

Efter min bedste viden skulle C++ med en god optimering kun
være til at slå af mere maskin nære programmeringsprog, som
jeg ikke formoder includere C#.
Det skulle dog være nemt at skrive ikke optimalt C++ kode eller
ikke bruge alle optimeringerne i en god compiler, desværre kan
jeg kun sigde at der er langt imellem at compiler producenterne
lave god optimering.
Avatar billede stringbuffer Nybegynder
26. februar 2003 - 19:20 #28
Har lige lavet en implementering i ren C, den er også langsommere end C#.

Jeg har lavet et bibliotek/komponent til at arbejde med HTML-skabeloner, dvs. indsætte værdier i felter, gentage dokumentsektioner og andre, efter min mening, nyttige funktioner.

Målingen foretages ved at aflæse tid i millisekunder før, og efter kørsel af en løkke, hvor masse kald af komponentets metoder/procedurer foretages.

C# er jo oversat til en .NET .dll, mens C-koden bliver inkluderet i min main-fil, og alle funktioner er defineret som inline.

Både C# og C implementeringen bruger hægtede lister, så der er en del allokering af objekter (tekst og celler i lister).

Jeg er lidt af en performance maniac, og er ret sikker på at min C-kode ikke kan skrives meget mere optimalt.

Her er lidt om test-programmerne:
Der er lavet en HTML-skabelon, hvis kildekode kan hentes på http://zhat.dk/test/advanced.tpl
Output fra et ASP.NET script, der bruger skabelonkomponentet, kan ses på http://zhat.dk/test/csadvanced.aspx

Når der genereres 50 kategorier med 20 spørgsmål hver, og 20 svarmuligheder til hvert spørgsmål, får jeg på min maskine genereret output på under 70 ms fra ASP.NET og det tager ca. 140 ms fra et .exe program lavet i C.
Og det var med optimering slået til i VC6
Avatar billede tson Nybegynder
26. februar 2003 - 20:39 #29
stringbuffer,

Sammenligner du stadig CGI med ASP.NET? Prøv at lave et tomt C++ CGI program som altså returnerere en tom side. Lav også en tom ASP.NET side. Lav så en måling af hvor hurtigt de afvikles. Hermed får du en ide om hvor dyr "opstarten" er for en C++ CGI løsning vs en ASP.NET løsning. Herefter bør du trække disse opstartstider fra dine eksisterende målinger for at lave en sammenligning af afviklingshastigheden for C++ og C# kode.
Avatar billede stringbuffer Nybegynder
26. februar 2003 - 23:31 #30
tson <- jamen vi er slet ikke ueninge mht. at omkostninger ved at starte et CGI-program er større end at loade et ASP-script, men det er ikke det, der er interessant i min situation.
Avatar billede intel4004 Novice
11. august 2020 - 18:58 #31
Du milde - what a trip down memory lane :)

Jeg har nu arbejdet som software ingeniør (og i forskning!) i ~12 år. Har nu oparbejdet en rimelig erfaring med og forståelse af C++ - samt andre sprog (Python). PHP har jeg dog ikke rørt ved i 10 år.

I skal have tak for hjælpen for ~17½ år siden. Det hjalp.

PS: Er meget sjældent herinde.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester