Enklare konstruktion av objekt

Tre saker som gjorts enklare när det gäller konstruktion av objekt. Icke-statiska medlemmar kan initialiseras direkt där de deklareras i klassdefinitionen, konstruktorer kan delegera till andra konstruktorer och konstruktorer kan även ärvas. Det senare är inte implementerat än i gcc så det får vi återkomma till. För de två andra, läs på.

Initialisering av icke-statiska medlemmar

Tidigare så fick man initialisera icke-statiska medlemmar i konstruktorn. Nu kan de även initialiseras direkt där de deklareras i klass definitionen så här:

class Initialized
{
  public:
    Initialized();
    Initialized(const string& initialValue);

  private:
    string initializedMember = "Hey I'm initialized right here!";
}

Detta är nästan så klart att man inte behöver säga något mer. Java-programmerare kan förundras över vilka villkor som C++-programmerare har behövt arbeta under men nu är det slut med det.

I exemplet fick man tidigare initialisera medlemmen i bägge konstruktorerna. Förutom att det var en extra börda så blev det inte tydligt och var en källa till fel. Gemensam initialisering i flera konstruktorer ledde då ibland till att den koden bröts ut i en speciell initialiseringsmetod enbart till för att gruppera den gemensamma initialiseringen. Detta behövs alltså inte längre. Medlemmar som skall initialiseras på samma sätt oberoende av vilken konstruktor som används definieras med fördel på detta sätt.

Delegering av konstruktion

På liknande sätt som för initialiseringen av medlemmar fungerar delegering av konstruktion till att reducera behovet av extra kod. Delegering fungerar som så att en konstruktor kan i sin initialiseringslista anropa en annan konstruktor och låta den utföra konstruktionen av objektet. Java-programmerare känner åter igen sig här.

På det visat kan alla kod för att skapa ett objekt läggas i en konstruktor som sedan används av andra konstruktorer. Syntaxen är densamma som för initialiseringslistan. Så här:

class Delegation
{
  public:
    Delegation(const string& initialValue) { <complex initialization code> };
    Delegation() : Delegation("Initial value") { ... };
}

Standardkonstruktorn av Delegation använder sig av konstruktorn som tar en parameter och anropar den i initialiseringslistan. På det viset kan all kod för att skapa objekt av typen Delegation ligga i en konstruktor.

Notera att när delegering används så kan inte medlemmar initialiseras genom initialiseringslistan. Den konstruktor som får jobbet får också göra hela jobbet. Annan tilldelning får vänta till kroppen.

Publicerad i C/C++

Kategorier

WP to LinkedIn Auto Publish Powered By : XYZScripts.com