'নতুন অপারেটর' এবং 'অপারেটর নতুন' এর মধ্যে পার্থক্য?


126

"নতুন অপারেটর" এবং "অপারেটর নতুন" এর মধ্যে পার্থক্য কী?


3
হাই, আপনি দয়া করে প্রশ্নটি পরিষ্কার করতে পারেন? দেখে মনে হচ্ছে কোথাও টাইপো আছে।
দিমা মালেনকো

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

2
কিভাবে যে কি. আমি নতুন এবং অজানা।
সন্দীপ

উত্তর:


127

আমি দু'জনের মধ্যে কিছুটা আরও ভাল পার্থক্য করার জন্য জিনিসগুলিকে আলাদাভাবে বাক্য বানানোর চেষ্টা করি তবে এটি কোনও ক্ষেত্রেই ভাল প্রশ্ন।

অপারেটর নতুন হ'ল একটি ফাংশন যা কাঁচা মেমরি বরাদ্দ করে - কমপক্ষে ধারণাগতভাবে, এটি এর চেয়ে আলাদা নয় malloc()। যদিও আপনি নিজের কন্টেনারের মতো কিছু না লিখে এটি মোটামুটি অস্বাভাবিক, তবুও আপনি সরাসরি অপারেটরকে নতুন কল করতে পারেন:

char *x = static_cast<char *>(operator new(100));

বিশ্বব্যাপী, বা একটি নির্দিষ্ট শ্রেণীর জন্য নতুন ওভারলোড অপারেটরটিও সম্ভব। আইআইআরসি, স্বাক্ষরটি হ'ল:

void *operator new(size_t);

অবশ্যই, আপনি যদি কোনও অপারেটর নতুন (কোনও গ্লোবাল বা কোনও শ্রেণীর জন্য) ওভারলোড করেন তবে আপনিও চাইবেন / ম্যাচিং অপারেটরটিও মুছে ফেলুন over এটির মূল্যের জন্য, অ্যারেগুলির জন্য মেমরি বরাদ্দ করতে ব্যবহৃত একটি পৃথক অপারেটরও নতুন [] রয়েছে - তবে আপনি পুরো গণ্ডগোলটিকে পুরোপুরি উপেক্ষা করার চেয়ে আরও ভাল।

নতুন অপারেটরটি হ'ল আপনি সাধারণভাবে ফ্রি স্টোর থেকে কোনও অবজেক্ট তৈরি করতে ব্যবহার করেন:

my_class *x = new my_class(0);

উভয়ের মধ্যে পার্থক্য হ'ল অপারেটর নতুন কেবল কাঁচা মেমরি বরাদ্দ করে, অন্য কিছুই। নতুন অপারেটর মেমরি বরাদ্দ করতে অপারেটরটি নতুন ব্যবহার করে শুরু করে, তবে তারপরে এটি সঠিক ধরণের অবজেক্টের জন্য কনস্ট্রাক্টরকে অনুরোধ করে, ফলস্বরূপ ফলাফলটি সেই মেমরিতে তৈরি একটি বাস্তব লাইভ অবজেক্ট। যদি সেই অবজেক্টটিতে অন্য কোনও অবজেক্ট থাকে (হয় এম্বেড করা বা বেস ক্লাস হিসাবে) সেই কনস্ট্রাক্টররাও অনুরোধ করা হয়েছে।


18
+1, ভিন্ন বাক্য হিসাবে, স্ট্যান্ডার্ডটি চারদিকে নতুন এক্সপ্রেশন ব্যবহার করে এবং কেবল একবার এটি কলটির অবস্থান উল্লেখ করতে নতুন অপারেটর ব্যবহার করে । আমি একই কাজ করতে ঝোঁক: বরাদ্দকারীর জন্য অপারেটর নতুন এবং ব্যবহারের জন্য নতুন এক্সপ্রেশন
ডেভিড রদ্রিগেজ - ড্রিবিয়াস

3
একটি নতুন এক্সপ্রেশন হ'ল সম্পূর্ণ বাক্যাংশ যা নতুন দিয়ে শুরু হয়। সুতরাং আপনি এর "নতুন" অংশটিকে কী বলে? যদি নতুন অপারেটরটিকে কল করা ভুল হয় তবে আমাদের "সাইজেরফোন" সাইজেরফ অপারেটর বা & ঠিকানা-অপারেটর (যখন এটি একটির মতো আচরণ করে) কল করা উচিত নয়।
কাজ

