C ++ instance inicializace syntaxe

hlasů
10

Vzhledem k tomu, třída takto:

class Foo {
public:
    Foo(int);

    Foo(const Foo&);

    Foo& operator=(int);

private:
    // ...
};

Jsou tyto dvě linie přesně odpovídá, nebo je tam jemný rozdíl mezi nimi?

Foo f(42);

Foo f = 42;

Edit: zmatený I záležitosti tím, že se Foo konstruktor „explicitní“ v původní otázce. Odstranil jsem to, ale ocení odpovědi.

Také jsem přidal prohlášení kopírovací konstruktor, aby bylo jasné, že kopírování nemusí být triviální operace.

To, co opravdu chci vědět, je, v souladu s normou C ++, bude „Foo f = 42“ přímo volat (INT) konstruktor Foo, nebo kopie konstruktor bude nazýván?

Vypadá to, že fasih.ahmed má odpověď jsem hledal (pokud je to v pořádku).

Položena 16/12/2008 v 21:49
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
19
class Foo {
public:
    Foo(explicit int);

    Foo& operator=(int);
};

To je neplatná. Syntaxe je

class Foo {
public:
    explicit Foo(int);

    Foo& operator=(int);
};

Rozdíl je v tom, že přeměna konstruktor nemůže být použit pro implicitní konverze, když dáte výslovný před ním:

Foo f(10); // works
Foo f = 10; // doesn't work

Výše uvedené nemá nic společného s operátorem přiřazení tam deklarované. To se nepoužívá, protože to je inicializační (pouze konstruktéři jsou použity). Vkládá se použije operátor přiřazení:

Foo f;
f = 10;

A bude používat výchozí konstruktor Foo (ten nepřipouští žádné argumenty).


Edit : Tazatel změnil svůj dotaz na konkrétní způsoby, jak na to, zda

Foo f = 1; // called "copy initialization" 
Foo f(1);  // called "direct initialization"

Jsou stejní. Odpovědí je, že jsou ekvivalentní následující:

Foo f(Foo(1));
Foo f(1);

Tehdy a jen tehdy, pokud by přepočet konstruktér brát int není deklarována pomocí klíčového slova explicit, jinak Prvním z nich je chyba kompilátoru (viz výše). Kompilátor nemá Elide (optimalizace out) dočasný předán do kopírovacího konstruktoru Foo v prvním případě , pokud jsou všechny sémantické omezení jsou stále safisfied, a to i v případě, že kopie konstruktor má vedlejší účinky . Která zahrnuje zejména viditelnou kopírovací konstruktor.

Odpovězeno 16/12/2008 v 22:09
zdroj uživatelem

hlasů
7

Foo f = 42;

Toto prohlášení bude dočasný objekt na hodnotu ‚42‘.

Foo f(42);

Toto prohlášení se přímo přiřadit hodnotu tak jeden méně volání funkce.

Odpovězeno 16/12/2008 v 21:53
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more