আমি পয়েন্টার বনাম রেফারেন্সের বাক্য গঠন এবং সাধারণ শব্দার্থবিজ্ঞান বুঝতে পারি, তবে যখন কোনও এপিআই-তে রেফারেন্স বা পয়েন্টার ব্যবহার করা কম-বেশি-উপযুক্ত হয় তখন আমি কীভাবে সিদ্ধান্ত নেব?
স্বাভাবিকভাবে কিছু পরিস্থিতিতে একটি বা অন্যটির প্রয়োজন হয় ( operator++
একটি রেফারেন্স আর্গুমেন্টের প্রয়োজন) তবে সাধারণভাবে আমি পয়েন্টারগুলি (এবং কনস্ট পয়েন্টার) ব্যবহার করা পছন্দ করি বলে সিনট্যাক্সটি পরিষ্কার যে ভেরিয়েবলগুলি ধ্বংসাত্মকভাবে পাস হচ্ছে।
যেমন নিম্নলিখিত কোডে:
void add_one(int& n) { n += 1; }
void add_one(int* const n) { *n += 1; }
int main() {
int a = 0;
add_one(a); // Not clear that a may be modified
add_one(&a); // 'a' is clearly being passed destructively
}
পয়েন্টারটির সাহায্যে এটি সর্বদা (আরও) স্পষ্টভাবে যা ঘটছে তা স্পষ্ট, তাই এপিআই এবং এর মতো যেখানে স্পষ্টতা বড় উদ্বেগের বিষয়গুলি হল পয়েন্টারগুলি উল্লেখের চেয়ে বেশি উপযুক্ত নয়? এর অর্থ কি যখন প্রয়োজন হয় তখনই রেফারেন্সগুলি ব্যবহার করা উচিত (উদাঃ operator++
)? এক বা অন্যটির সাথে কোনও পারফরম্যান্স উদ্বেগ রয়েছে?
সম্পাদনা (স্বীকৃত):
NULL মানগুলিকে অনুমতি দেওয়া এবং কাঁচা অ্যারের সাথে কাজ করার পাশাপাশি মনে হয় পছন্দটি ব্যক্তিগত পছন্দকেই কমিয়েছে। আমি নীচের উত্তরটি Google এর সি ++ স্টাইল গাইড হিসাবে উল্লেখ করেছি , কারণ তারা এই মতামতটি উপস্থাপন করে যে "রেফারেন্সগুলি বিভ্রান্তিকর হতে পারে, কারণ তাদের মান সিনট্যাক্স তবে পয়েন্টার শব্দার্থক শব্দ রয়েছে।"
পয়েন্টার আর্গুমেন্টগুলিকে স্যানিটাইজ করার জন্য প্রয়োজনীয় অতিরিক্ত কাজের কারণে যেটি নুল হওয়া উচিত নয় (যেমন add_one(0)
পয়েন্টার সংস্করণটি কল করবে এবং রানটাইম চলাকালীন বিরতি হবে), এটি কোনও রক্ষণাবেক্ষণের দৃষ্টিভঙ্গি থেকে রেফারেন্সগুলি ব্যবহার করতে পারে যেখানে কোনও বস্তু উপস্থিত থাকতে হবে, যদিও এটি লজ্জাজনক সিনট্যাকটিক স্পষ্টতা হারাতে।
add_one(a);
যেটি a
সংশোধিত হতে চলেছে তা সম্পর্কে অস্পষ্টতা কী ? এটা সঠিক কোডে বলেছেন: এক যোগ ।
addOneTo(...)
। আপনি যদি এটি করতে চান তা না হলে কেবল ঘোষণাটি দেখুন।