ডট এবং অ্যারো অপারেটর দুটোই C++-এ একটি ক্লাসের মেম্বার অ্যাক্সেস করার জন্য ব্যবহৃত হয়। সেগুলো শুধু ভিন্ন পরিস্থিতিতে ব্যবহার হয়। C++-এ, class, struct, বা union হিসেবে ডিক্লেয়ার করা টাইপগুলো "ক্লাস টাইপের" বলা হয়। তাই নিচের কথা দুটির জন্যও প্রযোজ্য।
- a.b শুধু তখন ব্যবহৃত হয় যদি b অবজেক্ট a-এর (অথবা অবজেক্ট 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