2010-11-06 17 views
12

böyle tanımlanan sınıf iki kurucular ile foo düşünün:C++'da işaretçilerden bool'e neden dolaylı bir tür dönüşüm var?

class foo 
{ 
public: 
    foo(const std::string& filename) {std::cout << "ctor 1" << std::endl;} 
    foo(const bool some_flag = false) {std::cout << "ctor 2" << std::endl;} 
}; 

bir dize ile sınıf örneğini ve denir yapıcı tahmin?

foo a ("/path/to/file"); 

Çıktı:

seni bilmem ama ben programlama tarihinin en sezgisel davranış olduğunu bulmuyorum 2 ctor. Bahse girerim bunun için akıllıca bir sebep var ve bunun ne olabileceğini bilmek isterim.

+2

olası yinelemesi [Neden derleyici, L örtülü tipte yazım için boole over dizisini seçer? ”(Http://stackoverflow.com/questions/316181/why-does-the-compiler-choose-bool-over -string-for-implicit-typecast-of-l) – Hasturkun

+2

Yine başka bir benzer soru: [İşlev/Yöntem Aşırı yükleme C++: Veri türü karışıklık?] (http://stackoverflow.com/questions/1636181/function-method-overloading- c-data-type-confusion) – Athari

+0

Üzgünüz. Arama yaptım (bir SSS olacağını düşündüğüm gibi), ama sorunun bu konuyla ilgili olduğunu ima eden bir başlık ile herhangi bir soru bulamadım. – Oystein

cevap

9

Bu

void f(T* ptr) { 
    if (ptr) { 
     // ptr is not NULL 
    } 
} 

Bir const char* yapıcı yapmalıdır yazmak için C derece yaygındır.

+7

Şüphesiz 'if (! Ptr) dönüşü demek istiyorsun' '? :) Tüm fonksiyonumuzun bloktan daha fazla iç içe geçmesini istemeyiz. – GManNickG

+3

@GMan: Çirkin bir şekilde, aslında bu tür bir dönüş beyanını * savunmak zorunda kaldım, çünkü çoklu geri dönüş ifadelerinin doğal olarak kafa karıştırıcı ve zor takip edilmesine karar verilen güçler ve kodlama standartlarına olan inancı destekledi. – Cascabel

+2

Bir "char *" parametresi öneremezse, bunu ekleyebilirim:/ –

1

İki sorunu karıştırıyorsunuz. Bunlardan biri "blah" dolaylı olarak string'a dönüştürülebilir ve diğeri const char* örtük olarak bir boole dönüştürülebilir. Derleyicinin gerekli dönüşümlerin toplam miktarını en aza indirgeyen örtülü dönüşüme gittiğini görmek çok mantıklı.

+0

Sadece karşılaştığımızın ortak olacağını düşündüğüm bir örnek veriyordum - sorum, _why_ 'bool' için örtülü tip dönüşümü işaretçilerle gerçekleşiyordu. – Oystein

2

Foo yapıcısına char * aktarıyorsunuz. Bu, dolaylı olarak bir boole (tüm işaretçiler gibi) veya bir std :: dizesine dönüştürülebilir. Derleyicinin bakış açısına göre, ilk dönüşüm, kullanıcı tarafından sağlanan dönüşümler (std :: string (char *) kurucusu) üzerinden standart dönüşümleri (yani, işaretçiyi gösterici) yana aldığından, ikinci olandan "daha yakındır".

İlgili konular