• No results found

The rule of three C++

N/A
N/A
Protected

Academic year: 2021

Share "The rule of three C++"

Copied!
14
0
0

Loading.... (view fulltext now)

Full text

(1)

C++

The rule of three

(2)

Kod som alltid genereras

• Det finns tre metoder som alltid tillverkas 1.Kopieringskonstruktorn

2.Tilldelningsoperatorn 3.Destruktorn

• Förutom dessa tillverkas en

(3)

Varför är det så?

• Programmerare förväntar sig kunna göra tilldelningar och värdeanrop.

• A a1; A a2;

• A a3 = a1; // copy-constructor

• a2 = a1; // operator=

• foo(a1);

• void foo(A a) { … // call by value

(4)

Copy constructor

• Koden för kopiekonstruktorn genereras i compile-time.

• Den genererade koden kopierar varje fält. Detta är ofta rätt.

class A {

int x;

std::string s;

std::vector<int> v;

(5)

Copy constructor

• För klasser som använder medlemspekare till dynamiskt allokerat minne blir det fel.

Exempel:

Vektor v1;

{

Vektor v2 = v1;

}

v1

data

v2

data

(6)

Vektor v1;

{

Vektor v2 = v1;

}

När blocket avslutas så destrueras den lokala variabeln v2.

Destruktorn körs.

~Vektor() {

delete [] data;

}

v1

data

v2

data

(7)

copy constructor

• Vad som borde hända är att vi först skapar eget utrymme åt kopians data

• Därefter kopierar data med en

loop. v2

data

v1

data

(8)

operator=

• Precis som för kopiering förväntas tilldelning alltid fungera.

• Koden som man ska skriva är ganska lik kopiekonstruktorns kod.

(9)

Vector v1;

Vector v2;

v2 = v1

v2

data

v1

data

Tilldelning

Om exception kastas när nya minnet ska allokeras så blir v2 odefinierad

?

(10)

v2 = v1

v2

data

v1

data

tmp

Säkrare tilldelning

Även om det kastas exception är v2

(11)

Tilldelning

• Om minnet man redan har räcker.

Kan man skriva över det.

• Var noga med tillståndet

v2

data

v1

data

(12)

Effektiv kopiering

• Använd inte memcpy på objekt i vektorn

ipekare epekare

ipekare epekare

ipekare epekare

ipekare epekare

(13)

Tilldelning

• Specialfall v = v

• Jämför this med parametern v.

… operator=(const Vector & v){

• Det finns ett bra och ett potentiellt mycket långsamt sätt att jämföra

this == &v

*this == v

(14)

Summering

• Ni måste kunna vilka metoder som

konstrueras i compile-time även om ni inte definierat dem

• Ni måste kunna hantera dynamiskt minne

References

Related documents

b) Man bör ha virtuell destruktor när man har dynamiskt allokerat minne (dvs med new) i någon subklass samt då man avser att klassen

Indeed, EC law originally appeared to turn on monistic theory since the ECJ clarified that the provisions in international Agreements must not “vary according to whether

För alla numeriska värden som inte är flyttal finns även en metod för konvertering till någon av baserna 2, 8, 10 eller 16.. Det enda undantagsfel som kan inträffa

Sarrus' rule: The determinant of the three columns on the left is the sum of the products along the solid diagonals minus the sum of the products along the dashed

Regarding the &amp;RXUW¶s view on whether the regulation was adopted properly, the CFI did not accept Article 60 and 301 TEC as a satisfactory legal ground for the adoption of

the misuse of the legal system that might be caused by the state itself i.e., against the power of the state that is in the hands of those who make the laws and who execute the

Moreover, it was concluded that judicial review, independent judiciary, equality before the law, respect for fundamental rights, legality, legal certainty and non-arbitrariness of

Vi sätter då datamedlemmarna som private och skriver egna funktioner som ligger i klassen (medlemsfunktioner) och dessa får påverka våra datamedlemmar på endast det sättet