constructor के बिना initialization की आवश्यकता
(consteval.ca)मुझे constructor नहीं चाहिए, लेकिन initialization ज़रूरी है
-
परिचय
- C++ पहली बार सीखते समय, हमने यह सीखा कि compiler किन मामलों में default constructor उपलब्ध कराता है।
- कुछ परिस्थितियों में object के initialize न होने के जोखिम पर विचार करने की ज़रूरत पड़ती है।
-
default initialization और value initialization
T t;default initialization करता है।- अगर
Tclass type है और उसके पास default constructor है, तो वह चलाया जाता है। - अगर
Tarray type है, तो उसके हर element का default initialization होता है। - अन्यथा, कुछ नहीं होता।
- अगर
T t{};value initialization करता है।- अगर
Tclass type है, तो default constructor न होने पर, या user-provided/defaulted/deleted default constructor होने पर, default initialization किया जाता है। - अन्यथा, पहले 0 से initialize किया जाता है और फिर default initialization किया जाता है।
- अगर
Tarray type है, तो उसके हर element का value initialization होता है। - अन्यथा, 0 से initialize किया जाता है।
- अगर
-
default constructor
- यदि default constructor घोषित नहीं किया जाता, तो compiler उसे implicitly घोषित करता है।
- implicitly घोषित default constructor में empty body और empty member initializer list होती है।
- उदाहरण:
struct T { int x; T() = default; }; T t{}; std::cout << t.x << std::endl; // output 0 है
-
implicitly defined default constructor
- अगर default constructor implicitly घोषित हो या explicitly default के रूप में घोषित किया गया हो, तो compiler implicitly defined default constructor उपलब्ध कराता है।
- उदाहरण:
struct T { T(); }; T::T() = default; T t{}; std::cout << t.x << std::endl; // output garbage value है
-
वे मामले जहाँ default constructor उपलब्ध नहीं कराया जा सकता
- जब
Tमें non-static reference member हो - जब
Tमें ऐसा non-static member या non-abstract base class हो जिसे default construct या destruct नहीं किया जा सकता - जब
Tमें default member initializer के बिनाconstnon-static member हो
- जब
-
सही initialization
T t{};list initialization करता है।- list initialization को direct-list-initialization और copy-list-initialization में बाँटा जाता है।
- उदाहरण:
struct S { int a; float b; char c; }; S s{3, 4.0f, 'S'}; // constructor call नहीं होता
-
list initialization और aggregate initialization
- aggregate initialization, list initialization का एक विशेष रूप है, जिसमें class या array के हर element को initializer list के हर element से copy-initialize किया जाता है।
- उदाहरण:
struct A { const int x; }; A a{}; // a.x को 0 से initialize किया जाता है
-
parentheses का उपयोग करके initialization
- parentheses के साथ initialization, direct non-list initialization करता है।
- उदाहरण:
struct T { const int& r; }; T t(42); // t.r, 42 को refer करने वाला reference है
-
सारांश
- initialization के नियम जटिल हैं, लेकिन constructor को सीधे लिखने पर अधिकांश समस्याओं से बचा जा सकता है।
- compiler पर छोड़ने के बजाय, constructor खुद लिखना बेहतर है।
GN⁺ की राय
- यह लेख C++ initialization rules की जटिलता को अच्छी तरह समझाता है।
- C++ के initialization rules को समझना महत्वपूर्ण है, क्योंकि इसका code की stability और performance पर बड़ा असर पड़ता है।
- initialization की समस्याओं से बचने का सबसे अच्छा तरीका है constructor को सीधे लिखना।
- समान प्रकृति की दूसरी भाषा Rust है, जिसमें initialization rules अधिक स्पष्ट हैं।
- नई तकनीक अपनाते समय, initialization rules जैसी बारीकियों को अच्छी तरह समझकर इस्तेमाल करना महत्वपूर्ण है।
1 टिप्पणियां
Hacker News राय
tके initialization का परिणाम 0 होगाtvalue-initialize होता है, औरTमें user-defined default constructor नहीं है, इसलिए object पहले 0-initialize होता है और फिर default constructor कॉल होता हैdefault constructor members को default-initialize करता है, जो value-initialization से अलग है
लगता है GCC भी इससे सहमत है
लेखक यह चूक गया कि वह वास्तव में
xको value-initialize कर रहा हैनियमों की बारीकियाँ जटिल हैं और कभी-कभी अव्यावहारिक भी लगती हैं
default initialization को explicitly व्यक्त करना एक बड़ा सुधार होगा
"std::array<int, 100> = void;"जैसी syntax बेहतर होगीlist initialization और aggregate initialization के बीच कड़ी यह है कि जब list initialization किसी aggregate पर लागू होती है, तो aggregate initialization किया जाता है
एक element का मामला दो या उससे अधिक elements के मामले से अलग तरह से काम करता है
आप अपना constructor लिख सकते हैं, और एक ही element दिए गए tuple या array को initialize कर सकते हैं
जब C++11 initialization list पहली बार आई थी, तब इसे देखकर लगा था कि यह पागलपन है
"I Have No Mouth, and I Must Scream"(1967) का उल्लेखT::T() = default;syntax का उपयोगउम्मीद होती है कि output 0 होगा, लेकिन वास्तव में garbage value आएगी
यह library consumer को library के व्यवहार को बदलने की अनुमति देता है
अगर आप C++ की और जटिलता चाहते हैं, तो C++ FQA की सिफारिश की गई है
ब्लॉग थीम DEC युग के कंप्यूटरों से प्रेरित है, लेकिन साफ़-सुथरी और minimal है
इसे पढ़कर चक्कर आने लगता है
Go और Rust में special constructors नहीं होते, इसलिए बहुत सी चीज़ें सरल हो जाती हैं
क्या कोई ऐसा C++ tool है जो सभी implicit behaviors दिखा सके
यह class के बारे में गलत जानकारी देता है
"T t;"का यह दावा कि यह"कुछ नहीं करता"गलत हैT t;fail होता हैब्लॉग header में DEC front panel है