সি ++ শ্রেণির সদস্যগণ যদি আমি এটি স্পষ্টভাবে না করি তবে কীভাবে প্রাথমিককরণ করবেন?


158

ধরুন আমি ব্যক্তিগত memebers সঙ্গে একটি ক্লাস আছে ptr, name, pname, rname, crnameএবং age। আমি যদি সেগুলি নিজেই আরম্ভ না করি তবে কী হবে? এখানে একটি উদাহরণ:

class Example {
    private:
        int *ptr;
        string name;
        string *pname;
        string &rname;
        const string &crname;
        int age;

    public:
        Example() {}
};

এবং তারপরে আমি এটি করি:

int main() {
    Example ex;
}

প্রাক্তন সদস্যদের কীভাবে সূচনা করা হয়? পয়েন্টার দিয়ে কি হয়? কি stringএবং intপেতে ডিফল্ট কনস্ট্রাকটর সঙ্গে 0-intialized string()এবং int()? রেফারেন্স সদস্য সম্পর্কে কী? কনস্টের রেফারেন্স সম্পর্কে কি?

আমার আর কী জানা উচিত?

এই কেসগুলি কভার করে এমন টিউটোরিয়ালটি কি কেউ জানেন? কিছু বইয়ে হয়তো? আমার প্রচুর সি ++ বইয়ের লাইব্রেরিতে অ্যাক্সেস রয়েছে।

আমি এটি শিখতে চাই যাতে আমি আরও ভাল (বাগ ফ্রি) প্রোগ্রাম লিখতে পারি। কোন প্রতিক্রিয়া সাহায্য করবে!


3
বইয়ের সুপারিশের জন্য, স্ট্যাকওভারফ্লো.com
মাইক সিমুর

মাইক, ow, আমি বোঝাতে চাই এমন কোনও বইয়ের অধ্যায়। পুরো বই না! :)
বোড্যাসিও

আপনি যে ভাষায় প্রোগ্রাম করতে চান তা পুরো বইটি পড়া সম্ভবত ভাল ধারণা হবে। এবং যদি আপনি ইতিমধ্যে একটি পড়েন এবং এটি এটি ব্যাখ্যা না করে, তবে এটি খুব ভাল বই ছিল না।
টাইলার ম্যাকহেনরি

2
স্কট মায়ার্স (একটি জনপ্রিয় প্র-প্রো সি ++ পরামর্শ গুরু) কার্যকর সি ++ তে বলেছেন , "নিয়মগুলি জটিল - আমার মতে এটি মুখস্থ করার পক্ষে মূল্যবানও জটিল .... নিশ্চিত করুন যে সমস্ত কনস্ট্রাক্টর অবজেক্টের সমস্ত কিছুর সূচনা করেন।" সুতরাং তার মতে, "বাগ ফ্রি" কোড লেখার সহজ উপায় (বিধি মুক্ত) কোডটি নিয়মগুলি মুখস্থ করার চেষ্টা করা নয় (এবং বাস্তবে তিনি সেগুলি বইতে রাখেন না ), তবে স্পষ্টভাবে সমস্ত কিছু শুরু করার জন্য। নোট করুন, তবে, আপনি নিজের কোডেও এই পদ্ধতিটি গ্রহণ করলেও, আপনি এমন লোকদের দ্বারা লিখিত প্রকল্পগুলিতে কাজ করতে পারেন, যাতে নিয়মগুলি এখনও মূল্যবান হতে পারে।
কাইল স্ট্র্যান্ড

2
@ টাইলারএমসি হেনরি সি ++ এর উপর কোন বইগুলিকে আপনি "ভাল" মনে করেন? আমি সি ++ তে বেশ কয়েকটি বই পড়েছি তবে এগুলির কোনওোটাই পুরোপুরি ব্যাখ্যা করেনি। আমার আগের মন্তব্যে উল্লিখিত হিসাবে, স্কট মায়ারস কার্যকর সি ++ এ সম্পূর্ণ বিধি প্রদান করতে স্পষ্টভাবে প্রত্যাখ্যান করে । আমি মায়ার্সের কার্যকরী আধুনিক সি ++ , ডিউহার্স্টের সি ++ সাধারণ জ্ঞান এবং স্ট্রসট্রাপের সি ++ এর একটি ভ্রমণও পড়েছি । আমার স্মৃতিতে তাদের কেউই সম্পূর্ণ বিধিগুলি ব্যাখ্যা করেনি। অবশ্যই আমি স্ট্যান্ডার্ডটি পড়তে পারতাম, তবে আমি খুব কমই সেই "ভাল বই" বিবেচনা করতাম! : ডি এবং আমি আশা করি স্ট্রস্ট্রুপ সম্ভবত এটি সি ++ প্রোগ্রামিং ল্যাঙ্গুয়েজে ব্যাখ্যা করেছেন ।
কাইল স্ট্র্যান্ড

