সি ++ থেকে অবজেক্টিভ-সি কতটা আলাদা? [বন্ধ]


171

সিনট্যাক্স, বৈশিষ্ট্য, দৃষ্টান্ত, ফ্রেমওয়ার্ক এবং গ্রন্থাগারগুলির ক্ষেত্রে অবজেক্টিভ-সি এবং সি ++ এর মধ্যে প্রধান পার্থক্যগুলি কী কী?

* গুরুত্বপূর্ণ: আমার লক্ষ্য দুটি ভাষার মধ্যে পারফরম্যান্স যুদ্ধ শুরু করা নয়। আমি কেবল সত্যিকারের কঠিন তথ্য চাই। আসলে, আমার প্রশ্নটি পারফরম্যান্সের সাথে সম্পর্কিত নয়! বিষয়গত মনে হতে পারে এমন কোনও কিছুর জন্য উত্স দিন।


2
এই গাইডটি আমার দেখা সেরা তুলনা দেয়।
লীরাণুনা

@ অস্কার কেজলিন: ম্যাক এবং লীরানুনার উত্তর দুটিই দুর্দান্ত উত্তর। আমি উদ্দেশ্যমূলকভাবে সিদ্ধান্ত নিতে পারি না কোনটি সবচেয়ে ভাল কারণ উভয়ই একে অপরের উত্তরকে পরিপূরক করে।
সতর্কতা

@ সতর্কতা ভালভাবেই আমি জানি (এর মধ্যে প্রায়ই আমি নিজেই হোঁচট খাই)। উত্তর হিসাবে সম্ভবত শীর্ষটিকে চিহ্নিত করুন যা আমি যখন সিদ্ধান্ত নিতে পারি না তখনই তা করি। আমি যখন পছন্দ করি তখন
উত্তরগুলি

1
প্রথম উত্তর এবং তদ্বিপরীত
লি টেলর

উত্তর:


185

