সি ++ 17 আপডেট
সি ++ ১ In-এ, এই অধ্যায়টি সি ++ 17-এ A_factory_func()(আলগাভাবে কথা বলার জন্য) যে কোনও বস্তুর আরম্ভ করা হয়েছে কেবলমাত্র একটি অস্থায়ী বস্তু (সি ++ <= 14) তৈরি করা থেকে পরিবর্তনের অর্থ পরিবর্তিত হয়েছে। এই বস্তুগুলি ("রেজাল্ট অবজেক্টস" নামে পরিচিত) a1হ'ল ঘোষণাপত্র (যেমন ) দ্বারা তৈরি করা ভেরিয়েবল , যখন আরম্ভটি শেষ করে ফেলে দেওয়া হয় তখন তৈরি করা কৃত্রিম বস্তু বা রেফারেন্স বাইন্ডিংয়ের জন্য যদি কোনও বস্তুর প্রয়োজন হয় (যেমন, ইন A_factory_func();। শেষ ক্ষেত্রে, কোনও বস্তু কৃত্রিমভাবে তৈরি করা হয়, তাকে "অস্থায়ী ধাতবকরণ" বলা হয়, কারণ A_factory_func()কোনও ভেরিয়েবল বা রেফারেন্স নেই যা অন্যথায় কোনও বস্তুর অস্তিত্বের প্রয়োজন হবে)।
উদাহরণস্বরূপ , আমাদের ক্ষেত্রে উদাহরণ হিসাবে a1এবং a2বিশেষ বিধিগুলি বলে যে এই জাতীয় ঘোষণায়, একই ধরণের একটি প্রলু ইনিশিয়ালাইজারের ফলাফল অবজেক্টটি a1পরিবর্তনশীল a1, এবং সেইজন্য A_factory_func()সরাসরি বস্তুটি আরম্ভ করে a1। কোনও মধ্যস্থতাকারী কার্যকরী-শৈলীর cast A_factory_func(another-prvalue)ালির কোনও প্রভাব পড়বে না, কারণ কেবলমাত্র বাইরের মূল্যগুলির ফলাফল অবজেক্টটি "অভ্যন্তরীণ মূল্যবৃত্তের ফলাফল অবজেক্ট" হতে পারে।
A a1 = A_factory_func();
A a2(A_factory_func());
কি ধরণের A_factory_func()রিটার্ন নির্ভর করে । আমি ধরে নিলাম এটি কোনও ফেরত দেয় A- তবে এটি একই করছে - ব্যতীত যখন অনুলিপিটি নির্মাণকারী স্পষ্ট হয়, তবে প্রথমটি ব্যর্থ হবে। 8.6 / 14 পড়ুন
double b1 = 0.5;
double b2(0.5);
এটি একই কাজ করছে কারণ এটি একটি বিল্ট-ইন টাইপ (এর অর্থ এখানে শ্রেণীবদ্ধ নয়)। 8.6 / 14 পড়ুন ।
A c1;
A c2 = A();
A c3(A());
এটি একই করছে না। প্রথম ডিফল্ট-আরম্ভকরণ যদি Aকোনও নন-পিওডি হয়, এবং কোনও পিওডের জন্য কোনও আরম্ভ করে না (পড়ুন 8.6 / 9 )। দ্বিতীয় অনুলিপিটি আরম্ভ করে: মানটি একটি অস্থায়ী হয় এবং তারপরে সেই মানটি অনুলিপি করে c2( 5.2.3 / 2 এবং 8.6 / 14 পড়ুন )। অবশ্যই এটির জন্য একটি স্পষ্ট অনুলিপি অনুলিপি প্রস্তুতকারকের (পড়ুন 8.6 / 14 এবং 12.3.1 / 3 এবং 13.3.1.3/1 পড়ুন )। তৃতীয়টি একটি ফাংশনটির জন্য একটি ফাংশন ঘোষণা তৈরি করে c3যা কোনওটি প্রদান করে Aএবং এটি কোনও ফাংশন পয়েন্টারটি কোনও ফাংশনে ফিরে আসে A(পড়ুন 8.2 )।
ইনিশিয়ালাইজেশন সরাসরি এবং অনুলিপি সূচনাতে ডেলিভেশন
তারা অভিন্ন দেখতে দেখতে এবং একই কাজ করার কথা থাকলেও এই দুটি ফর্ম নির্দিষ্ট ক্ষেত্রে উল্লেখযোগ্যভাবে আলাদা। আরম্ভের দুটি রূপ হ'ল প্রত্যক্ষ এবং অনুলিপি সূচনা:
T t(x);
T t = x;
এমন একটি আচরণ রয়েছে যা আমরা তাদের প্রত্যেকটির প্রতি বিশেষণ দিতে পারি:
- ডাইরেক্ট ইনিশিয়ালাইজেশন হ'ল ওভারলোডেড ফাংশনটিতে একটি ফাংশন কলের মতো আচরণ করে: ফাংশনগুলি এই ক্ষেত্রে,
T(যার সাথে explicitরয়েছে) এর নির্মাণকারী এবং যুক্তিটি হ'ল x। ওভারলোড রেজোলিউশনটি সেরা ম্যাচিং কনস্ট্রাক্টরকে সন্ধান করবে এবং যখন প্রয়োজন হবে তখন কোনও সংক্রামিত রূপান্তর প্রয়োজন।
- অনুলিপিকরণ সূচনাটি একটি অন্তর্নিহিত রূপান্তর ক্রম তৈরি করে: এটি
xকোনও ধরণের অবজেক্টে রূপান্তরিত করার চেষ্টা করে T। (এটি তখন সেই বস্তুটির উপর থেকে আরম্ভ করা অবজেক্টে অনুলিপি করতে পারে, সুতরাং একটি অনুলিপি নির্মাণকারীও প্রয়োজন - তবে এটি নীচে গুরুত্বপূর্ণ নয়)
আপনি দেখুন, কপি আরম্ভের সম্ভব অন্তর্নিহিত ধর্মান্তর ব্যাপারে সরাসরি আরম্ভের একটি অংশ কোনো না কোনোভাবে হল: যদিও সরাসরি আরম্ভের সব কনস্ট্রাকটর ডাকতে প্রাপ্তিসাধ্য আছে, এবং ছাড়াও কোনো অন্তর্নিহিত রূপান্তর এটি আর্গুমেন্ট প্রকার মেলে প্রয়োজন কি করতে পারেন, কপি আরম্ভের কেবল একটি অন্তর্নিহিত রূপান্তর ক্রম সেট আপ করতে পারেন।
আমি চেষ্টা করেছি এবং কনস্ট্রাক্টরের মাধ্যমে "সুস্পষ্ট" ব্যবহার না করে without ফর্মগুলির প্রত্যেকের জন্য আলাদা আলাদা পাঠ্য আউটপুট দেওয়ার জন্য নিম্নলিখিত কোডটি পেয়েছিexplicit ।
#include <iostream>
struct B;
struct A {
operator B();
};
struct B {
B() { }
B(A const&) { std::cout << "<direct> "; }
};
A::operator B() { std::cout << "<copy> "; return B(); }
int main() {
A a;
B b1(a); // 1)
B b2 = a; // 2)
}
// output: <direct> <copy>
এটি কীভাবে কাজ করে এবং এর ফলাফল কী করে?
সরাসরি সূচনা
এটি প্রথমে রূপান্তর সম্পর্কে কিছুই জানে না। এটি কেবল কোনও নির্মাণকারীকে কল করার চেষ্টা করবে। এই ক্ষেত্রে, নিম্নলিখিত নির্মাণকারী উপলব্ধ এবং একটি সঠিক মিল :
B(A const&)
কোনও রূপান্তর নেই, একজন ব্যবহারকারী সংজ্ঞায়িত রূপান্তরটির চেয়ে কম, সেই কনস্ট্রাক্টরকে কল করার প্রয়োজন (নোট করুন যে কোনও কনস্টের যোগ্যতার রূপান্তরটি এখানে হয় না)। এবং তাই সরাসরি সূচনা এটি কল করবে।
অনুলিপি অনুলিপি করুন
যেমনটি উপরে বলা হয়েছে, অনুলিপি করা যখন রূপান্তর ক্রম তৈরি করবে যা এগুলি থেকে aটাইপ Bবা প্রাপ্ত হয়নি (যা এখানে স্পষ্টতই কেস হয়)। সুতরাং এটি রূপান্তর করার উপায় অনুসন্ধান করবে এবং নীচের প্রার্থীদের সন্ধান করবে
B(A const&)
operator B(A&);
আমি রূপান্তর ফাংশনটি কীভাবে পুনরায় লিখলাম তা লক্ষ্য করুন: পরামিতি প্রকারটি thisপয়েন্টারের ধরণটি প্রতিফলিত করে , যা কোনও অ-কনস্ট্যান্ড সদস্য ফাংশনে নন-কনস্টের হয় to এখন, আমরা xযুক্তি হিসাবে এই প্রার্থীদের কল । বিজয়ী হ'ল রূপান্তর ফাংশন: কারণ যদি আমাদের কাছে দুজন প্রার্থী একই ধরণের রেফারেন্স গ্রহণ করার জন্য উভয় ফাংশন করে থাকে তবে কম কনস্টের সংস্করণটি জিততে পারে (এটি উপায় দ্বারা, নন-কনস্ট্যান্ড সদস্য ফাংশনটিকেও পছন্দ করে এমন পদ্ধতিটি ননকে কল করে -কনস্ট অবজেক্টস)।
মনে রাখবেন যে আমরা যদি রূপান্তর ফাংশনটিকে কনস্টের সদস্য ফাংশন হিসাবে পরিবর্তন করি তবে রূপান্তরটি অস্পষ্ট (কারণ উভয়েরই প্যারামিটার ধরণের থাকে A const&): কম্যু সংকলক এটিকে সঠিকভাবে প্রত্যাখ্যান করে, তবে জিসিসি এটিকে নন-প্যাডেন্টিক মোডে গ্রহণ করে। স্যুইচিং -pedanticএটিকে সঠিক অস্পষ্টতার সতর্কতাটিকে আউটপুট করে তোলে though
আমি আশা করি এটি এই দুটি ফর্মের পার্থক্য কীভাবে তা পরিষ্কার করে তুলতে কিছুটা সহায়তা করবে!
A c1; A c2 = c1; A c3(c1);।