উত্তর:


206

সুস্পষ্ট আরম্ভের পরিবর্তে, ক্লাসে সদস্যদের সূচনা ফাংশনগুলিতে স্থানীয় ভেরিয়েবলের সূচনা করার জন্য একইভাবে কাজ করে।

জন্য বস্তু , তাদের ডিফল্ট কন্সট্রাকটর বলা হয়। উদাহরণস্বরূপ, এর জন্য std::string, ডিফল্ট কনস্ট্রাক্টর এটি একটি খালি স্ট্রিংয়ে সেট করে। যদি অবজেক্টের ক্লাসে ডিফল্ট কনস্ট্রাক্টর না থাকে তবে আপনি স্পষ্টভাবে এটি আরম্ভ না করলে এটি একটি সংকলন ত্রুটি হবে।

জন্য আদিম ধরনের (পয়েন্টার, একটি ints, ইত্যাদি), তারা না সক্রিয়া - তারা ধারণ করে যাই হোক না কেন নির্বিচারে আবর্জনা পূর্বে মেমরি অবস্থানে হতে ঘটেছে।

জন্য রেফারেন্স (যেমন std::string&), এটা অবৈধ তাদের আরম্ভ করতে না, এবং আপনার কম্পাইলার অভিযোগ এবং এই ধরনের কোড কম্পাইল করতে অস্বীকার করবে। রেফারেন্স সর্বদা শুরু করা উচিত।

সুতরাং, আপনার নির্দিষ্ট ক্ষেত্রে যদি সেগুলি স্পষ্টভাবে শুরু না করা হয়:

    int *ptr;  // Contains junk
    string name;  // Empty string
    string *pname;  // Contains junk
    string &rname;  // Compile error
    const string &crname;  // Compile error
    int age;  // Contains junk

4
+1 টি। এটি লক্ষণীয় যে, কঠোর স্ট্যান্ডার্ড সংজ্ঞা অনুসারে, আদিম ধরণের উদাহরণ সহ বিভিন্ন ধরণের জিনিস (স্টোরেজের যে কোনও অঞ্চল) সমস্ত বিবেচিত বস্তু হিসাবে বিবেচিত হয়
stinky472

7
"যদি অবজেক্টের ক্লাসে ডিফল্ট কনস্ট্রাক্টর না থাকে তবে আপনি যদি স্পষ্টভাবে এটি আরম্ভ না করেন তবে এটি একটি সংকলন ত্রুটি হবে" ভুল ! যদি কোনও শ্রেণীর ডিফল্ট কনস্ট্রাক্টর না থাকে তবে এটি একটি ডিফল্ট ডিফল্ট কনস্ট্রাক্টর দেওয়া হয় যা খালি।
উইজার্ড

19
@ উইজ আমি মনে করি তিনি আক্ষরিকভাবে বোঝাতে চেয়েছিলেন যে 'অবজেক্টটিতে যদি কোনও ডিফল্ট কনস্ট্রাক্টর না থাকে' যেমনটি কোনও উত্পন্নর মতো হয় না, যা ক্লাস স্পষ্টভাবে ডিফল্ট ব্যতীত অন্য কোনও নির্মাণকারীকে সংজ্ঞায়িত করে (কোন ডিফল্ট কর্টার উত্পন্ন হবে না)। যদি আমরা খুব প্যাডান্যাটিক পাই তবে আমরা সম্ভবত সাহায্যের চেয়ে আরও বেশি বিভ্রান্ত হব এবং টাইলার আমার সম্পর্কে তার প্রতিক্রিয়ায় এই সম্পর্কে একটি ভাল বক্তব্য রেখেছিলেন।
stinky472

8
@ উইজ-লুজ আমি বলব যে এতে fooএকজন কনস্ট্রাক্টর রয়েছে, এটি কেবল অন্তর্নিহিত। তবে এটি আসলে শব্দার্থবিদ্যার যুক্তি।
টাইলার ম্যাকহেনরি