কিছু প্রধান পার্থক্যের সংক্ষিপ্ত তালিকা:

  • সি ++ একাধিক উত্তরাধিকারের অনুমতি দেয়, উদ্দেশ্য-সি দেয় না।
  • সি ++ এর বিপরীতে, অবজেক্টিভ-সি পদ্ধতির পরামিতিগুলির নামকরণের অনুমতি দেয় এবং পদ্ধতি স্বাক্ষরে কেবলমাত্র প্যারামিটারের নাম এবং প্রকার এবং রিটার্নের ধরণের (নীচে বামবাম এবং চকের মন্তব্য দেখুন) অন্তর্ভুক্ত থাকে। তুলনায়, একটি সি ++ সদস্য ফাংশন স্বাক্ষরে ফাংশনের নাম পাশাপাশি পরামিতি / রিটার্নের ধরণ (তাদের নাম ব্যতীত) থাকে।
  • সি ++ ব্যবহার bool, trueএবং false, উদ্দেশ্য সি ব্যবহারসমূহ BOOL, YESএবং NO
  • সি ++ ব্যবহার করে void*এবং nullptr, উদ্দেশ্য-সি পছন্দ করে idএবং nil
  • উদ্দেশ্য সি- SELফাংশন পয়েন্টারগুলির আনুমানিক সমতুল্য হিসাবে "নির্বাচক" (যাদের টাইপ রয়েছে ) ব্যবহার করে।
  • অবজেক্টিভ-সি একটি বার্তাপ্রেরণ দৃষ্টান্ত (একটি লা স্মার্টটাক) ব্যবহার করে যেখানে আপনি পদ্ধতি / নির্বাচনকারীদের মাধ্যমে অবজেক্টগুলিতে "বার্তা" প্রেরণ করতে পারেন।
  • অবজেক্টিভ-সি আপনাকে আনন্দের সাথে একটি বার্তা প্রেরণ করবে nil, সি ++ এর বিপরীতে যা ক্র্যাশ হয়ে যাবে যদি আপনি এর সদস্য ফাংশনটিতে কল করার চেষ্টা করেনnullptr
  • অবজেক্টিভ-সি গতিশীল প্রেরণের অনুমতি দেয়, রানটাইমের সময় কোনও বার্তার প্রতিক্রিয়া জানানো ক্লাসকে সি ++ এর বিপরীতে নির্ধারণ করা যায়, যেখানে কোন পদ্ধতিতে কোন পদ্ধতিটি আহ্বান করা হয়েছে তা সংকলনের সময় জানতে হবে (নীচে উইলহেল্টেলের মন্তব্য দেখুন)। এটি পূর্ববর্তী বিষয়টির সাথে সম্পর্কিত।
  • অবজেক্টিভ-সি "বৈশিষ্ট্য" ব্যবহার করে সদস্যের ভেরিয়েবলগুলির জন্য অ্যাকসেসরের অটোজেনারেশনকে মঞ্জুরি দেয়।
  • অবজেক্টিভ-সি selfক্লাস ইনিশিয়ালারদের (কনস্ট্রাক্টরদের মতো) নির্ধারিত করার অনুমতি দেয় এবং যদি ইচ্ছা হয় তবে সম্পূর্ণ ভিন্ন শ্রেণিতে ফিরে আসতে দেয়। সি ++ এর বিপরীতে, যেখানে আপনি কোনও শ্রেণীর একটি নতুন উদাহরণ তৈরি করেন (হয় স্ট্যাকের উপর স্পষ্টভাবে বা স্পষ্টতই মাধ্যমে new) এটি আপনার মূলত নির্দিষ্ট করা ধরণের গ্যারান্টিযুক্ত।
  • একইভাবে, অবজেক্টিভ-সিতে অন্যান্য ক্লাসগুলি পদ্ধতি কলগুলিতে বাধা দেওয়ার জন্য রানটাইম সময়ে একটি লক্ষ্য শ্রেণিকে পরিবর্তনশীলভাবে পরিবর্তন করতে পারে।
  • অবজেক্টিভ-সিতে সি ++ এর নেমস্পেস বৈশিষ্ট্যটি নেই।
  • উদ্দেশ্য-সিতে সি ++ রেফারেন্সের সমতুল্য অভাব রয়েছে।
  • অবজেক্টিভ-সিতে টেমপ্লেট নেই, পরিবর্তে পাত্রে দুর্বল টাইপিংয়ের অনুমতি দেওয়ার জন্য (উদাহরণস্বরূপ) পছন্দসই।
  • উদ্দেশ্য-সি অন্তর্নিহিত পদ্ধতিটি ওভারলোডিংকে অনুমতি দেয় না, তবে সি ++ দেয় + এটি, সি ++ এ int foo (void)এবং int foo (int)পদ্ধতির একটি অন্তর্নিহিত ওভারলোড সংজ্ঞায়িত করুন fooতবে উদ্দেশ্য-সিতে এটি অর্জনের জন্য সুস্পষ্ট ওভারলোডগুলি প্রয়োজন - (int) fooএবং - (int) foo:(int) intParam। এটি অবজেক্টিভ-সি এর নামযুক্ত পরামিতিগুলি কার্যত সি ++ এর নাম ম্যাংলিংয়ের সমতুল্য হওয়ার কারণে is
  • উদ্দেশ্য-সি আনন্দের সাথে একটি পদ্ধতি এবং একটি ভেরিয়েবলকে একই নাম ভাগ করার মঞ্জুরি দেয়, সাধারণত সি ++ এর থেকে পৃথক হবে which আমি ধারণা করি এটি ফাংশন পয়েন্টারের পরিবর্তে সিলেক্টর ব্যবহার করে অবজেক্টিভ-সি এর সাথে করার কিছু এবং এইভাবে পদ্ধতির নামগুলি আসলে "মান" না রাখে।
  • অবজেক্টিভ-সি স্ট্যাকের উপর অবজেক্ট তৈরি করার অনুমতি দেয় না - সমস্ত বস্তু গাদা থেকে বরাদ্দ করতে হবে (হয় স্পষ্টভাবে কোনও allocবার্তা দিয়ে, বা কোনও যথাযথ কারখানার পদ্ধতিতে)।
  • সি ++ এর মতো অবজেক্টিভ-সি এর স্ট্রোক এবং ক্লাস উভয়ই রয়েছে। তবে, যেখানে সি ++ এ তাদের প্রায় একইরূপে বিবেচনা করা হয়, উদ্দেশ্য-সিতে তাদের বুনোভাবে আলাদাভাবে চিকিত্সা করা হয় - উদাহরণস্বরূপ, আপনি স্ট্যাকের উপর স্ট্রাক্ট তৈরি করতে পারেন

