The -> the তীর অপারেটরের পরিবর্তে আমি কী ব্যবহার করতে পারি?


উত্তর:


148

নিম্নলিখিত দুটি এক্সপ্রেশন সমতুল্য:

a->b

(*a).b

(কনর্ডের উল্লেখ হিসাবে অপারেটর ওভারলোডিং সাপেক্ষে, তবে এটি অস্বাভাবিক)।


9
ওভারলোডিং ইস্যুগুলি আপনার ভাবার চেয়ে অনেক কম অস্বাভাবিক। খুব বেশি দিন আগে, এসটিএল বাস্তবায়নকারীদের ->কিছু পুনরাবৃত্তকারী প্রকারের জন্য কোনও ওভারলোডেড অপারেটর ছিল না যাতে আপনাকে ব্যবহার করতে হয়েছিল*. । অনেক লাইব্রেরি এগুলি বেমানানভাবে সংজ্ঞায়িত করে। আপনি যখন টেমপ্লেটগুলির সাথে কাজ করেন এবং সুনির্দিষ্ট প্রকারটি জানেন না তখন সত্যিই বিরক্তিকর হয়ে ওঠে।
কনরাড রুডলফ

1
আপনি a[0].bপরিবর্তে করতে পারেন (*a).b। তবে এটি যথাযথভাবে কাঠামোগত হবে না।
সেলোরিও

2
ছেলে, সি # প্রোগ্রামিংয়ের বহু বছর পরে, সি ++ এ ফিরে যাওয়া কেবল জ্ঞানীয়ভাবে কর আদায় নয়, সি ++ বাক্য গঠনটি কেবল কুৎসিত এবং ইয়াকী। এটি ব্যবহারের পরে গোসল করার মতো অনুভব করছি। সি এবং সি ++ এ লিখিত প্রোগ্রামগুলি কেবল খারাপ প্রোগ্রামিংকে উত্সাহ দেয়। অ্যাপল, প্রাক-ইউনিক্স, ভাষাটিকে পাসকালের মতো সুন্দর করে তুলতে লড়াই করেছিল।
এটিএল_ডিইভি

@ATL_DEV আমি যুক্তি দিয়েছি যে প্রচুর কুরুচিপূর্ণ স্টাফকে এখন আর মূর্খতা হিসাবে বিবেচনা করা হয় না, তবে দুর্ভাগ্যক্রমে এর অর্থ এই নয় যে আপনি অনুশীলনকারী সি ++ প্রোগ্রামার হিসাবে এটির সাথে পরিচিত হওয়ার সামর্থ্য রাখতে পারবেন না। এছাড়াও সিন্ট্যাক্টিক্যালি সুন্দর পথটি প্রায়শই শব্দার্থগতভাবে দুর্দান্ত পাথ নয়, তবে এটি আরও খারাপের চেয়ে ভাল হচ্ছে। তবে তারপরে আবার আমার সি ++ স্টকহোম সিনড্রোম রয়েছে।
টিম সেগুইন

@ টিমসিগুইন যদি আপনি কখনও সুন্দর কোড দেখতে চান তবে ম্যাকিনটোসের ভিতরে ডকুমেন্টেশনটি দেখুন। আমি মনে করি তারা ক্যামেলকেস আবিষ্কার করেছিল। খুব বর্ণনামূলক পরিবর্তনশীল নাম এবং মার্জিতভাবে ফর্ম্যাট কোড। তারা তাদের পরবর্তী সি কোডটি তাদের পূর্ববর্তী পাস্কাল কোডের মতো প্রায় চমত্কার করতে সক্ষম হয়েছিল।
এটিএল_ডিইভি

70

a->bসাধারণত এর প্রতিশব্দ (*a).b। অপারেটরদের বাধ্যতামূলক শক্তির কারণে এখানে প্রথম বন্ধনীগুলি প্রয়োজনীয় *এবং .: *a.bকাজ করবে না কারণ .বাঁধাই শক্তিশালী এবং প্রথমে কার্যকর করা হয়। এটি এই সমতুল্য *(a.b)

ওভারলোডিং সম্পর্কে সতর্ক থাকুন: যেহেতু উভয়ই ->এবং *অতিরিক্ত লোড করা যায়, তাই তাদের অর্থ মারাত্মকভাবে পৃথক হতে পারে।


1
দ্বারা binding strengthআপনি অপারেটর প্রাধান্য মানে? না হলে দুজনের মধ্যে পার্থক্য কী?
বিষ্ণুপ্রসন্ত

1
@ ভিজক্রিগ হ্যাঁ, দুটি পদ দুটি এক-একভাবে পরিবর্তিতভাবে ব্যবহৃত হয় (যদিও "অপারেটর অগ্রাধিকার" কমপক্ষে সাম্প্রতিক বছরগুলিতে অনেক বেশি ঘন ঘন মনে হয়)।
কনরাড রুডল্ফ

45

সি ++ - ভাষা তীর অপারেটর ( ->) কে পয়েন্টারকে .ডিফারেন্স করার জন্য প্রতিশব্দ হিসাবে সংজ্ঞায়িত করে এবং তারপরে সেই ঠিকানায় -অ্যাপেরেটরটি ব্যবহার করে ।

উদাহরণ স্বরূপ:

আপনার যদি কোনও বস্তু anObject, এবং একটি পয়েন্টার থাকে aPointer:

SomeClass anObject = new SomeClass();
SomeClass *aPointer = &anObject;

আপনি পয়েন্টারকে সম্মান করে এবং সেই ঠিকানায় কোনও মেথড কল করতে কোনও অবজেক্টের পদ্ধতি ব্যবহার করতে সক্ষম হতে:

(*aPointer).method();

যা তীর অপারেটর দিয়ে লেখা যেতে পারে:

aPointer->method();

তীর অপারেটরের উপস্থিতির মূল কারণ হ'ল এটি খুব সাধারণ কাজটির টাইপিংকে সংক্ষিপ্ত করে এবং পয়েন্টারটিকে অবলম্বন করার আশেপাশে প্রথম বন্ধনীগুলি ভুলে যাওয়াও সহজ। আপনি যদি প্রথম বন্ধনীগুলি ভুলে গেছেন। অপারেটর শক্তিশালী আবদ্ধ হবে * অপারেটর এবং আমাদের উদাহরণটিকে এইভাবে সম্পাদন করবে:

*(aPointer.method()); // Not our intention!

অন্যান্য উত্তরগুলির মধ্যে কয়েকটিতে উভয়ই উল্লেখ করেছে যে সি ++ অপারেটরগুলি ওভারলোড হতে পারে এবং এটি সাধারণ নয়।


8
new SomeClass()একটি পয়েন্টার ( SomeClass *) দেয়, SomeClassবস্তুটি নয়। এবং আপনি ঘোষণা দিয়ে শুরু করেন anObjectএবং aPointerতবে আপনি pপরে ব্যবহার করছেন ।
মুসফিল

সামগ্রিকভাবে এই ব্যাখ্যা তাত্ত্বিকভাবে খুব উপযুক্ত, কেবলমাত্র বস্তুর পরিবর্তন এটিকে কিছুটা সংশ্লেষিত করে তোলে। তবে প্রক্রিয়াটি আরও ভালভাবে বর্ণিত হয়েছে
কোড ম্যান

17

সি ++ 0 এক্সে অপারেটর একটি দ্বিতীয় অর্থ পায় যা কোনও ফাংশন বা ল্যাম্বডা এক্সপ্রেশনের রিটার্নের ধরণকে নির্দেশ করে

auto f() -> int; // "->" means "returns ..."

1
প্রযুক্তিগতভাবে এটি স্পেকিং করা এখন আর কোনও "অপারেটর" নেই, নাকি?
মার্টিন বা

6
@ মার্টিন বেশিরভাগ লোকেরা এমন অনেক কিছুর জন্য "অপারেটর" শব্দটি ব্যবহার করেন যা গণনা মানগুলির জন্য সরাসরি ব্যবহৃত হয় না। "::" ("স্কোপ অপারেটর") এর জন্য পছন্দ করুন। স্ট্যান্ডার্ডের দৃষ্টিকোণটি এ সম্পর্কে ঠিক কী তা আমি জানি না। বিমূর্ত অর্থে, কেউ "->" দেখতে পারছেন ফাংশনাল অপারেটর হিসাবে হ্যাশেল অপারেটরের মতো একটি রিটার্ন টাইপের প্রকারের (পরামিতি) ম্যাপিং করে, "-> "ও লেখা আছে।
জোহানেস স্কাউব -

6
আমি আত্মসমর্পণ করছি! :
মার্টিন বা

2
@ জোহানেসচাব-লিটব: ::আসলে .বা ->অপারেটার হিসাবে কাজ করে এবং স্ট্যান্ডার্ডে তাকে "স্কোপ রেজুলেশন অপারেটর" বলা হয়।
Musiphil

13

আমি বেশিরভাগ এটিকে ডান থেকে বামে পড়ে "ইন" কল করি

foo->bar->baz = qux->croak

হয়ে:

"ফু-এ বারে বাজ চতুর্থ হয়ে যায়


1

-> আপনি পয়েন্টার পেয়েছেন যা তথ্য অ্যাক্সেস করার সময় ব্যবহৃত হয়।

উদাহরণস্বরূপ, আপনি এই জাতীয় টাইপ ইন্টিওয়ারের ভেরিয়েবলের জন্য পয়েন্টার পিটিআর তৈরি করতে পারেন:

int* prt = &intVar;

তারপরে আপনি কেবলমাত্র সেই পয়েন্টারটিকে ডিফারেন্সিং করে তার উপর ফো এর মতো কোনও ফাংশন ব্যবহার করতে পারেন - সেই ভেরিয়েবলের মেমরি অবস্থানের সংখ্যাসূচক মানটির পরিবর্তে পয়েন্টারটি যে ভ্যারিয়েবলটিতে নির্দেশ করে সেটিতে ফাংশনটি কল করতে:

(*ptr).foo();

এখানে প্রথম বন্ধনী ছাড়া, সংকলক এটি হিসাবে বুঝতে হবে *(ptr.foo()) অপারেটর প্রাধান্যের কারণে পারে যা আমরা চাই না।

এটি আসলে টাইপিংয়ের মতোই

ptr->foo();

->যে পয়েন্টার হিসাবে dereferences, এবং তাই ফাংশন কলfoo() ভেরিয়েবলটিতে যা আমাদের জন্য পয়েন্টারটি নির্দেশ করে।

একইভাবে, আমরা ->কোনও শ্রেণীর সদস্যকে অ্যাক্সেস করতে বা সেট করতে ব্যবহার করতে পারি :

myClass* ptr = &myClassMember;
ptr->myClassVar = 2; 

0

আপনি কোনও ফাংশন সংজ্ঞায়িত করতে -> ব্যবহার করতে পারেন।

auto fun() -> int
{
return 100;
}

এটি ল্যাম্বডা নয়। এটি সত্যিই একটি ফাংশন। "->" ফাংশনটির রিটার্ন টাইপ নির্দেশ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.