4
আমি "ডিফল্ট কনস্ট্রাক্টর" কে কনস্ট্রাক্টর হিসাবে ব্যাখ্যা করি যা আর্গুমেন্ট ছাড়াই কল করা যায়। এটি হয় আপনি নিজেই সংজ্ঞায়িত হন বা সংকলক দ্বারা সুস্পষ্টভাবে উত্পন্ন। সুতরাং এর অভাব মানেই না নিজের দ্বারা সংজ্ঞায়িত বা উত্পন্ন। বা এটি আমি এটি দেখতে।

28

প্রথমে একটি মেমো-ইনিশিয়ালাইজার-তালিকা কী তা আমাকে ব্যাখ্যা করতে দিন । একজন Mem-সূচনাকারী-তালিকা একটি কমা দ্বারা পৃথক তালিকা Mem-সূচনাকারী এস, যেখানে প্রতিটি Mem-সূচনাকারী একজন সদস্য নাম দ্বারা অনুসরণ (, একটি দ্বারা অনুসরণ অভিব্যক্তি-তালিকা , একটি দ্বারা অনুসরণ )অভিব্যক্তি-তালিকা কিভাবে সদস্য নির্মাণ করা হয়। উদাহরণস্বরূপ, ইন

static const char s_str[] = "bodacydo";
class Example
{
private:
    int *ptr;
    string name;
    string *pname;
    string &rname;
    const string &crname;
    int age;

public:
    Example()
        : name(s_str, s_str + 8), rname(name), crname(name), age(-4)
    {
    }
};

Mem-সূচনাকারী-তালিকা ব্যবহারকারী-সরবরাহকৃত, নো আর্গুমেন্ট কন্সট্রাকটর হয় name(s_str, s_str + 8), rname(name), crname(name), age(-4)। এই মেম-ইনিশিয়ালাইজার-তালিকার অর্থ এই যে nameসদস্যটি কনস্ট্রাক্টর দ্বারা আরম্ভ করা হয় std::stringযা দুটি ইনপুট পুনরাবৃত্তি গ্রহণ করে , rnameসদস্যটি একটি রেফারেন্স দিয়ে আরম্ভ করা হয় name, crnameসদস্যটি একটি কনস্ট-রেফারেন্স দিয়ে আরম্ভ করা হয় name, এবং ageসদস্যটি মান দিয়ে আরম্ভ করা হয় -4

প্রতিটি কন্সট্রাক্টরের নিজস্ব মেম-ইনিশিয়ালাইজার-তালিকা থাকে এবং সদস্যরা কেবলমাত্র একটি নির্ধারিত আদেশে (মূলত ক্রম অনুসারে সদস্যগণ ঘোষিত হয়) আদেশে আরম্ভ করা যেতে পারে। সুতরাং, সদস্যদের Exampleকরতে পারেন শুধুমাত্র অনুক্রমে সক্রিয়া পারে: ptr, name, pname, rname, crname, এবং age

আপনি যখন কোনও সদস্যের কোনও মেম-ইনিশিয়ালাইজার নির্দিষ্ট না করেন , তখন সি ++ স্ট্যান্ডার্ড বলে:

সত্তা যদি শ্রেণিবদ্ধ ... এর ননস্ট্যাটিক ডেটা সদস্য হয় তবে সত্তাটি ডিফল্ট-ইনিশিয়ালাইজড (8.5)। ... অন্যথায়, সত্তাটি আরম্ভ করা হয়নি।

এখানে, কারণ nameশ্রেণীর ধরণের একটি ননস্ট্যাটিক ডেটা সদস্য, এটির জন্য মেম-ইনিশিয়ালাইজার-তালিকায় কোনও প্রারম্ভিক nameনির্দিষ্ট না করা থাকলে এটি ডিফল্ট-আরম্ভ হয় । অন্যান্য সমস্ত সদস্যের Exampleক্লাসের ধরণ নেই, তাই তাদের আরম্ভ করা হয়নি।

স্ট্যান্ডার্ড যখন বলে যে এগুলি আরম্ভ করা হয়নি, তার অর্থ হল যে তাদের কোনও মান থাকতে পারে। সুতরাং, কারণ উপরের কোডটি আরম্ভ করা হয়নি pname, এটি যে কোনও কিছু হতে পারে।

মনে রাখবেন যে আপনাকে এখনও অন্যান্য বিধি অনুসরণ করতে হবে, যেমন যে নিয়মটি উল্লেখগুলি সর্বদা শুরু করা উচিত। রেফারেন্স আরম্ভ না করা এটি একটি সংকলক ত্রুটি।