আমার মতে, সম্ভবত সবচেয়ে বড় পার্থক্যটি সিনট্যাক্স। আপনি উভয় ভাষায় মূলত একই জিনিস অর্জন করতে পারেন, তবে আমার মতে সি ++ বাক্য গঠন সহজতর হয়েছে যখন কিছু উদ্দেশ্যমূলক-সি এর বৈশিষ্ট্যগুলি নির্দিষ্ট কিছু কাজ করে (যেমন জিইউআই নকশা) গতিশীল প্রেরণের জন্য সহজ ধন্যবাদ।

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

আমার এও উল্লেখ করা উচিত যে আমি নিজেই উদ্দেশ্য-সি শিখতে শুরু করেছি এবং উপরোক্ত অনেকগুলি সম্ভবত পুরোপুরি সঠিক বা সম্পূর্ণ নাও হতে পারে - আমি যদি ক্ষমা প্রার্থনা করি তবে উন্নতির জন্য পরামর্শগুলি স্বাগত জানাই।

সম্পাদনা: নিম্নলিখিত মন্তব্যে উত্থাপিত পয়েন্টগুলি সম্বোধন করতে আপডেট হয়েছে, তালিকায় আরও কয়েকটি আইটেম যুক্ত করেছে।


8
শালীন তালিকা; একটি সংশোধন এগুলি "নামকরণের পরামিতি" নয়, তবে "আন্তঃবাহিত পরামিতি"। নামযুক্ত এবং "কীওয়ার্ড আর্গুমেন্টগুলি" এই ভেবে বিভ্রান্তির দিকে নিয়ে যায় যে পদ্ধতির নামের কিছু উপসেট বাদ দেওয়া যেতে পারে। এটা হতে পারে না.
বুবুম

7
আপনি সবচেয়ে গুরুত্বপূর্ণ পার্থক্য তালিকাভুক্ত করতে ভুলে গেছেন: অবজেক্ট-সি ডায়নামিক প্রেরণ ব্যবহার করে, যেখানে সি ++ স্থির প্রেরণ ব্যবহার করে disp অন্য কথায়, অবজেক্টিভ-সি সংকলক দ্বারা সংকলিত কোডটিতে রানটাইমের সময় নির্ধারিত কোনও বার্তার প্রতিক্রিয়া জানাতে ক্লাস দায়বদ্ধ থাকবে; একটি সি ++ সংকলক দ্বারা সংকলিত কোডটিতে এই তথ্যটি গণনা করা হয় এবং সংকলনের সময় সংকলিত হয়।
উইলহেমটেল

9
@ উইলহেলমটেল: সি ++ সংকলক সংকলনের সময় কেবলমাত্র সুপারক্লাস জানে। চলমান সময়ে আসল শ্রেণি যে কোনও বংশধর হতে পারে। এটি গতিশীল প্রেরণেরও একটি রূপ, তবে উদ্দেশ্য সি তে ব্যবহৃত ফর্মটি একই নয়, কেবল সেই প্রযুক্তিগত পদগুলির সাথে সাবধান!
নরম্যান রামসে

5
+1 ভাল তালিকা। যাইহোক, উদ্দেশ্য সি এছাড়াও ব্যবহার void*এবং NULLশুধু অবজেক্টের জন্য নয়। আপনি ওবজে-সি-তে যে কোনও সি-স্টাইল পয়েন্টার ব্যবহার করতে পারেন এবং অনেকগুলি এপিআই কল প্রকৃতপক্ষে রেফারেন্স সহ মানগুলি পাস বা প্রত্যাবর্তন করে, সেক্ষেত্রে NULLপ্রায়শই ব্যবহৃত হয়।
কুইন টেলর

3
@ উইলহেলমটেল - উদ্দেশ্য-সি সম্পর্কে আমি কিছুই জানি না, তবে সি ++ এ আপনি ক্রিয়াকলাপের জন্য একটি ফাংশন কলটির জন্য আলাদা শ্রেণীর প্রতিক্রিয়া জানাতে পারেন, তবে আপনার বেস ক্লাসে পয়েন্টারের অ্যারের মতো কিছু হওয়া দরকার, এবং তারপরে অ্যাকটিউয়াল ক্লাসগুলি এগুলি "ঝুলন্ত" রয়েছে। যদিও সেখানে সমস্ত শ্রেণীর উপ-শ্রেণি থাকা দরকার, একটি পদ্ধতি কল ডাব্লুআইএল, রান-টাইমে ক্লাসের উপর নির্ভর করে বিভিন্ন পদ্ধতি কল করবে।
কেভিন অ্যান্ডারসন

33

যদিও এগুলি উভয়ই সি-তে বদ্ধ, তারা দুটি সম্পূর্ণ ভিন্ন ভাষা।

একটি প্রধান পার্থক্য হ'ল অবজেক্টিভ-সি প্রেরণের জন্য রানটাইম-সিদ্ধান্তের উপর দৃষ্টি নিবদ্ধ করে এবং উত্তরাধিকার এবং পলিমারফিজম পরিচালনা করতে তার রানটাইম লাইব্রেরির উপর নির্ভর করে, যখন সি ++ তে সাধারণত ফোকাস থাকে স্থির, সংকলনের সময়, সিদ্ধান্তের উপর।

লাইব্রেরি সম্পর্কে, আপনি উভয় ভাষায় প্লেইন সি লাইব্রেরি ব্যবহার করতে পারেন - তবে তাদের স্থানীয় গ্রন্থাগারগুলি সম্পূর্ণ আলাদা।

আগ্রহের বিষয় হ'ল আপনি উভয় ভাষা মিশ্রিত করতে পারেন (কিছু সীমাবদ্ধতার সাথে)। ফলাফলটিকে অবজেক্টিভ-সি ++ বলা হয় ।


আপডেট হওয়া লিঙ্ক: উদ্দেশ্য-সি ++
আইসিসিকাল

6

তারা সম্পূর্ণ আলাদা। সি ++ এর চেয়ে স্মার্টটালকের সাথে ওজেক্টিভ সিতে বেশি মিল রয়েছে (ভাল, সিনট্যাক্স বাদে, সত্যিই)।


6

আমার মাথার উপরে:

  1. স্টাইলস - ওবজে-সি গতিশীল, সি ++ সাধারণত স্থিতিশীল
  2. যদিও তারা উভয়ই ওওপি, আমি নিশ্চিত যে সমাধানগুলি আলাদা হবে।
  3. বিভিন্ন অবজেক্ট মডেল (সি ++ এর সংকলন-টাইপ টাইপ সিস্টেমের দ্বারা সীমাবদ্ধ)।

আমার কাছে সবচেয়ে বড় পার্থক্য হ'ল মডেল সিস্টেম। ওবজে-সি আপনাকে মেসেজিং এবং অন্তর্মুখি করতে দেয় তবে সি ++ এর মধ্যে চির-শক্তিশালী টেম্পলেট রয়েছে।

প্রতিটি তাদের শক্তি আছে।


5

অন্যরা যেমন বলেছে, অবজেক্টিভ-সি এটি কীভাবে বনাম সি ++ এর মোটামুটি স্থিতিশীল রাজ্যের বিষয়ে চিন্তা করে তার দিক থেকে অনেক বেশি গতিশীল।

অবজেক্টিভ-সি, অবজেক্ট-ওরিয়েন্টেড ভাষাগুলির স্মার্টটাক বংশে থাকার কারণে, বস্তুর ধারণা রয়েছে যা জাভা, পাইথন এবং অন্যান্য "স্ট্যান্ডার্ড", নন-সি ++ অবজেক্ট-ওরিয়েন্টেড ভাষার সাথে একই রকম very প্রচুর গতিশীল প্রেরণ, কোনও অপারেটর ওভারলোডিং নয়, চারপাশে বার্তা প্রেরণ করুন।

সি ++ এর নিজস্ব অদ্ভুত প্রাণী; এটি বেশিরভাগ ক্ষেত্রে পরিবারের গাছের ছোট অংশকে এড়িয়ে যায়। কিছু উপায়ে, উত্তরাধিকারের জন্য সমর্থন সহ এটিতে একটি ভাল মডিউল সিস্টেম রয়েছে যা বস্তু-ভিত্তিক প্রোগ্রামিংয়ের জন্য ব্যবহার করতে সক্ষম হতে পারে to বিষয়গুলি আরও স্থিতিশীল (উদাহরণস্বরূপ ওভাররিডযোগ্য পদ্ধতিগুলি ডিফল্ট নয়)।


4

অবজেক্টিভ-সি হ'ল সি-এর আরও নিখুঁত সুপারসেট এবং void*স্ট্রাকচার পয়েন্টারে অবজেক্টিভ-সি ইম্পিসিটিভ কাস্টিং অনুমোদিত।

Foo* bar = malloc(sizeof(Foo));

সি ++ সংকলন করবে না যতক্ষণ না voidপয়েন্টারটি স্পষ্টভাবে কাস্ট করা হয়:

Foo* bar = (Foo*)malloc(sizeof(Foo));

প্রতিদিনের প্রোগ্রামিং এর সাথে এর প্রাসঙ্গিকতা শূন্য, কেবল একটি মজাদার ট্রিভিয়া সত্য।


