PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Initialisierung von Klassen-Membern (C++)


Nasenbaer
2002-10-30, 12:25:00
Hi,
ich hab da mal ne Frage zur Initialisierung von Variablen innerhalb einer Klasse. Und war frage ich mich warum ich eine Preamble nutzen soll.


Warum so wie hier?

class CelestialBody
{
public:
CelestialBody (double mass)
: _mass (mass) // <-- hier
{
std::cout << "Creating celestial body of mass " << _mass << "\n";
}

~CelestialBody ()
{
std::cout << "Destroying celestial body of mass " <<
_mass << "\n";
}

private:
const double _mass;
};


Aber nicht so wie hier?

class CelestialBody
{
public:
CelestialBody (double mass)
{
// und hier
_mass = mass;

std::cout << "Creating celestial body of mass " << _mass << "\n";
}

~CelestialBody ()
{
std::cout << "Destroying celestial body of mass " <<
_mass << "\n";
}

private:
const double _mass;
};


Oder ist es etwa vollkommen egal wie man es macht?

Mfg Nasenbaer

zeckensack
2002-10-30, 12:39:02
Die Präambel ist möglicherweise schneller ...

Jedenfalls bietet sie dem Compiler die Möglichkeit, die Parameter des Constructors ohne den Umweg über den Stack (weil der Constructor auch eine Funktion ist) direkt in den für das Objekt reservierten Speicher zu schieben.

Außerdem kann der Compiler bei mehreren über die Präambel initialisierten Variablen 'out of order' arbeiten, und so wieder ein klein wenig bessere Speicherperformance rausholen. Innerhalb des Constructors darf er das normalerweise nicht.



Gegenfrage: warum heißt deine Membervariable _mass und nicht einfach nur mass?

Das ist nämlich IMO auch noch ein kleiner Vorteil der Präambel.
class
Schmuh
{
public:
Schmuh(int wurzelsepp);

private:
int wurzelsepp;
};

Schmuh::Schmuh(int wurzelsepp):
wurzelsepp(wurzelsepp)
{
//nothing here
}

Wie wir sehen, kann damit eine Membervariable den gleichen Namen haben wie ein Parameter des Constructors, ohne daß man mittels this-> unterscheiden muß. Das fand ich immer ganz angenehm :)

Nasenbaer
2002-10-30, 12:53:21
Originally posted by zeckensack
Gegenfrage: warum heißt deine Membervariable _mass und nicht einfach nur mass?


Weils hier so steht.
http://www.relisoft.com/book/lang/scopes/4inherit.html

Mfg Nasenbaer