Håller på att lära mig programmering i c++ (pekare? referenser? header filer?)

Permalänk
Medlem

Håller på att lära mig programmering i c++ (pekare? referenser? header filer?)

Jag har 2 frågor som funderat på, det är saker som jag har svårt att "förstå" hur dem funkar och hur man använder det..
jag går just nu en sommar kurs i programmering i c++ men det finns saker som vår lärare bristfälligt förklarat så att jag förstår

1. Pekare och referenser, hur funkar dem? och vad är skillnaden? vad ska jag tänka på?
jag har förstått att pekare pekar på en plats i minnen istället för på det ev. sparade värdet. men har svårt att greppa vad man använder det till och hur det funkar i kod (man använder -> * <- på nått sätt vet jag)

2. .h, Header filer... what? xD
jag vet att det används, men jag har aldrig riktigt fattat till vad, eller hur dem funkar. vad gör dem? hur skriver man en header fil? (och vad är en vakt? det var något som en programmerings lärare nämnde som jag inte riktigt förstår uppenbarligen) jag har alltid använt en och samma fil förut, delat i funktioner med div return osv.

det här är bara saker jag försöker lära mig just nu, och jag har vänt mig till sweclockers förr och fått _väldigt_ bra svar som gjort att jag fattat. så jag ville fråga mer

Visa signatur

Censorship is for the weak
----------------------------------
i5 6600K @ 4.7 | MSI GeForce GTX 980 Ti 6GB Gaming | ASUS Z170 PRO GAMING | 16GB 2400mhz | 850 EVO 250GB SSD | 2+1+1TB HDD | NH-U12P SE2 | Define S | XL2411Z 144Hz |

Permalänk
Medlem

Nu är jag kass på c++ men iaf..,

1.En pekare är en minnesaddress till ett särskilt objekt. Användbart vid objektorientering, tex
Base * b = new Derived();

En referens är en pekare som alltid måste initieras till ett adress, adressen får sedan inte ändras utan bara själv värdet på datan.

Referenser används ofta vid funkioner tex

void add(int& a,const int& b){
a += b;
}
så om du kör
int a = 3;
add(a,2);

kommer a ha värdet 5 efter.

Permalänk
Medlem

En referens används tex i en funktion när du skickar argumenten! Om du har fuktionen: Fuction(int x) så den int du sätter in där när du använder funktionen kopieras till en ny int i funktionen, dvs plats till en ny int allokeras i minnet och om du nu ändrar på din int i funktionen händer det ingen utanför den.. Använder du en referens, dvs Fuction(int & x) så kopieras den inte, det är samma int i funktion som utanför. Ändrar du värdet i funktionen ändras det utanför.

Exempel:

void Funtion (int x) { x++; } void Funtion2 (int & x) { x++; }

När du kör den första så händer inget eftersom en NY int skapas. När du däremot kör den andra så ökas värdet på din int du skickar in med 1.

Headers är tex Include "Apa.h" där Apa är en ny fil med tex en class (jag har bara använt för klasser). Detta gör att det är lättare att handera stora program

Permalänk
Medlem

Blir en dubbelpost, var ett tag sedan jag posten förre posten ändå.

En pekare är just som du tror en adress till en minnesplats! Om jag vill ha en pekare som heter pekare, skapar jag denna genom:

Int * pekare;

Denna pekare kan ange en minnesadress! Till en int.

Om du vill ange minnesadressen för tex en annan int gör då såhär:

int en_int =5; pekare = & en_int

Du säger nu åt pekare att peka på en_int's minnesadress.

Skriver du nu:

cout << pekare;

så skrivs minnesadressen till en_int ut!

Skriver du:

cout << *pekare

Skrivs värdet av en_int ut

Pekar är rätt bra att ha om du har en lista med tex klasser, istället för att spara en array med klassen så sparar du bara minnesadresserna till dina klasser!

Du kan skapa pekare till vilka objekt som helst, klasser, int, double med mera!

Du kan även allokera egen minnesplats till en int pekare, genom:

int * pekare pekare = new int

Du kan nu tilldela ett värde på platsen där din pekare pekar på:

*pekare = 5;

Permalänk
Medlem

AHA! referens är att man använder en variabel i t.ex. en annan funktion, men man använder den inten som skickades med. alltså... när man annars "skickar med ett värde" så kopieras det värdet till en ny int och måste sen kopieras tillbaka med return.

det är alltså ett effektivare sätt att använda variabler som skickas med in i andra funktioner.
smart spelar ju roll i större spel skulle jag kunna tänka mig. men knappas i en liten hemsnickrad miniräknare. dock så är det ju bra att kunna OFC. i got the idea
tack ni båda

-edit-
tack för förklaringen för pekare! jag förstår ungefär nu det är ju en grund iaf... nu ska jag bara testa det

Headerfiler verkar fortfarande konstigt :/ kan någon visa ett enkelt exempel?

förlåt om ni tycker mina frågor är dumma ^^ men frågar man inget får man inget veta :]

Visa signatur

Censorship is for the weak
----------------------------------
i5 6600K @ 4.7 | MSI GeForce GTX 980 Ti 6GB Gaming | ASUS Z170 PRO GAMING | 16GB 2400mhz | 850 EVO 250GB SSD | 2+1+1TB HDD | NH-U12P SE2 | Define S | XL2411Z 144Hz |