দ্বিতীয় উদাহরণটি সি ++ কোড নয়। আপনি সি ++ সংকলকটি সংকলনের চেষ্টা করার সময় এটি সি কোড যা আপনাকে একটি ত্রুটি দিয়েছে। আপনি যদি Foo* bar = reinterpret_cast< Foo* >(malloc(sizeof(Foo));আসলটির কাছাকাছি পুরানো সি ++ চান তবে আপনি লিখতে চাইলে ইনপ্লেস কনস্ট্রাক্টর ব্যবহার করতে পারেন .. তবে আজকের আধুনিক সি ++ এর মতো auto bar = new Foo(constructorArg);আসলে আপনার ম্যালোক দরকার নেই, এবং হয় ক্যালিক, আপনি ব্যবহার করতে পারেন std::vector::reserve, এবংstd::vector::emplace_mack
xakepp35

3

ওবিজে-সি এর নিজস্ব ভাষায় অনেক বেশি গতিশীল ক্ষমতা রয়েছে, অন্যদিকে কিছু গতিশীল ক্ষমতা সহ সি ++ আরও বেশি সংকুচিত হয়-

ইন, সি ++ প্যারামেট্রিক পলিমারফিজমটি সংকলন-সময় পরীক্ষা করা হয়, যেখানে ওবজে-সি-তে প্যারামেট্রিক পলিমারফিজম গতিশীল প্রেরণের মাধ্যমে অর্জন করা হয় এবং সংকলন-সময়ে পরীক্ষা করা হয় না।

ওবজ-সি প্রকৃতির খুব গতিশীল। রান-টাইমের সময় আপনি ক্লাসে পদ্ধতি যুক্ত করতে পারেন। এছাড়াও, ক্লাসগুলি দেখার জন্য এটি রান-টাইমে অন্তর্মুখী রয়েছে। সি ++ এ, শ্রেণীর সংজ্ঞা পরিবর্তন করতে পারে না এবং সমস্ত অন্তর্নির্ধারণটি সংকলন-সময়ে করা উচিত। যদিও, ওবজে-সি এর গতিশীল প্রকৃতি সি ++ এ ফাংশনগুলির মানচিত্র (বা এর মতো কিছু) ব্যবহার করে অর্জন করা যেতে পারে, এটি এখনও ওবজ-সি এর চেয়ে বেশি ভার্বোস।

সি ++ তে, আরও অনেক চেক রয়েছে যা সংকলনের সময় করা যেতে পারে। উদাহরণস্বরূপ, একটি বৈকল্পিক ধরণের (ইউনিয়নের মতো) ব্যবহার করে সংকলক প্রয়োগ করতে পারে যে সমস্ত ক্ষেত্রে লিখিত বা পরিচালিত। সুতরাং আপনি সমস্যার প্রান্তের কেসগুলি পরিচালনা করার কথা ভুলে যাবেন না। তবে, এই সমস্ত চেকগুলি সংকলনের সময় একটি মূল্যে আসে। সি ++ এর চেয়ে কমপাইল করতে ওবজ-সি অনেক দ্রুত।


3
আপনি যদি দাম সম্পর্কে কথা বলতে যাচ্ছেন তবে ন্যায্য হন! বিপরীতে, ওজজ-সি সি ++ এর চেয়ে রানটাইম সময়ে গতিশীল পদ্ধতি কলগুলি সমাধান করার ক্ষেত্রে অনেক ধীর। এবং আমি যুক্তি দিয়েছি যে সংকলনের গতি রানটাইমের গতির তুলনায় তুলনামূলক তুচ্ছতা। আমি নিশ্চিত যে আরও গতিশীল প্রেরণের কারণে ওবজ-সি অনেকগুলি সুবিধা সরবরাহ করে, তবে সেখানে বাণিজ্য রয়েছে।
আন্ডারস্কোর_ডি

1
সত্য, রানটাইম বনাম কম্পাইল সময় ব্যয়ের মধ্যে একটি বাণিজ্য রয়েছে। তবে সংকলন সময় সর্বদা তুচ্ছ নয়। রানটাইমটিতে খুব দ্রুত কোড তৈরি করার সময় সি ++ (যেমন বুস্ট.স্প্রিট হিসাবে) ভারী মেটাপ্রোগ্রামিং এবং ইডিএসএল লাইব্রেরিগুলি ব্যবহার করা সংকলনের সময়টিতে কঠোর প্রভাব ফেলতে পারে।
পল ফুলটজ দ্বিতীয়

1
অবশ্যই, আমি সহজ কোডবেসের পিওভির সাথে তুলনামূলকভাবে ওভারসিম্লিফাই করছিলাম ... খুব জটিল কোডবেসের সাহায্যে ছোট ছোট পরিবর্তনগুলি পরীক্ষা করার জন্য পুনরায় গঠন করা বিকাশকে খুব ক্লান্তিকর করে তুলতে পারে, যা তুচ্ছ ঘটনা নয়। তবে এটি কি আমরা সত্যই দুজনের মধ্যে তুলনা করতে পারি? এই জাতীয় লাইব্রেরিগুলি, সি ++ সংকলন-সময়ের বৈশিষ্ট্যগুলির উপর নির্ভরশীল, কোনওভাবে উদ্দেশ্য-সিতে পুনরায় কল্পনা করা যেতে পারে এবং আরও দ্রুত সংকলনের জন্য দেখানো যেতে পারে? উদাহরণস্বরূপ, "ওবজ-সি সি ++ এর তুলনায় সংকলনের চেয়ে অনেক দ্রুত" সমমানের কোডবেসগুলিকে বোঝায় যেগুলির জন্য একটি প্রতিরূপযোগ্য স্পিডআপ পরিমাপ করা যায়? অন্যথায় আমরা আপেল বনাম কমলা বাড়ানোর জন্য সময়কে তুলনা করছি।
আন্ডারস্কোর_১
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.