1
কাজলের বক্তব্য অনুসরণ করে, সম্ভবত এই প্রশ্নটি পুনর্বিবেচনা করা উচিত, নতুন অপারেটর এবং অপারেটর নতুন অপারেটরের মধ্যে পার্থক্য কী? :)
সিএস

2
"অপারেটর নতুন" বনাম "নতুন কীওয়ার্ড"
ব্যবহারকারী 997112

2
@ এন্ট্রেড: আপনি এ জাতীয় কিছু দিয়ে মুক্তি চাইবেন operator delete(x);
জেরি কফিন

35

"অপারেটর নতুন"

class Foo
{
public:
        void* operator new( size_t );
}

"নতুন অপারেটর":

Foo* foo = new Foo();

এই উদাহরণে, new Foo()কলFoo::operator new()

অন্য কথায়, "নতুন অপারেটর" "কল করে" operator new()"ঠিক যেমন + অপারেটর কলoperator +()


13
newসি ++ এ অপারেটর নয়। sizeofউদাহরণস্বরূপ, একটি অপারেটর, কিন্তু newএবং deleteনয়। newএবং deleteকীওয়ার্ড এবং সিনট্যাকটিকাল কনস্ট্রাক্টস যা এই কীওয়ার্ড ফর্মগুলিকে নতুন এক্সপ্রেশন এবং মোছা-এক্সপ্রেশন বলে
এএনটি

2
আহ, যদি কিছু sizeofহয় তবে সিনট্যাকটিক কনস্ট্রাক্ট newএবং deleteএটি উভয়ই বৈধ, আইনী, ওভারলোড-সক্ষম অপারেটর। আমি যা দেখেছি সব থেকে newএবং deleteউভয়ই অপারেটর। [সিপিএলস্প্লস.কম] দেখুন [সিপিপ্লসপ্লাস.com/ডোক / টিউটোরিয়াল / স্লাসস ২/]
অস্টিন হাইড

7
ত্রুটিপূর্ণ. অফিসিয়াল সি ++ টার্মিনোলজিটি কোনও ওয়েব সাইটের দ্বারা নয়, ভাষার স্পেসিফিকেশন দ্বারা সংজ্ঞায়িত করা হয়। ভাষার নির্দিষ্টকরণে "নতুন অপারেটর" এর মতো কোনও তাপ নেই, তবে " operator newফাংশন" এর মতো শব্দ রয়েছে । আবার, sizeof"অপারেটর" হিসাবে অভিহিতকে বর্ণিত হয়, newএবং কখনই তাকে অপারেটর হিসাবে উল্লেখ করা deleteহয় না
এএনটি

6
অ্যান্ড্রেটি: ভুল। সি ++ স্ট্যান্ডার্ড একটি অপারেটরকে 'নতুন' কল করে, দেখুন 13.5 / 1।

3
@ অ্যান্ড্রেটি: আমি ভেবেছিলাম আপনি যেমন করতেন, সেই অপারেটর নতুন ছিল বরাদ্দকারী এবং নতুন-এক্সপ্রেশন ব্যবহারগুলি। আমি পর্যালোচনা করে দেখেছি যে §5.3.4 / 3 এ বর্তমান স্ট্যান্ডার্ডটি নতুন অপারেটর শব্দটি ব্যবহার করে । পরে §5.3.4 / 8-এ এটি অপারেটর নতুন এবং অপারেটর নতুন
ডেভিড রডগ্র্যাগজ - ড্রিবিয়াস 16:30 '

22

স্কট মায়ার্স এর আরও কার্যকর সি ++ বইয়ের উদ্ধৃতিটি নিম্নলিখিত:

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


7
শব্দটি স্পষ্টতই বইটির লেখক দ্বারা উদ্ভাবিত হয়েছে (বা, সম্ভবত, কিছু অপ্রচলিত উত্স থেকে ধার করা)। আনুষ্ঠানিক সি ++ নামকরণে "নতুন অপারেটর" এর মতো শব্দ নেই।
এএনটি

2
@ অ্যান্ড্রেটিট: আমি "নতুন অপারেটর" এর জন্য সি ++ 11 অনুসন্ধান করেছি এবং এটি চার জায়গায় রেফারেন্স পেয়েছি। বিশেষত, "প্লেসমেন্ট নতুন অপারেটর"
মোগিং হাঁস

11

