int, double, QImage, QLedMatrix, QWidget och MyWindow är exempel på datatyper. När du börjar en statement med en datatyp betyder det att du vill göra en deklaration av ett namngivet utrymme för något av den datatypen. Hur länge detta utrymme är ditt beror på i vilket scope deklarationen görs.
Kod: Markera allt
int raknare;
När du sätter en * efter datatypnamnet betyder det att det inte är typen i sig du vill ha utrymme för utan en pekare till något av den typen. Så:
Kod: Markera allt
QImage* nisse;
new är en operator som skapar ett objekt/utrymme i ett globalt scope och ger dig pekaren till det tillbaka. Om du inte tar hand om pekaren så finns objektet i sjön men du kommer inte åt det. Tar du hand om pekaren så kan du skicka den hit och dit och komma åt objektet i hela det globala scopet. Objektet finns där tills du gör delete på det. Om du då har skickat runt pekare kors och tvärs så kommer dom att fortsätta peka på något som inte lägre är reserverat för dig och du kommer fortare än kvickt att bli överraskad av att något helt annat ligger där. Att skapa saker med new kräver alltså tungan i rätt mun.
C++ ger dig tillgång till den konstruktion som heter klasser. En klass är en inkapsling av kod och det data som den opererar på. Till skillnad från enkla typer som int, float och enum har klasser konstruktorer. Det är kod som körs när objektet skapas. Konstruktorn kan kräva inparametrar.
Kod: Markera allt
QImage img1(":/erik8.png");
Kod: Markera allt
img1p = new QImage(":/erik8.png");
Scope avgränsas normalt av {} men i vissa fall av ; . Klassdeklarationen ger dig ett extra scope som omfattar alla metoder deklarerade i klassen.
Kod: Markera allt
{
int a; //deklaration av a. Synlig till rad 15
{
int b; //deklaration av b. Synlig till rad 5
}
//Här finns alltså a men inte b
for (int i=0;i<3;i++)
{
// Här finns i
}
for (int j=0;j<3;i++); //Obs elakt ;
{
// Här finns inte j!
}
}
Kod: Markera allt
int* a=new int;
delete a;
//Här pekar fortfarande a på det utrymme som reserverades.
Som du ser har jag satt * intill datatypnamnet och inte intill variabelnamnet. Jag personligen tycker det är tydligare. Det är ju inget speciellt med variabeln. Det är datatypen som är "manipulerad". Andra tycker tvärt om.
Jämför kodraderna. I ena fallet finns inget typdeklaration först. Du har redan variabeln img1p som kommer någon annan stans ifrån (klassdeklarationen). I andra fallet börjar raden med datatypen QLedMatrix så där blir alltså en deklaration.Varför blir inte img1p local variabel pss som matrix12 med anropet
Jag tycker att det är mycket olyckligt att C och C++ inte tydligare visar vad som är deklarationer och vad som är exekverbara statements. Men så är jag ju en riktig Ada-kramare också. Men i båda språken kan ju även en deklaration leda till att kod exekveras (konstruktorer) så Ada är kanske inte jättemycket bättre på den punkten. Eller jo det är det . Eftersom det är så otydligt vad som är typer och variabler i C++ brukar man använda konventioner för versaler/gemener för att skilja dom åt. Ofta ges typer namn som börjar med en versal medan variabler har namn som startar med en gemen. Dessutom ges ofta variabler namn som tipsar om typen. Lästips: https://en.wikipedia.org/wiki/Hungarian_notation