2015-12-31 6 views
8

मैं स्कूल कोड के लिए मैंने जो कुछ कोड लिखा था, उसे ब्राउज़ कर रहा था, कि एक करीबी निरीक्षण में मुझे अजीब लग रहा था।ऑब्जेक्ट्स के वेक्टर को वापस स्ट्रिंग को धक्का देना

class Foo { 
public: 
    Foo(std::string s) : _s(s) {} 
private: 
    std::string _s; 
}; 

int main() { 
    std::string str = "Hiyo"; 

    std::vector<Foo> f; 
    f.push_back(str); // Compiles. Weird to me though. 
    f.push_back(Foo(str)); // Predictably, this compiles as well. 

    return 0; 
} 

क्यों push_back करने के लिए पहली कॉल एक वैध बयान है, भले ही str एक Foo नहीं है: मैं एक वर्ग नीचे एक के समान था?

उत्तर

16

कक्षा Foo एक गैर स्पष्ट ctor प्रकार std::string (अर्थात Converting constructor) है, जो यह परोक्ष एक std::string से casted किया जा सकता है इसका मतलब है में से एक तर्क ले जा रहा है। यदि आप ctor explicit बनाने

f.push_back(str);  // implicit casting from std::string to Foo 
f.push_back(Foo(str)); // explicit casting from std::string to Foo 

ध्यान दें, अंतर्निहित कास्टिंग प्रतिबंधित कर दिया जाएगा।

class Foo { 
public: 
    explicit Foo(std::string s) : _s(s) {} 
// ~~~~~~~~ 
private: 
    std::string _s; 
}; 

और फिर

f.push_back(str);  // invalid now 
f.push_back(Foo(str)); // still valid 
+1

यह स्वीकार्य उत्तर होना चाहिए क्योंकि यह 'स्पष्ट' के बारे में बात करता है – CinCout

7

पहला पुश बैक स्वचालित रूप से Foo ऑब्जेक्ट को string ऑब्जेक्ट दिया गया है; आपके प्रारंभकर्ता सूची के माध्यम से।

(एक Foo वस्तु की उम्मीद, एक स्ट्रिंग हो जाता है: एक Foo वस्तु एक भी तार के साथ प्रारंभ किया जा सकता है हाँ, अपने प्रारंभकर्ता सूची एक तत्व है और उद्देश्य यह है कि तत्व से आरंभ नहीं हो जाता)।

जानकारी के लिए, उदाहरण के लिए: देखने .:

+2

प्रारंभकर्ता सूची महत्वपूर्ण नहीं होना चाहिए। इसके बिना अभी भी संकलित होगा। – ChrisD

+1

क्या होगा यदि 'Foo (std :: string s) '' स्पष्ट' है? – CinCout

2

मुझे लगता है कि पहले पुशबैक में यह automaticaly है Foo(str) तो इसके मूल रूप से था ही initializes!

संबंधित मुद्दे