কেন 'এটি' একটি পয়েন্টার এবং একটি রেফারেন্স নয়?


183

আমি এই প্রশ্নের উত্তরগুলি সি ++ প্রফিট এবং কনস পড়ছিলাম এবং মন্তব্যগুলি পড়ার সময় এই সন্দেহ পেয়েছি got

প্রোগ্রামাররা প্রায়শই এটি বিভ্রান্ত করে যে "এটি" একটি পয়েন্টার তবে একটি রেফারেন্স নয়। আরেকটি বিভ্রান্তি হ'ল কেন "হ্যালো" স্ট্যান্ড স্ট্রিং টাইপ নয় তবে একটি চর কনস্ট * (পয়েন্টার) এর মূল্যায়ন করে (বিন্যাসে অ্যারে পরে পয়েন্টার রূপান্তর) - জোহানেস স্কাউব - lit 22 ডিসেম্বর '08 এ 1:56

এটি কেবলমাত্র এটি দেখায় যে এটি অন্যান্য (পরবর্তী) ভাষার মতো কনভেনশন ব্যবহার করে না। - লে ডরফায়ার 22 ডিসেম্বর '08 এ 3:35 এ

যদিও আমি "এই" জিনিসটিকে একটি অতি তুচ্ছ বিষয় বলব। ওফস, আমার অপরিবর্তিত আচরণের উদাহরণগুলিতে কয়েকটি ত্রুটি ধরা দেওয়ার জন্য ধন্যবাদ। :) যদিও আমি বুঝতে পারি না আকারের কোনও তথ্যটি প্রথমে কোনও কিছুর সাথে কি করতে পারে। একটি পয়েন্টার কেবল বরাদ্দ মেমরির বাইরে নির্দেশ করার অনুমতি নেই - জাল্ফ 22 ডিসেম্বর '08 এ 4:18

এটি কি ধ্রুবক পয়েন্টার? - Yesraaj 22 ডিসেম্বর '08 এ 6:35 এ

পদ্ধতিটি যদি কনট ইন্ট গেটফু () কনস্ট হয় তবে এটি স্থির থাকতে পারে; <- getFoo এর সুযোগে "এটি" ধ্রুবক এবং তাই কেবল পাঠযোগ্য। এটি বাগগুলি প্রতিরোধ করে এবং কলারের কাছে এমন কিছু গ্যারান্টি সরবরাহ করে যা বস্তুটি পরিবর্তন হবে না। - ডগ টি। ডিসেম্বর 22 '08 এ 16:42 এ

আপনি "এটি" পুনরায় নিয়োগ করতে পারবেন না। যেমন আপনি "এটি = & অন্যান্য;" করতে পারবেন না, কারণ এটি একটি মূল্য r তবে এটি টাইপ টি * এর, টাইপ টি কনস্টের নয়। অর্থাত্ এটি একটি অ-ধ্রুবক পয়েন্টার। আপনি যদি কোনও কনস্টেন্ট পদ্ধতিতে থাকেন তবে এটি কনস্টের পয়েন্টার। টি কনস্ট্যান্ট তবে পয়েন্টারটি নিজেই ননকনস্ট - জোহানেস স্কাউব - লিটব 22 ডিসেম্বর '08 এ 17:53 এ

"এই "টিকে এই জাতীয়ভাবে ভাবুন: # এটি (এটি_ + 0) সংজ্ঞায়িত করুন যেখানে সংকলক বস্তুটির পয়েন্টার হিসাবে" এটি_ "তৈরি করে এবং" এটি "একটি কীওয়ার্ড তৈরি করে। আপনি "এটি" বরাদ্দ করতে পারবেন না কারণ (এটি_ + 0) একটি মূল্য। অবশ্যই এটি এটি নয় (এটির মতো কোনও ম্যাক্রো নেই) তবে এটি এটি বুঝতে সহায়তা করতে পারে - জোহানেস স্কাউব - lit 22 ডিসেম্বর '08 এ 17:55

আমার প্রশ্ন, কেন thisপয়েন্টারটি একটি রেফারেন্স নয়? এটিকে পয়েন্টার বানানোর কোনও বিশেষ কারণ?


আরও কিছু যুক্তি কেন thisরেফারেন্স হওয়া অর্থপূর্ণ হবে:

  • Item 1থেকে বিবেচনা করুন More Effective C++ : রেফারেন্সগুলি ব্যবহার করুন যখন এটির গ্যারান্টি দেওয়া হয় যে আমাদের কাছে একটি বৈধ অবজেক্ট আছে যেমন একটি নল নয় (আমার ব্যাখ্যা)।
  • তদুপরি, উল্লেখগুলি পয়েন্টারগুলির চেয়ে নিরাপদ হিসাবে বিবেচিত হয় (কারণ আমরা কোনও বিপথগামী পয়েন্টারের সাহায্যে স্মৃতিটিকে স্ক্রু করতে পারি না)।
  • তৃতীয়ত, রেফারেন্সগুলি অ্যাক্সেস করার সিনট্যাক্স ( .) ->বা পয়েন্টার অ্যাক্সেসের চেয়ে কিছুটা সুন্দর এবং খাটো (*)

