উত্তর:
নিম্নলিখিত দুটি এক্সপ্রেশন সমতুল্য:
a->b
(*a).b
(কনর্ডের উল্লেখ হিসাবে অপারেটর ওভারলোডিং সাপেক্ষে, তবে এটি অস্বাভাবিক)।
a[0].b
পরিবর্তে করতে পারেন (*a).b
। তবে এটি যথাযথভাবে কাঠামোগত হবে না।
a->b
সাধারণত এর প্রতিশব্দ (*a).b
। অপারেটরদের বাধ্যতামূলক শক্তির কারণে এখানে প্রথম বন্ধনীগুলি প্রয়োজনীয় *
এবং .
: *a.b
কাজ করবে না কারণ .
বাঁধাই শক্তিশালী এবং প্রথমে কার্যকর করা হয়। এটি এই সমতুল্য *(a.b)
।
ওভারলোডিং সম্পর্কে সতর্ক থাকুন: যেহেতু উভয়ই ->
এবং *
অতিরিক্ত লোড করা যায়, তাই তাদের অর্থ মারাত্মকভাবে পৃথক হতে পারে।
binding strength
আপনি অপারেটর প্রাধান্য মানে? না হলে দুজনের মধ্যে পার্থক্য কী?
সি ++ - ভাষা তীর অপারেটর ( ->
) কে পয়েন্টারকে .
ডিফারেন্স করার জন্য প্রতিশব্দ হিসাবে সংজ্ঞায়িত করে এবং তারপরে সেই ঠিকানায় -অ্যাপেরেটরটি ব্যবহার করে ।
উদাহরণ স্বরূপ:
আপনার যদি কোনও বস্তু anObject
, এবং একটি পয়েন্টার থাকে aPointer
:
SomeClass anObject = new SomeClass();
SomeClass *aPointer = &anObject;
আপনি পয়েন্টারকে সম্মান করে এবং সেই ঠিকানায় কোনও মেথড কল করতে কোনও অবজেক্টের পদ্ধতি ব্যবহার করতে সক্ষম হতে:
(*aPointer).method();
যা তীর অপারেটর দিয়ে লেখা যেতে পারে:
aPointer->method();
তীর অপারেটরের উপস্থিতির মূল কারণ হ'ল এটি খুব সাধারণ কাজটির টাইপিংকে সংক্ষিপ্ত করে এবং পয়েন্টারটিকে অবলম্বন করার আশেপাশে প্রথম বন্ধনীগুলি ভুলে যাওয়াও সহজ। আপনি যদি প্রথম বন্ধনীগুলি ভুলে গেছেন। অপারেটর শক্তিশালী আবদ্ধ হবে * অপারেটর এবং আমাদের উদাহরণটিকে এইভাবে সম্পাদন করবে:
*(aPointer.method()); // Not our intention!
অন্যান্য উত্তরগুলির মধ্যে কয়েকটিতে উভয়ই উল্লেখ করেছে যে সি ++ অপারেটরগুলি ওভারলোড হতে পারে এবং এটি সাধারণ নয়।
new SomeClass()
একটি পয়েন্টার ( SomeClass *
) দেয়, SomeClass
বস্তুটি নয়। এবং আপনি ঘোষণা দিয়ে শুরু করেন anObject
এবং aPointer
তবে আপনি p
পরে ব্যবহার করছেন ।
সি ++ 0 এক্সে অপারেটর একটি দ্বিতীয় অর্থ পায় যা কোনও ফাংশন বা ল্যাম্বডা এক্সপ্রেশনের রিটার্নের ধরণকে নির্দেশ করে
auto f() -> int; // "->" means "returns ..."
::
আসলে .
বা ->
অপারেটার হিসাবে কাজ করে এবং স্ট্যান্ডার্ডে তাকে "স্কোপ রেজুলেশন অপারেটর" বলা হয়।
->
আপনি পয়েন্টার পেয়েছেন যা তথ্য অ্যাক্সেস করার সময় ব্যবহৃত হয়।
উদাহরণস্বরূপ, আপনি এই জাতীয় টাইপ ইন্টিওয়ারের ভেরিয়েবলের জন্য পয়েন্টার পিটিআর তৈরি করতে পারেন:
int* prt = &intVar;
তারপরে আপনি কেবলমাত্র সেই পয়েন্টারটিকে ডিফারেন্সিং করে তার উপর ফো এর মতো কোনও ফাংশন ব্যবহার করতে পারেন - সেই ভেরিয়েবলের মেমরি অবস্থানের সংখ্যাসূচক মানটির পরিবর্তে পয়েন্টারটি যে ভ্যারিয়েবলটিতে নির্দেশ করে সেটিতে ফাংশনটি কল করতে:
(*ptr).foo();
এখানে প্রথম বন্ধনী ছাড়া, সংকলক এটি হিসাবে বুঝতে হবে *(ptr.foo())
অপারেটর প্রাধান্যের কারণে পারে যা আমরা চাই না।
এটি আসলে টাইপিংয়ের মতোই
ptr->foo();
->
যে পয়েন্টার হিসাবে dereferences, এবং তাই ফাংশন কলfoo()
ভেরিয়েবলটিতে যা আমাদের জন্য পয়েন্টারটি নির্দেশ করে।
একইভাবে, আমরা ->
কোনও শ্রেণীর সদস্যকে অ্যাক্সেস করতে বা সেট করতে ব্যবহার করতে পারি :
myClass* ptr = &myClassMember;
ptr->myClassVar = 2;
->
কিছু পুনরাবৃত্তকারী প্রকারের জন্য কোনও ওভারলোডেড অপারেটর ছিল না যাতে আপনাকে ব্যবহার করতে হয়েছিল*.
। অনেক লাইব্রেরি এগুলি বেমানানভাবে সংজ্ঞায়িত করে। আপনি যখন টেমপ্লেটগুলির সাথে কাজ করেন এবং সুনির্দিষ্ট প্রকারটি জানেন না তখন সত্যিই বিরক্তিকর হয়ে ওঠে।