Permalänk
Medlem
Skrivet av Nivius:

AHA! referens är att man använder en variabel i t.ex. en annan funktion, men man använder den inten som skickades med. alltså... när man annars "skickar med ett värde" så kopieras det värdet till en ny int och måste sen kopieras tillbaka med return.

det är alltså ett effektivare sätt att använda variabler som skickas med in i andra funktioner.
smart spelar ju roll i större spel skulle jag kunna tänka mig. men knappas i en liten hemsnickrad miniräknare. dock så är det ju bra att kunna OFC. i got the idea
tack ni båda

-edit-
tack för förklaringen för pekare! jag förstår ungefär nu det är ju en grund iaf... nu ska jag bara testa det

Headerfiler verkar fortfarande konstigt :/ kan någon visa ett enkelt exempel?

förlåt om ni tycker mina frågor är dumma ^^ men frågar man inget får man inget veta :]

Se min post åvan

Här är ett utdrag ur någon jag gjort, här är alla headers jag använder: Tex #include <iosteam> för att inkludera cout eller cin. cout och cin är egentligen funktioner/classer som någon annan har skapat åt dig! Du använder alltså redan headers

using namespace std; #include <iostream> #include <string> #include "Circle.h" //classer här #include "Point.h" #include "Polygon.h" #include "Rectangle.h" #include "Shape.h" #include "Vertex.h" //#include "ShapeList.h" #include "ShapePtr.h" #include <vector> //lite vectorer mm #include <iterator> #include <fstream> #include <algorithm>

Permalänk
Medlem
Skrivet av Nivius:

2. .h, Header filer... what? xD
jag vet att det används, men jag har aldrig riktigt fattat till vad, eller hur dem funkar. vad gör dem? hur skriver man en header fil? (och vad är en vakt? det var något som en programmerings lärare nämnde som jag inte riktigt förstår uppenbarligen) jag har alltid använt en och samma fil förut, delat i funktioner med div return osv.

Header filer brukar användas för att dölja implementationen av klasser och funktioner osv.
då skriver man bara själva deklarationerna av det som ska skapas sen kodar man en separat cpp-file med implementationer detta kan sedan kompileras till lib/dll filer och flyttas mellan olika projekt. men för att komma åt själva implementationerna så används header-filen som en "mall" av vad som ska finnas på lib/dll-filen

Det han pratar om vakt är troligen include guard detta sker med hjälp av macron.
Det finns 2 olika sätt att gör det på vad jag sätt.
På visual studio kan man använda sig av

#pragm once

Men mer vanligt är nog

#ifndef HEADERFILENAME_H #define HEADERFILENAME_H lots of code #endif

Detta används för att i stora projekt så kommer troligen samma header-filer att vara inkluderade.
Det leder då såklart till kollisioner i namn osv. Detta undviks då via include guarden som ser att filen redan är inkluderad och
kommer då säga till compilatorn att skipa all text.

Visa signatur

orka

Permalänk
Medlem
Skrivet av Nivius:

Headerfiler verkar fortfarande konstigt :/ kan någon visa ett enkelt exempel?

En bra övning i att förstå headerfiler lite bättre är att göra ett program med en enkel klassimplementering, allt i en textfil. Sedan lägger du klassdefinitionen i en .h fil och inkluderar den istället. Ungefär så här:

#include <iostream>

[KLASSDEFINITION]

[KLASSIMPLEMENTERING]

int main()
{
// Någon kod för att testa klassen...
return 0;
}

Sedan gör du en separat fil som heter MinKlass.h, där du lägger [KLASSDEFINITION], och ändrar koden till

#include <iostream>
#include "MinKlass.h"

[KLASSIMPLEMENTERING]

(Resten av koden är samma)

Den nya raden med #include tar all text i filen MinKlass.h och klistrar in den precis innan den kompilerar.
OBS! --->Vanligtvis skulle man inte strukturera koden precis så här när man inkluderar egengjorda klasser! Klassimplementeringen skulle även den vara i en egen textfil, och kompileras separat. Det här var bara en övning i att förstå hur .h filer kan användas i samband med #include <---

Permalänk
Datavetare

Du har ju redan fått bra svar, men tänkte ändå ge ett till exempel

int i = 123; int j = 321; int *p = &i; // pointer to int int &r = i; // reference to int const int *pci = &i; // pointer to const int int *const cpi = &i; // const pointer to int // pekare kan "pekas om" p = &j; // pekar nu på "j" i stället för "i" *p = 333; // "j" är nu 333 // även pekare till ett konstant värde kan pekas om pci = &j; cout << *pci << endl; // skriver ut 333 *pci = 444; // denna rad orsakar kompileringsfel då "pci" är en // pekare till en konstant integer // det är inte möjligt att få 'r' att referera till r = j; // detta sätter om värdet på "i" till 333, det flyttar inte // referensen // det är inte heller möjligt att peka om en konstant pekare till // integer då det är själva pekare som är konstant cpi = &j; // kompilerar inte då pekaren är konstant och inte får ändras *cpi = 123; // detta sätter värdet på "i" till 123 igen. // Så i praktiken är en referens och en konstant pekare samma sak // dock har de lite olika syntax

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer