ডট (.) এবং অ্যারো (->) অপারেটর দুটোই C++-এ ক্লাস বা স্ট্রাকচারের মেম্বার অ্যাক্সেস করতে ব্যবহৃত হয়। সেগুলো শুধু ভিন্ন পরিস্থিতিতে ব্যবহৃত হয়। C++-এ, class, struct, বা union হিসেবে ডিক্লেয়ার্ড টাইপগুলো "ক্লাস টাইপের" হিসেবে বিবেচিত হয়। তাই নিচের موارد সব তিনটিই রেফার করে।
a.b শুধুমাত্র তখনই ব্যবহার করা হয় যখন b হলো অবজেক্ট a-র মেম্বার (অথবা অবজেক্টের রেফারেন্স)। সুতরাং a.b-তে a সবসময় একটি আসল অবজেক্ট (অথবা ক্লাসের একটি অবজেক্টের রেফারেন্স) হবে।
a->b মূলত (*a).b-এর শর্টহ্যান্ড নোটেশন, অর্থাৎ যদি a একটি অবজেক্টের পয়েন্টার হয়, তবে a->b হলো a যেটাকে পয়েন্ট করে সেটার প্রপার্টি b অ্যাক্সেস করা।
নোট করুন যে ডট (.) ওভারলোড করা যাবে না কিন্তু -> ওভারলোড করা যায়, তাই আমরা নিজস্ব ফাংশন (operator->()) ডিফাইন করতে পারি যা এই অপারেটর ব্যবহার করার সময় কল হবে। তাই যদি a একটি ক্লাসের অবজেক্ট হয় যেটি operator-> ওভারলোড করে (সাধারণ উদাহরণ: স্মার্ট পয়েন্টার এবং ইটেরেটর), তবে অর্থটি হবে যা ক্লাস ডিজাইনার বাস্তবায়ন করেছেন।
রেফারেন্সগুলো সিমেন্টিক্যালি অবজেক্টের এলিয়াস, তাই আমাকে ""অথবা পয়েন্টারের রেফারেন্স"" যোগ করা উচিত ছিল। যাইহোক, আমি মনে করি এটি আরও কনফিউজিং হবে, যেহেতু রেফারেন্স টু পয়েন্টার (T*&) খুব কম ব্যবহার হয়।
উদাহরণ কোড
#include <iostream>
class A {
public:
int b;
A() { b = 5; }
};
int main() {
A a = A();
A* x = &a;
std::cout << "a.b = " << a.b << "\n";
std::cout << "x->b = " << x->b << "\n";
return 0;
}
আউটপুট
5 5