2011-09-10 20 views
5

Yapıcıdaki başlatma listelerinin kullanılmasının avantajının, sınıf türü nesnelerin fazladan kopyası olmayacağı olduğunu duydum. Fakat sınıf T yapıcısında aşağıdaki kod için ne anlama geliyor? Ödeve yorum yaparsam ve başlatma listelerini kullanırsam fark ne olur?Kurucudaki başlangıç ​​listeleri

#include <iostream> 
using std::cout; 
using std::endl; 
using std::ostream; 

class X { 

public: 

    X(float f_x = 0, float f_y = 0):x(f_x), y(f_y) {} 


    ~X() {} 

    X(const X& obj):x(obj.x), y(obj.y) {} 

    friend ostream& operator << (ostream &os, X &obj); 

private: 
    float x; 
    float y; 
}; 

ostream& operator << (ostream &os, X &obj) 
{ os << "x = " << obj.x << " y = " << obj.y; return os;} 

class T { 

public: 

    T(X &obj) : x(obj) { /* x = obj */ } 

    ~T() { } 

    friend ostream& operator << (ostream &os, T &obj); 

private: 

    X x; 

}; 

ostream& operator << (ostream &os, T &obj) 
{ os << obj.x; return os; } 

int main() 
{ 
    X temp_x(4.6f, 6.5f); 

    T t(temp_x); 

    cout << t << endl; 

} 
+0

emin değil ilgiliyse sorunuzun, ama muhtemelen T (X const & obj) isteyecek. –

+0

@ K-ballo: Evet, unuttum teşekkürler. – user767451

cevap

6

Tam olarak söylediğin şey bu. Başlatıcı listesini kullanmazsanız, varsayılan kurucu ilk önce çağrılır ve daha sonra görev operatörü aranır.

Örneğinizde, bu nispeten iyi huyludur (derleyici bunu bile optimize edebilir). Ancak diğer durumlarda, başlatıcı listesinden kaçınmak mümkün değildir. X'un bir kamu görevlendirmesi operatörünün olmadığını düşünün.

+0

Ah, kodumdaki bu etkiyi fark etmek için aşırı yüklenmiş atama operatörü işlevini kaçırıyordum. Kopya kurucusu ile karıştırdım! – user767451

2
T(X &obj) : x(obj) {} 

T(X &obj){ x = obj; } 

varsayılan bir x inşa ederken sadece çok miktarda, obj gelen x inşa kopyalamak obj alınan değerler ile değiştirecektir.

Bir üye nesne oluşturmayı planlıyorsanız, bunu başlatma listesinde yapmalısınız.

5

sonra Ataması, kullanıyorsanız:
x olacak varsayılan sonra obj ile atanan &
ilk inşa edilmiştir.
x inşa edilmiş ve obj ile başlatılır: o zaman Üye başlatıcısı listesini kullanırsanız

maliyet Standart İnşaat + Atama


olduğunu.

maliyettir, İnşaat'ın sadece