আপনি যখন খুব বেশি ইন্টার্নাল না দেখিয়ে কঠোরভাবে ঘোষণা (ইন .h) এবং সংজ্ঞা (ইন .cpp) আলাদা করতে চান তখন সদস্যদের সূচনা করার সেরা উপায় এটি।
ম্যাথিউউ

12

আপনি ডেটা সদস্যদের যে মুহূর্তে তাদের ঘোষণা করেছেন তাও আপনি সূচনা করতে পারেন:

class another_example{
public:
    another_example();
    ~another_example();
private:
    int m_iInteger=10;
    double m_dDouble=10.765;
};

আমি এই ফর্মটি বেশ একচেটিয়াভাবে ব্যবহার করি, যদিও আমি কিছু লোক এটি 'খারাপ ফর্ম' হিসাবে বিবেচনা করে পড়েছি, সম্ভবত এটি সম্প্রতি চালু হয়েছিল বলে - আমি সি ++ 11 তে ভাবি। আমার কাছে এটি আরও যুক্তিযুক্ত।

নতুন নিয়মের আরেকটি কার্যকর দিক হ'ল ডেটা-মেম্বারগুলি কীভাবে নিজের ক্লাস হয় তা আরম্ভ করার উপায়। উদাহরণস্বরূপ ধরুন যে এটি CDynamicStringএমন একটি শ্রেণি যা স্ট্রিং হ্যান্ডলিংকে আবদ্ধ করে। এটির একটি নির্মাতা রয়েছে যা আপনাকে এর প্রাথমিক মান নির্দিষ্ট করতে দেয় CDynamicString(wchat_t* pstrInitialString)। আপনি অন্য শ্রেণীর অভ্যন্তরে ডেটা সদস্য হিসাবে এই ক্লাসটি খুব ভালভাবে ব্যবহার করতে পারেন - এমন একটি ক্লাস বলুন যা একটি উইন্ডোজ রেজিস্ট্রি মানকে আবৃত করে যা এই ক্ষেত্রে একটি ডাক ঠিকানা সঞ্চয় করে। 'হার্ড কোড' করতে রেজিস্ট্রি কী নামটি যাতে এতে লেখা হয় আপনি বন্ধনী ব্যবহার করেন:

class Registry_Entry{
public:
    Registry_Entry();
    ~Registry_Entry();
    Commit();//Writes data to registry.
    Retrieve();//Reads data from registry;
private:
    CDynamicString m_cKeyName{L"Postal Address"};
    CDynamicString m_cAddress;
};

নোট করুন দ্বিতীয় স্ট্রিং ক্লাসে যা প্রকৃত ডাক ঠিকানার সাথে ইনিশিয়ালার নেই তাই এটির ডিফল্ট কনস্ট্রাক্টরকে বলা হবে সৃষ্টিতে - সম্ভবত স্বয়ংক্রিয়ভাবে এটিকে একটি ফাঁকা স্ট্রিংয়ে সেট করে।


9

আপনি উদাহরণস্বরূপ যদি ক্লাসটি স্ট্যাকের উপর ইনস্ট্যান্ট করা হয়, অবিবেশনীয় স্কেলার সদস্যদের বিষয়বস্তু এলোমেলো এবং সংজ্ঞায়িত।

বিশ্বব্যাপী উদাহরণস্বরূপ, অবিচ্ছিন্ন স্কেলারের সদস্যদের শূন্য করা হবে।

সদস্যদের জন্য যা তারা নিজেরাই ক্লাসের উদাহরণ, তাদের ডিফল্ট কনস্ট্রাক্টরদের ডাকা হবে, সুতরাং আপনার স্ট্রিং অবজেক্টটি আরম্ভ হবে।

  • int *ptr; // অবিশ্রুত পয়েন্টার (বা বিশ্বব্যাপী যদি শূন্য হয়)
  • string name; // কনস্ট্রাক্টর বলা হয়, খালি স্ট্রিং দিয়ে আরম্ভ করা
  • string *pname; // অবিশ্রুত পয়েন্টার (বা বিশ্বব্যাপী যদি শূন্য হয়)
  • string &rname; // আপনি এটি আরম্ভ করতে ব্যর্থ হলে সংকলন ত্রুটি
  • const string &crname; // আপনি এটি আরম্ভ করতে ব্যর্থ হলে সংকলন ত্রুটি
  • int age; // স্কেলারের মান, আনইনটায়ালাইজড এবং এলোমেলো (বা বিশ্বব্যাপী যদি শূন্য হয়)