"নতুন অপারেটর" এবং "অপারেটর নতুন" এর মধ্যে কোনও পার্থক্য নেই। উভয়ই একই জিনিসটি উল্লেখ করে: অতিরিক্ত-লোডযোগ্য / প্রতিস্থাপনযোগ্য operator newফাংশন যা সাধারণত নতুন-এক্সপ্রেশন দ্বারা নির্মিত সামগ্রীর জন্য কাঁচা মেমরি বরাদ্দ করে

নোট যে তন্ন তন্ন ভাষাটি নির্দিষ্টকরণে শব্দই উপস্থিত নেই (যা সরকারী পরিভাষার সংজ্ঞায়িত উত্স)।

আপনি যখন newকোনও প্রোগ্রাম তৈরি করতে আপনার প্রোগ্রামে ব্যবহার করেন, তখন এটি নতুন এক্সপ্রেশন বলেনতুন-এক্সপ্রেশন কীওয়ার্ড নিয়ে গঠিতnew এবং অতিরিক্ত অন্বিত অংশের ব্যাকরণ দ্বারা সংজ্ঞায়িত। এই অভিব্যক্তিটির সিনট্যাক্সের কোনও অংশই কখনও "অপারেটর" হিসাবে উল্লেখ করা হয়নি।

কাঁচা মেমরি বরাদ্দকরণ কার্যটি operator newসরকারীভাবে " operator newফাংশন" হিসাবে উল্লেখ করা হয় । নোট করুন যে শব্দগুলি operatorএবং newএই ক্রমটি কেবল দুটি পৃথক সি ++ ভাষার কীওয়ার্ড। তারা একটি ইংরেজি শব্দ "অপারেটর নতুন" গঠন করে না। ভাষার স্পেসিফিকেশনের কোথাও আপনি ইংরেজি শব্দ হিসাবে "অপারেটর নতুন" এর কোনও উল্লেখ খুঁজে পাবেন না find প্রতিবার এটি কেবল দুটি স্বতন্ত্র কীওয়ার্ডের সংমিশ্রণ যা মেমরি বরাদ্দকরণের ক্রিয়াকলাপের জন্য ডিক্লেয়ারেশন সিনট্যাক্স তৈরি করে।

আবার, পুনঃসূচনা: আনুষ্ঠানিকভাবে সি ++ তে "অপারেটর নতুন" বা "নতুন অপারেটর" এর মতো ইংরেজি ভাষার কোনও পদ নেই। পূর্ববর্তী ক্রমটি ইংরেজী শব্দ হিসাবে নয়, কীওয়ার্ডের নিছক সংমিশ্রণ হিসাবে ভাষা নির্দিষ্টকরণে উপস্থিত রয়েছে। পরেরটি মোটেই উপস্থিত নেই।


14
আপনি কিছু পেডেন্টিক মানসিক-হস্তমৈথুনে হারিয়ে গেছে বলে মনে হচ্ছে। মান দাগগুলিতে অস্পষ্ট এবং এটি তাদের মধ্যে একটি। এটি "নতুন অপারেটর নিয়ে আলোচনা করা" যেমন "প্লাস অপারেটর নিয়ে আলোচনা" বা "অপারেটর নিয়ে আলোচনা" করার মতো করে তোলে ঠিক ততটাই উপলব্ধি করে।

7

আপনি যখন কোনও নতুন অবজেক্ট তৈরি করেন তখন অপারেটর নতুন ব্যবহার করে মেমরি বরাদ্দ করা হয় তবে মেমরিটি আরম্ভ করার জন্য কনস্ট্রাক্টরকে অনুরোধ করা হয় । নতুন অপারেটর উভয় বরাদ্দ এবং initialisation, যেখানে যেমন অপারেটর নতুন শুধুমাত্র বরাদ্দ করে থাকে।


6

ওপির প্রশ্নটি সঠিকভাবে বর্ণিত হয় না। 'অপারেটর নতুন' এবং 'নতুন এক্সপ্রেশন' এর মধ্যে পার্থক্য হিসাবে পর্যায় নেওয়া ভাল? ' দ্রষ্টব্য 'অপারেটর নতুন' প্রায়শই 'অপারেটর নতুন ফাংশন' কেও বোঝায়।

এবং চারপাশে প্রচুর সঠিক উত্তর রয়েছে, নীচে আমার:

1> কাঁচা মেমরি বরাদ্দ করতে 'নতুন এক্সপ্রেশন' কল 'অপারেটর নতুন', তারপরে কল কনস্ট্রাক্টর

