2009-11-19 23 views
50

Bu gerçekten basit bir soru ama C++ yıllardır düzgün bir şekilde yapmadım ve bu yüzden biraz şaşkınım. Ayrıca, internete bakmak, denemek için değil, en kolay şey (en azından benim için) değil.C++ Yeni olmayan nesne

Neden bu, new anahtar sözcüğünü kullanmıyor ve nasıl çalışıyor?

Temel olarak, burada neler oluyor?

CPlayer newPlayer = CPlayer(position, attacker); 

cevap

42

Bu ifade: newPlayer için kopya kurucu kullanılarak kopyalanır

CPlayer newPlayer =...; 

geçici nesne söz:

CPlayer(position, attacker) 

sonra yukarıdaki yapıcı kullanılarak tip CPlayer geçici bir nesne oluşturur . Daha iyi bir yol geçicileri önlemek için aşağıdaki yazmak için:

CPlayer newPlayer(position, attacker); 
+0

Parlak, teşekkürler. –

+5

Aslında derleyici muhtemelen onu optimize edecektir. Bu durumda kopya kurucusu aranmayacaktır. http://stackoverflow.com/questions/1758142/why-copy-constructor-is-not-called-in-this-case – BostonLogan

+4

Bir bildirimdeki ödev, yapıcı sözdizimini kullanmaktan daha az etkili değildir. Ayrı ifadeler olsaydı, zamansallıklarla ilgili sözler doğru olurdu. Bunun özü, bunun bir ücretsiz CPlayer (yığın) için alan ayırmak yerine bir CPlayer (genellikle yığınta) ilan etmesidir. –

31

yukarıda dolayısıyla new gerek yoktur, yığında bir CPlayer nesne oluşturur. Yığında bir CPlayer nesnesi ayırmaya çalışıyorsanız, yalnızca new'u kullanmanız gerekir. Eğer yığın ayırma kullanıyorsanız, kod şu şekilde görünecektir: Bu durumda biz delete eşleşen bir çağrı tarafından temizlenmesi gereken bir CPlayer nesneye bir işaretçi kullanmakta olduğunuz

CPlayer *newPlayer = new CPlayer(position, attacker); 

Bildirimi . Yığın üzerine tahsis edilen bir nesne, kapsam dışına çıktığında otomatik olarak yok edilecektir.

CPlayer newPlayer(position, attacker); 

Yukarıdaki gönderilen sürümü optimize eder derleyici bir sürü zaten ve onu okumak için daha açık:

Aslında yazmak daha kolay ve daha belirgin olurdu.

+0

Bunun doğru olduğunu düşünmüyorum: "Yığın üzerine ayrılan bir nesne, kapsam dışına çıktığında otomatik olarak yok edilecektir." – Valentin

+0

Doğru, "yığın" yazmak değil, "yığın" yazmak istedim. Bunu işaretlediğiniz için teşekkürler. –

+0

Bu konuda katılıyorum. C++ kodunu C koduyla aynı şekilde tutmalıyız. Bu yüzden CPlayer newPlayer (pozisyon, saldırgan); 'CPlayer newPlayer = CPlayer'dan (pozisyon, saldırgan) daha iyidir; bir yığın değişkeni oluşturmak istiyorsanız. – tonga

4

newPlayer dinamik değişken tahsis edilmiş olan, ancak, bir otomatik, değişken-ayrılmış yığını:

CPlayer* newPlayer = new CPlayer(pos, attacker); 

CPlayer newPlayer = CPlayer(pos, attacker); 

newPlayer Normal CPlayer (konum, saldırgan ile yığında ayrılan farklıdır) kurucu çağrısı, her zamanki gibi biraz daha ayrıntılı olsa da, her zamanki gibi

Aynı şeklindeki temelde:

int i = int(3); 
+2

Dikkat edin. Bu bir "kopya başlatma". Bu bir görev değil. – sellibitze

+0

Düzeltilmeye devam ediyorum, bu bir ödev değil; kopya kurucusu bile dahil değildir. Yanıtı buna göre düzenleyin. – digitalarbeiter

+2

Elbette, kopya cetveli (en azından mantıksal olarak) içeriyor. Eğer kopya kopyasını özel yaparsan farkedeceksin. Ardından, bu kopya başlatma işlemi artık çalışmayacaktır. C++ standardı, derleyici kopyayı en iyi duruma getirdiğinde bile erişilebilir bir kopya cetveli gerektirir. – sellibitze

8
CPlayer newPlayer = CPlayer(position, attacker); 

Bu hat tipi CPlayer yeni bir yerel nesne oluşturur. İşlev benzeri görünümüne rağmen, bu sadece CPlayer'ın yapıcısını çağırır. Tempolar veya kopyalama yapılmıyor. NewPlayer adlı nesne, içine eklendiği kapsam kadar uzun sürebilir. C++ Java olmadığı için new anahtar sözcüğünü kullanmazsınız.

CPlayer* newPlayer = new CPlayer(position, attacker); 

Bu çizgi yığını bir CPlayer nesnesi oluşturur ve ona işaret etmek newPlayer adlı bir işaretçi tanımlar. Nesne, birisi delete s kadar yaşayacaktır.

+2

"Hiçbir tempotations veya copying dahil" - Bu tam olarak doğru değil. Böyle bir garanti yoktur. Ama her iyi derleyici kopyayı seçmelidir. – sellibitze