আমি পরীক্ষা করে দেখেছি এবং মনে হচ্ছে string nameএটি স্ট্যাকের ক্লাসটি শুরু করার পরে খালি। আপনি কি আপনার উত্তর সম্পর্কে সম্পূর্ণ নিশ্চিত?
বোড্যাসিডো

1
স্ট্রিংয়ের এমন একজন কনস্ট্রাক্টর থাকবে যা ডিফল্টরূপে একটি খালি স্ট্রিং সরবরাহ করেছিল - আমি আমার উত্তরটি পরিষ্কার করব
পল ডিকসন

@ বোডাসিডো: পল সঠিক, তবে আপনি যদি এই আচরণের বিষয়ে চিন্তা করেন তবে তা কখনই স্পষ্ট হয়ে উঠতে পারে না। এটি আরম্ভকারী তালিকায় ফেলে দিন।
স্টিফেন

ব্যাখ্যা এবং ব্যাখ্যা করার জন্য ধন্যবাদ!
বোড্যাসিডো

2
এটা এলোমেলো নয়! এলোমেলো তার জন্য খুব বড় শব্দ! যদি স্কেলারের সদস্যরা এলোমেলো হয়ে থাকে তবে আমাদের অন্য কোনও এলোমেলো সংখ্যা জেনারেটরের প্রয়োজন হবে না। এমন কোনও প্রোগ্রামের কল্পনা করুন যা ডেটা "বাম-ওভারস" - মেমরির অপসারণযোগ্য ফাইলগুলির মতো বিশ্লেষণ করে - ডেটা এলোমেলো থেকে অনেক দূরে। এটি অপরিজ্ঞাতও নয়! এটি সংজ্ঞায়িত করা সাধারণত কঠিন, কারণ সাধারণত আমাদের মেশিনটি কী করে তা আমরা জানি না। যদি সেই "এলোমেলো ডেটা" যে আপনি কেবল মুছে
ফেলেছেন

5

একীকরণবিহীন অ স্থির সদস্যদের এলোমেলো ডেটা থাকবে। প্রকৃতপক্ষে, তাদের যে মেমরি অবস্থান নির্ধারণ করা হয়েছে তার কেবল মূল্য থাকবে।

অবশ্যই অবজেক্টের পরামিতিগুলির জন্য (যেমন string) অবজেক্টের কনস্ট্রাক্টর একটি ডিফল্ট আরম্ভ করতে পারে।

আপনার উদাহরণে:

int *ptr; // will point to a random memory location
string name; // empty string (due to string's default costructor)
string *pname; // will point to a random memory location
string &rname; // it would't compile
const string &crname; // it would't compile
int age; // random value

2

কোন কনস্ট্রাক্টর সহ সদস্যরা তাদের ডিফল্ট কনস্ট্রাক্টরকে আরম্ভ করার জন্য ডেকে আনবেন।

আপনি অন্যান্য ধরণের সামগ্রীর উপর নির্ভর করতে পারবেন না।


0

যদি এটি স্ট্যাকের মধ্যে থাকে তবে অবিচ্ছিন্ন সদস্যদের সামগ্রীগুলি যার নিজস্ব নির্মাতা নেই তা এলোমেলো এবং সংজ্ঞায়িত হবে। এমনকি এটি বিশ্বব্যাপী হলেও এগুলি শূন্য হয়ে যাওয়ার উপর নির্ভর করা খারাপ ধারণা হবে। এটি স্ট্যাকে থাকুক বা না থাকুক, যদি কোনও সদস্যের নিজস্ব নির্মাতা থাকে তবে এটি আরম্ভ করার জন্য আহ্বান জানাবে।

সুতরাং, আপনার যদি স্ট্রিং * নাম রাখা থাকে তবে পয়েন্টারে র্যান্ডম জাঙ্ক থাকবে। তবে স্ট্রিং নামের জন্য, আপনাকে খালি স্ট্রিং দিয়ে স্ট্রিংয়ের জন্য ডিফল্ট কনস্ট্রাক্টর ডেকে আনা হবে। আপনার রেফারেন্স প্রকারের ভেরিয়েবলগুলির জন্য, আমি নিশ্চিত নই, তবে এটি সম্ভবত স্মৃতিতে কিছু র্যান্ডম অংশের একটি উল্লেখ হয়ে উঠবে।