apple * p = new apple(); //new expression

2> 'অপারেটর নতুন' কেবল কাঁচা মেমরি বরাদ্দ করে, ম্যালোকের চেয়ে বেশি পার্থক্য নয়

void* mem = operator new(sizeof(apple)); //just like calling malloc()
apple* p2 = new(mem) apple(1); //call construct here using placement new.

2

নতুন অপারেটর : সি ++ নতুন অপারেটর ব্যবহার করে অবজেক্টগুলির গতিশীল বরাদ্দ সমর্থন করে। নতুন অপারেটরটি ফ্রি স্টোর নামক একটি পুল থেকে বস্তুর জন্য মেমরি বরাদ্দ করে। নতুন অপারেটর বিশেষ ফাংশন অপারেটরকে নতুন বলে।

অপারেটর নতুন : অনুরোধটি যদি সংগ্রহের শূন্য বাইটের জন্য হয় তবে অপারেটর নতুন কোনও পৃথক বস্তুর কাছে পয়েন্টার দেয় (এটি অপারেটরকে পুনরায় কল বিভিন্ন পয়েন্টার দেয়)। বরাদ্দ অনুরোধের জন্য যদি পর্যাপ্ত মেমরি না থাকে তবে অপারেটর নতুন করে NULL দেয় বা একটি ব্যতিক্রম ছুঁড়ে দেয়। অপারেটরের নতুনের পক্ষে প্রথম যুক্তিটি অবশ্যই আকার_টি (এসটিডিডিএফ.এইচ সংজ্ঞায়িত একটি প্রকারের) হতে হবে এবং ফেরতের প্রকারটি সর্বদা অকার্যকর থাকে।

আরও তথ্যের জন্য এখানে একটি এমএসডিএন লিঙ্ক রয়েছে:

অপারেটর নতুন ফাংশন

নতুন অপারেটর


1
সামান্য ব্যাখ্যা: নন-প্লেসমেন্ট অপারেটরকে সর্বদা বরাদ্দ ব্যর্থতা (মান অনুযায়ী) এড়াতে হবে; এবং স্থান নির্ধারণের ফর্মগুলি যেমন ::new(std::nothrow)হয় তা করতে পারে (সেই নির্দিষ্ট উদাহরণটি নাল পয়েন্টারটি দেয়)।

1
  1. নতুন একটি অপারেটর পাশাপাশি একটি কীওয়ার্ড।

    [১] ২.১৩ এ এবং ২.১২ এ দেখুন।

  2. new দুটি কাজ করে: টি * টি = নতুন টি (আরগ);

    1) বস্তুর জন্য মেমরি বরাদ্দ করুন: অকার্যকর * পিটিআর = অপারেটর নতুন (মাপের (টি));

    // অপারেটর নতুন একটি ফাংশন (ঠিক সি তে ম্যালোকের মতো), অপারেটর নয় ((দেখুন [1] 3.7.4 এ)। তবে আইটেম [[২] বলেছিল এটিও অপারেটর। আমার মতে, অপারেটর এবং ফাংশনের মধ্যে পার্থক্যটি সামান্য এবং আপনি যখন এটি স্মরণ করতে পারেন যে ওভারলোডিং অপারেটর ফাংশন দ্বারা প্রয়োগ করা হয় you

    // আমরা এই অপারেটর / ফাংশনটি ওভারলোড করতে পারি (অপারেটর নতুন) আমরা এখানে যা চাই তা করতে চাই।

    2) বরাদ্দ মেমরিতে অবজেক্টটি আরম্ভ করুন: পিটিআর তে টি :: টি (আরগ) কল করুন

    // শুধুমাত্র সংকলক এটি করতে পারে। আমি বা আপনি পারবেন না।

    // এছাড়াও সংকলক সদস্য অবজেক্টের কনস্ট্রাক্টর এবং বেস ক্লাসের কনস্ট্রাক্টরের কাছে যদি টি থাকে তবে তা আহবান করবে। এবং এই অনুরোধ পুনরাবৃত্তি। কেবল সংকলকই এটি করতে পারে।

  3. সুতরাং, অপারেটর নতুন নতুন মিশনের অংশ করে, এবং কেবলমাত্র এই অংশে আমরা কিছু করতে পারি।

    [1]: আইএসও / আইইসি, এন 3690। http://ww.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf

    [২]: মায়ার্স, স্কট কার্যকর সি ++, 3 য়।

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