2009-05-25 12 views
9

क्या सी ++ सरल POD टाइपपीफ पर मूल्य प्रारंभिक करता है?क्या सी ++ पीओडी टाइपपीफ की वैल्यू प्रारंभिक करता है?

मान लिया जाये कि

typedef T* Ptr; 

Ptr() 

करता मूल्य आरंभीकरण और बराबर (T*)0 लिए गारंटी है?

उदा।

Ptr p = Ptr(); 
return Ptr(); 

उत्तर

17

ऐसा करता है। T, T() के लिए T प्रकार की "ऑब्जेक्ट" मानता है और एक रैल्यू अभिव्यक्ति उत्पन्न करता है।

int a = int(); 
assert(a == 0); 

एक ही के लिए फली-कक्षाएं:

struct A { ~A() { } int a; }; 
assert(A().a == 0); 

आप A a() ऐसा नहीं कर सकते के बाद से (बनाता है एक:

struct A { int a; }; 
assert(A().a == 0); 

इसके अलावा कुछ गैर पॉड कक्षाएं कोई उपयोगकर्ता है के लिए सच निर्माता घोषित फ़ंक्शन घोषणा इसके बजाए), बूस्ट में value_initialized है, जो इसके आसपास काम करने की इजाजत देता है, और सी ++ 1x में निम्न, वैकल्पिक, वाक्यविन्यास

0 होगा
int a{}; 

स्टैंडर्ड की सूखी शब्दों में, इस

अभिव्यक्ति टी(), जहां टी एक गैर सरणी पूरा वस्तु के लिए एक सरल प्रकार-विनिर्देशक (7.1.5.2) है की तरह लगता है प्रकार या (संभवतः सीवी-योग्य) शून्य प्रकार, निर्दिष्ट प्रकार का एक rvalue है, जो मूल्य-प्रारंभ

एक typedef-नाम के बाद से एक प्रकार का नाम है बनाता है, जो एक सरल प्रकार-विनिर्देशक है खुद, यह ठीक काम करता है।

+3

मैं इसे समझने की कोशिश कर रहे ड्राफ्ट मानक पर पोरिंग कर रहा हूं।मैं टाइपपीफ के बारे में भूल गया था और यह पता लगाने की कोशिश कर रहा था कि पॉइंटर प्रकार एक साधारण प्रकार का विनिर्देशक (यह नहीं है) हो सकता है, और अब यह समझ में आता है: आप int *() नहीं कर सकते, लेकिन आप कर सकते हैं टी() अगर टी int * के लिए टाइप किया गया है। –

+0

गैर पीओडी प्रकार और पीओडी सदस्यों के बारे में क्या? –

+0

संरचना ए {~ ए() {} int ए; }; एक गैर-पॉड प्रकार है। यदि आपने खुद को एक कन्स्ट्रक्टर पेश किया था, तो "ए" का मान निश्चित रूप से उस निर्माता पर निर्भर करता है। –

2
#include <iostream> 
struct Foo { 
    char bar; 
    char baz; 
    char foobar; 
    // the struct is a POD 
    //virtual void a() { bar='b'; } 
}; 

int main() { 
    Foo o1; 
    Foo o2 = Foo(); 

    std::cout << "O1: " << (int)o1.bar <<" "<< (int)o1.baz <<" "<< (int)o1.foobar << std::endl; 
    std::cout << "O2: " << (int)o2.bar <<" "<< (int)o2.baz <<" "<< (int)o2.foobar << std::endl; 
    return 0; 
} 

आउटपुट:

O1: -27 -98 0

O2: 0 0 0

जोड़ा जा रहा है() से प्रसारित प्रारंभकर्ता सभी पॉड सदस्यों के लिए कहता है।

O1: -44 -27 -98

O2: आभासी विधि Uncomenting के उत्पादन में परिवर्तन -71 -120 4

हालांकि जोड़ने नाशक ~ फू() को दबाने नहीं है प्रारंभिकरण, हालांकि यह गैर-पीओडी ऑब्जेक्ट बनाता है (आउटपुट पहले के समान होता है)।

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