0

এটি ক্লাসটি কীভাবে নির্মিত হবে তার উপর নির্ভর করে

এই প্রশ্নের উত্তর দেওয়ার সাথে সাথে C ++ ভাষার মানকগুলিতে একটি বিশাল সুইচ কেস স্টেটমেন্টটি বোঝা যায়, এবং যা নিছক প্রাণীদের পক্ষে স্বজ্ঞাততা অর্জন করা কঠিন।

জিনিসটি কতটা কঠিন তার সাধারণ উদাহরণ হিসাবে:

main.cpp

#include <cassert>

int main() {
    struct C { int i; };

    // This syntax is called "default initialization"
    C a;
    // i undefined

    // This syntax is called "value initialization"
    C b{};
    assert(b.i == 0);
}

ডিফল্ট সূচনাতে আপনি শুরু করবেন: https://en.cppreferences.com/w/cpp/language/default_initialization আমরা "ডিফল্ট আরম্ভের প্রভাবগুলি" অংশে চলেছি এবং কেস স্টেটমেন্ট শুরু করব:

  • "যদি টি একটি নন-পড হয় ": না (পিওডির সংজ্ঞা নিজেই একটি বিশাল সুইচ বিবৃতি হয়)
  • "যদি টি একটি অ্যারের প্রকার হয়": না
  • "অন্যথায়, কিছুই করা হয় না": সুতরাং এটি একটি অপরিবর্তিত মান দিয়ে ছেড়ে যায়

তারপরে, কেউ যদি আরম্ভ করার জন্য মান স্থির করার সিদ্ধান্ত নেয় তবে আমরা https://en.cppreferences.com/w/cpp/language/value_initialization এ যান "মান শুরুর প্রভাবগুলি" এবং কেস স্টেটমেন্ট শুরু করুন:

  • "যদি টি একটি শ্রেণীর ধরণের হয় যেখানে কোনও ডিফল্ট নির্মাতা বা ব্যবহারকারী সরবরাহিত বা মুছে ফেলা ডিফল্ট কনস্ট্রাক্টর থাকে না": কেস নয়। আপনি এখন 20 মিনিট এই শর্তগুলি গুগল করতে ব্যয় করবেন:
    • আমাদের একটি সুস্পষ্টভাবে সংজ্ঞায়িত ডিফল্ট কনস্ট্রাক্টর রয়েছে (বিশেষত কারণ অন্য কোনও নির্মাণকারীর সংজ্ঞা দেওয়া হয়নি)
    • এটি ব্যবহারকারীর দ্বারা সরবরাহিত নয় (পরিপূর্ণভাবে সংজ্ঞায়িত)
    • এটি মুছে ফেলা হয় না ( = delete)
  • "যদি টি ডিফল্ট কনস্ট্রাক্টর সহ এমন শ্রেণীর ধরণ যা ব্যবহারকারী দ্বারা সরবরাহ করা হয় না এবং মুছে ফেলা হয় না": হ্যাঁ
    • "অবজেক্টটি শূন্য-ইনিশিয়ালাইজড এবং তারপরে এটির ডিফল্ট-ইনিশিয়েশন করা হয় যদি এটিতে একটি তুচ্ছ ত্রুটিযুক্ত ডিফল্ট কনস্ট্রাক্টর থাকে": নন-তুচ্ছ কোনও নির্মাণকারী, কেবল শূন্য-আরম্ভ নয়। "শূন্য-প্রাথমিককরণ" এর সংজ্ঞা কমপক্ষে সহজ এবং আপনি যা প্রত্যাশা করেন তা করে: https://en.cppreferences.com/w/cpp/language/zero_initialization

এ কারণেই আমি দৃ strongly়ভাবে পরামর্শ দিচ্ছি যে আপনি কখনই "অন্তর্নিহিত" শূন্য সূচনার উপর নির্ভর করবেন না। শক্তিশালী পারফরম্যান্সের কারণ না থাকলে, নির্ধারককে নির্ধারিত হিসাবে, বা সামগ্রিক সূচনা ব্যবহার করে সুস্পষ্টভাবে সবকিছু সূচনা করুন। অন্যথায় আপনি ভবিষ্যতের বিকাশকারীদের জন্য জিনিসগুলি খুব ঝুঁকিপূর্ণ করে তুলেছেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.