5
@ পলম এই "হ্যাক" আসলে কী করবে? না thisসবসময় মূল্যায়ন true?
আইফ্রেইলিচট

6
@ পলম আমি মনে করি না এটি আসলে বৈধ সি ++। কোনও বস্তুর কাছে নাল্প্টারের উপর পদ্ধতিগুলি চাওয়ার ফলে অপরিবর্তিত আচরণের ফলাফল হয়।
antred

5
@ পলম সম্ভবত এটি কিছু ক্ষেত্রে কার্যকর হয় তবে ভাবুন যে পদ্ধতিটি ছিল না ভাইরাগ। কোনও অবজেক্টের সাথে কোনও ভি-টেবিল লুকআপ কীভাবে করা যায়?
জেসন ক্রেইটন

3
@ পলম যদি আপনি এটি উত্পাদন কোডটিতে দেখে থাকেন তবে জাহাজটি ত্যাগ করুন! তা হ'ল ইউবি।
এলিস

6
আমি কেবল এখানে এটি ছেড়ে চলে যাব ... (এমএফসি এর afxwin2.inl থেকে):_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const { return this == NULL ? NULL : m_hWnd; }
ক্রিস্টোফার

উত্তর:


176

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

এর মধ্যে অন্যতম ব্যবহার thisহ'ল কোনও বস্তুর নিজের কাছে পয়েন্টার পাওয়ার জন্য। এটি যদি একটি রেফারেন্স হত তবে আমাদের লিখতে হবে &this। অন্যদিকে, আমরা যখন একটি অ্যাসাইনমেন্ট অপারেটর লিখি তখন return *thisতা দেখতে আরও সহজ লাগবে return this। সুতরাং আপনার যদি একটি ফাঁকা স্লেট থাকে, আপনি এটি কোনওভাবেই তর্ক করতে পারেন। তবে ব্যবহারকারীদের একটি সম্প্রদায়ের প্রতিক্রিয়া (সবচেয়ে সফল জিনিসগুলির মত) হিসাবে ধীরে ধীরে সি ++ বিকশিত হয়েছে। পশ্চাদপদ সামঞ্জস্যের মান সম্পূর্ণভাবে সামান্য সুবিধা / অসুবিধাগুলিকে thisএকটি রেফারেন্স বা পয়েন্টার হিসাবে গ্রহণ করে।


4
ঠিক আছে, এটি কোনও বস্তুর নিজের কাছে একটি রেফারেন্স পাওয়ার জন্য প্রায়শই দরকারী। আমি বলব যে এটি আরও সাধারণ ব্যবহার। যাইহোক, মূল কারণটি আপনি যেমন বলেছিলেন, রেফারেন্সগুলি যখন তারা 'এই' পয়েন্টার তৈরি করেছিল তখন উপস্থিত ছিল না।
জাল্ফ

20
এবং, যদি এটি একটি রেফারেন্স হত তবে operator &দরকারী কিছু করতে ওভারলোড করা কঠিন । এর ঠিকানা পাওয়ার জন্য কিছু বিশেষ বাক্য গঠন করতে হবে যা অতিক্রম করবে না operator &
সর্বজ্ঞানী

10
@ আইসিও - আপনি পরের বার সি ++ কম্পাইলারের কাছাকাছি থাকতে পারেন তা পরীক্ষা করতে চাইতে পারেন! :) এর মতো কিছু:int n = 5; int &r = n; int *p = &r; std::cout << *p;
ড্যানিয়েল আর্উইকার

14
@ সর্বজনীন আপনি &reinterpret_cast<char&>(this);ওভারলোডিংয়ের আসল ঠিকানা পেতে লিখতে পারেন operator&(আসলে, এটি যা boost::addressofকরে তা এই রকম)।
জোহানেস স্কাউব -

9
যেহেতু এটি নালার জন্য সত্যিকার অর্থে কোনও অর্থবোধ করে না this, তাই আমার কাছে মনে হয় যে একটি উল্লেখটি সত্যই আরও উপযুক্ত more
পোনকডুডল

114

পার্টিতে কিছুটা দেরি হয়ে গেল ... ঘোড়ার মুখ থেকে সোজা, এখানেই বার্জন স্ট্রোস্ট্রাপের যা বলা আছে (যা মূলত "C ++ এর ডিজাইন এবং বিবর্তন" বইটিতে পুনরাবৃত্তি করা হয়েছে বা নেওয়া হয়েছে):

" this" কেন রেফারেন্স নয়?

কারণ "এটি" C ++ (সত্যিকারের C সহ ক্লাসে) প্রবর্তন করার পূর্বে প্রবর্তিত হয়েছিল। এছাড়াও, this"স্ব" এর (পরে) স্মার্টটাক ব্যবহারের চেয়ে সিমুলা ব্যবহার অনুসরণ করতে আমি " " বেছে নিয়েছি ।


2
হ্যাঁ, অন্য ভাষাগুলির সাথে ধারাবাহিকতার জন্য নিজেরাই ভাল হত oh
পাইকচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.