সি ++ তে স্ট্রাক্ট এবং ক্লাসের মধ্যে পার্থক্য কী?


441

এই প্রশ্নটি ইতিমধ্যে সি # / নেট এর প্রসঙ্গে জিজ্ঞাসা করা হয়েছিল

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

আমি একটি স্পষ্ট পার্থক্য দিয়ে শুরু করব:

  • যদি আপনি নির্দিষ্ট না করেন public:বা private:, কোনও স্ট্রাক্টের সদস্যরা ডিফল্টরূপে সর্বজনীন হয়; একটি শ্রেণীর সদস্যরা ডিফল্টরূপে ব্যক্তিগত।

আমি নিশ্চিত যে সি ++ স্পেসিফিকেশনের অস্পষ্ট কোণগুলিতে খুঁজে পাওয়ার জন্য অন্যান্য পার্থক্য রয়েছে।


6
এই লিঙ্কটি পার্থক্যগুলি ভালভাবে সংক্ষিপ্ত করে।
sjsam

1
লোকেরা কেন তখন গাছ তৈরিতে কাঠামো ব্যবহার করে? কারণ দেখে মনে হচ্ছে পার্থক্য তেমন বেশি নয়। BTW, যে একটি মহান ওয়েবসাইট @ sjsam।
JW.ZG

1
structসি এবং সি ++ এর মধ্যে পার্থক্য খুঁজছেন ? এখানে দেখুন
২২7777

@ JW.ZG "সমস্ত" লোকেরা করে না! যারা এটি করেন তারা কেবল পছন্দ করেন, বা structসি ++ এর অর্থ কী তা বুঝতে পারেন না । ;) তবে এর classপরিবর্তে আপনি কীওয়ার্ডটি ব্যবহার করতে পারবেন না এমন কোনও কারণ নেই ।
অরবিটে

উত্তর:


466

আপনি ক্লাস এবং স্ট্রাক্টের মধ্যে চতুর দ্বিতীয় পার্থক্যটি ভুলে গেছেন।

কোয়াটার স্ট্যান্ডার্ড (C ++ 98 এর মাধ্যমে C ++ 11 এর মধ্যে 11.2.2):

একটি অভাবে এক্সেস-সুনির্দিষ্টভাবে উল্লেখ করা একটি বেস বর্গ জন্য, পাবলিক যখন উদ্ভূত বর্গ ঘোষিত হয় অধিকৃত হয় struct হয় ও বেসরকারি যখন বর্গ ঘোষিত হয় অধিকৃত হয় বর্গ

এবং কেবল সম্পূর্ণতার জন্য, শ্রেণি এবং কাঠামোর মধ্যে আরও বহুল পরিচিত পার্থক্যটি (১১.২) এ সংজ্ঞায়িত করা হয়েছে:

একটি বর্গ শব্দ দ্বারা সংজ্ঞায়িত সদস্য বর্গ হয় ব্যক্তিগত ডিফল্টরূপে। একটি বর্গ কীওয়ার্ড সঙ্গে সংজ্ঞায়িত সদস্যরা struct হয় বা ইউনিয়ন হয় প্রকাশ্য ডিফল্টরূপে।

অতিরিক্ত পার্থক্য: কীওয়ার্ডটি classটেমপ্লেট পরামিতিগুলি ঘোষণার জন্য ব্যবহার করা যেতে পারে, যখন structকীওয়ার্ডটি তেমন ব্যবহার করা যায় না।


22
এটি আসলে দ্বিতীয় তফাত নয়, প্রশ্নটি এই পার্থক্যটিকে অসম্পূর্ণভাবে বলেছে। সমস্ত সাবোবজেক্টগুলি ডিফল্টরূপে classসর্বজনীন, যখন ব্যবহার করে ডিফল্টরূপে সর্বজনীন হয় structএবং উভয়ই শ্রেণীর ধরণের সংজ্ঞা দেয়।
বেন ভয়েগট

10
আমি মনে করি আপনি বিন্দু মিস করেছেন, বেন। এটি উত্তরাধিকার যা স্ট্রাইকগুলির জন্য সর্বজনীন এবং ক্লাসগুলির জন্য ব্যক্তিগত। এটি একটি অত্যন্ত গুরুত্বপূর্ণ পার্থক্য, এবং প্রকৃত সদস্য অ্যাক্সেসের সাথে সম্পূর্ণ সম্পর্কিত নয়। উদাহরণস্বরূপ, ভাষা খুব ভালভাবে এটি সংজ্ঞায়িত করতে পারে অন্যথায়, উদাহরণস্বরূপ উভয়ই ডিফল্টরূপে প্রকাশ্যে উত্তরাধিকার সূত্রে প্রাপ্ত হয় এবং আপনি খুব আলাদা আলাদা প্রভাব পেতে পারেন।
আসফ লাভি

104
আসলে, বাস্তব চতুর মধ্যে পার্থক্য structএবং classযে পরেরটির একটি স্থানে ব্যবহার করা যেতে পারে typenameএকটি টেমপ্লেট প্যারামিটার ডিক্লেয়ার, যখন সাবেক যায় না। :)
sbi

21
@ এমআরইনভার্সি: এটি সম্পূর্ণ ভুল। (একটি বিদ্যালয় আছে যা এটি একটি সম্মেলনের জন্য ব্যবহার করে তবে এটি সিনট্যাক্টিকালি প্রয়োগ করা হয় না))
এসবিআই

3
@sbi "struct হয় এবং শ্রেণীর মধ্যে বাস্তব চতুর পার্থক্য" - আকর্ষণীয়, কিন্তু প্রশ্ন মধ্যে পার্থক্য সম্পর্কে একটি struct হয় এবং একটি বর্গ, যেখানে কিওয়ার্ড ব্যবহার করা যেতে পারে পার্থক্য সম্পর্কে না।
জিম বাল্টার

161

সি ++ এফএকিউ এর উদ্ধৃতি ,

[7.8] কীওয়ার্ড স্ট্রাক্ট এবং শ্রেণীর মধ্যে পার্থক্য কী?

স্ট্রাক্টের সদস্য এবং বেস ক্লাসগুলি ডিফল্টরূপে সর্বজনীন হয়, শ্রেণিতে, তারা ব্যক্তিগতকে ডিফল্ট করে। দ্রষ্টব্য: আপনার ডিফল্ট উপর নির্ভর না করে আপনার বেস ক্লাসগুলি স্পষ্টভাবে সরকারী, ব্যক্তিগত বা সুরক্ষিত করা উচিত।

কাঠামো এবং শ্রেণি অন্যথায় কার্যত সমতুল্য।

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


123

এটি সি ++ এর উত্স এবং সি এর সাথে সামঞ্জস্যতা মনে রাখার মতো

সি এর স্ট্রাক্ট রয়েছে, এর এনক্যাপসুলেশন সম্পর্কে কোনও ধারণা নেই, তাই সবকিছু সর্বজনীন।

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

অন্যদিকে, যদি স্ট্রস্ট্রুপ এর শব্দার্থবিজ্ঞানের পরিবর্তন করে যদি structএর সদস্যরা ডিফল্টরূপে ব্যক্তিগত হয়, তবে এটির সামঞ্জস্যতা ভেঙে যেত (এটি মানকগুলি সরানোর সাথে সাথে প্রায়শই সত্য হয় না, তবে সমস্ত বৈধ সি প্রোগ্রামগুলিও বৈধ সি ++ প্রোগ্রাম ছিল, যা সি ++ পাদদেশ দেওয়ার ক্ষেত্রে বড় প্রভাব ফেলেছিল)।

সুতরাং একটি নতুন কীওয়ার্ডটি classস্ট্রাক্টের মতো হ'ল পরিচয় দেওয়া হয়েছিল, কিন্তু ডিফল্টরূপে ব্যক্তিগত।

যদি সি ++ কোনও ইতিহাস না দিয়ে স্ক্র্যাচ থেকে এসেছিল, তবে সম্ভবত এটির মধ্যে একটি মাত্র কীওয়ার্ড থাকবে। এটি সম্ভবত এটি তৈরি প্রভাব তৈরি করতে পারে না।

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


এটি সম্ভবত লক্ষ্য করার মতো যে, ক্লাস এবং কাঠামোগুলি হুডের নীচে একইভাবে কাজ করা সহজ ছিল, সেগুলি মৌলিকভাবে আলাদা হওয়ার চেয়ে। পূর্ববর্তী ক্ষেত্রে কিছু উপকার থাকতে পারে যেমনঃ নির্দিষ্ট করে যে স্ট্রাক্ট হিসাবে ঘোষিত কিছু অবশ্যই পিওডিএস হতে হবে (অর্থাত্ ভার্চুয়াল সদস্য, তুচ্ছ ত্রুটিযুক্ত ডিফল্ট কনস্ট্রাক্টর বা ডেস্ট্রাক্টর ইত্যাদি হওয়া থেকে বিরত থাকা) তবে এ জাতীয় জিনিস আমার জ্ঞানের পক্ষে নয় যে কোনও সি ++ স্ট্যান্ডার্ড বা বাস্তবায়নের দ্বারা কখনও প্রয়োজন হয়নি।
সুপারক্যাট

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

1
আমি মানুষের সেই সবকিছু যা "গলি পর" নয়, হওয়া উচিত মনে মধ্যে একটা ধর্মযুদ্ধ বোঝা, এবং যারা মনে করেন যে গলি হিসাবে গণ্য করা উচিত একটি টুল, কিন্তু না হাতিয়ার। সি ++ অবশ্যই পরবর্তী দর্শনের আলিঙ্গন করেছে বলে মনে হয় তবে এর আগে ভাষা সম্পর্কে আমি খুব বেশি জানি না। আমার নিজস্ব দর্শনটি হ'ল যে কেউ যখন কোনও বস্তু চায় তখন সেটিকে একটি অবজেক্ট ব্যবহার করা উচিত এবং যখন কেউ সম্পর্কিত তবে স্বতন্ত্র ভেরিয়েবলের সমষ্টি চায়, তখন এটি ব্যবহার করা উচিত। সি ++ এই ধরণের জিনিসের মধ্যে কোনও সিনট্যাক্টিক পার্থক্য তৈরি করে না এবং। নেট এই পার্থক্যটিকে অস্পষ্ট করার চেষ্টা করে, তবে আমি ডি সম্পর্কে খুব কমই জানি ...
সুপারক্যাট

1
... পরামর্শ দেয় যে এটি সি ++ বা। নেট এর চেয়ে বেশি স্বীকৃতি দেয়। ভেরিয়েবল মোট পরিমাণ ঠিক নয় OOPish, কিন্তু যে মানে এই নয় তারা নিযুক্ত করা উচিত নয় যখন তারা দরকারী
সুপারক্যাট

3
আমি "সি স্ট্রাক্টগুলির সাথে একমত নই, এটিতে এনক্যাপসুলেশন সম্পর্কিত কোনও ধারণা নেই, সুতরাং সবকিছু সর্বজনীন is", আপনি structএকটি- *.cফাইলের অভ্যন্তরে কোনও সংজ্ঞা লুকিয়ে রাখতে পারেন এবং অন্যান্য অনুবাদ ইউনিট কেবল পয়েন্টার দিয়ে এটি ব্যবহার করতে দিন let সুতরাং আপনার কাছে আরও শক্তিশালী এনক্যাপসুলেশন রয়েছে, কারণ অন্যান্য অনুবাদ ইউনিটগুলি এমনকি এর ভিতরে কী রয়েছে তা জানেন না struct
12431234123412341234123

32

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


15
কেবল সদস্যই নয়, উত্তরাধিকার সহ সমস্ত অ্যাক্সেস।
নেমানজা ত্রিফুনোভিচ

4
ঠিক আছে, আমি অন্য পার্থক্য বলতে চাই শব্দার্থক। অনেক লোকের কাঠামো তাদের "ডেটা স্ট্রাকচার" ভাবতে বাধ্য করে সি
ক্রিস কুমার

3
@ ক্রিসকুমার: এগুলি "শব্দার্থবিজ্ঞান" নয়; তারা ব্যক্তিগত অনুভূতি হয়। উভয় structএবং অভিন্ন শব্দার্থবিজ্ঞান সহ classএকটি শ্রেণীর ঘোষণা (সংজ্ঞা সংস্থার পার্স-وار ব্যাখ্যা ব্যতীত)।
অরবিট

28

সি ++ প্রোগ্রামিং ভাষাতে স্ট্রাস্ট্রপ অনুসারে :

আপনি কোন স্টাইলটি ব্যবহার করেন তা পরিস্থিতি এবং স্বাদের উপর নির্ভর করে। আমি সাধারণত structক্লাসে ব্যবহার করতে পছন্দ করি যেখানে সমস্ত ডেটা পাবলিক থাকে। আমি এই ধরণের ক্লাসগুলিকে "যথেষ্ট সঠিক ধরণের নয়, কেবলমাত্র ডেটা স্ট্রাকচার" বলে মনে করি।

কার্যকরীভাবে, সরকারী / বেসরকারী ছাড়া অন্য কোনও পার্থক্য নেই


32
কি পার্থক্য? দয়া করে ব্যাখ্যা করুন.
ক্র্যাশমাস্ট্র

10

স্ট্রাক্ট হ'ল এক প্রকারের অ্যাবস্ট্রাক্ট ডেটা টাইপ যা স্ট্রাকচারের স্পেসিফিকেশন অনুসারে মেমরির প্রদত্ত অংশকে আলাদা করে দেয়। স্ট্রাক্টগুলি ফাইল সিরিয়ালাইজেশন / ডেসারিয়ালাইজেশনে বিশেষত দরকারী কারণ কাঠামোটি প্রায়শই ফাইল ভার্বাটিমে লেখা যেতে পারে। (অর্থাত্ স্ট্রাক্টের একটি পয়েন্টার পান, অনুলিপি করতে বাইটের সংখ্যা গণনা করতে সাইজ ম্যাক্রো ব্যবহার করুন, তারপরে স্ট্রাক্টের ভিতরে বা বাইরে ডেটা সরিয়ে নিন))

ক্লাসগুলি বিবিধ প্রকারের বিমূর্ত তথ্য প্রকার যা তথ্য গোপনের বিষয়টি নিশ্চিত করার চেষ্টা করে। অভ্যন্তরীণভাবে, বিভিন্ন ধরণের মেশিনেশন, পদ্ধতি, টেম্প ভেরিয়েবল, স্টেট ভেরিয়েবল থাকতে পারে। ইত্যাদি যা ক্লাস ব্যবহার করতে ইচ্ছুক যে কোনও কোডের সাথে একটি সুসংগত API উপস্থাপন করতে ব্যবহৃত হয়।

কার্যত, স্ট্রাক্টগুলি ডেটা সম্পর্কে, ক্লাসগুলি কোড সম্পর্কে।

তবে আপনার বুঝতে হবে যে এগুলি কেবল বিমূর্ততা। স্ট্রাক্ট তৈরি করা পুরোপুরি সম্ভব যা অনেকগুলি ক্লাস এবং ক্লাসের মতো দেখতে দেখতে অনেকগুলি স্ট্রাক্টের মতো দেখাচ্ছে। প্রকৃতপক্ষে, প্রথম দিকের সি ++ সংকলকগুলি কেবল প্রাক-সংকলক ছিল যা সি ++ কোডকে সিতে অনুবাদ করে Thus

প্রত্যেকে আলাদা আলাদা বিমূর্তকরণের বাইরেও, ক্লাসগুলি সি কোড নামকরণ ধাঁধাটির সমাধান সরবরাহ করে। যেহেতু আপনি একই নামের সাথে একাধিক ফাংশন প্রকাশ করতে পারবেন না, তাই বিকাশকারীরা _ () এর একটি ধরণ অনুসরণ করতেন। যেমন ম্যাথলিবেক্সট্রিম_ম্যাক্স ()। এপিআইগুলিকে ক্লাসে গ্রুপিং করার মাধ্যমে, অনুরূপ ফাংশনগুলি (এখানে আমরা তাদের "পদ্ধতি" বলি) একসাথে গোষ্ঠীভুক্ত করা যেতে পারে এবং অন্যান্য শ্রেণীর পদ্ধতিগুলির নামকরণ থেকে সুরক্ষিত করা যায়। এটি প্রোগ্রামারকে তার কোডটি আরও ভালভাবে সংগঠিত করতে এবং কোডের পুনঃব্যবহার বাড়াতে সহায়তা করে। তত্ত্বের ক্ষেত্রে, অন্তত।


1
এটি স্ট্রাক্ট এবং ক্লাস সম্পর্কে সর্বাধিক অ-সুস্পষ্ট বিষয়। "স্ট্রাক্টগুলি ডেটা সম্পর্কে, ক্লাসগুলি কোড সম্পর্কে" পুনর্বিবেচনা করা যায় কারণ "স্ট্রাক্টগুলি ডেটা সম্পর্কে, ক্লাসগুলি ডেটা, সুরক্ষা এবং এই ডেটাতে সঞ্চালিত ক্রিয়াকলাপ সম্পর্কে হয়"
অরুণ অরবিন্দ

3
সি ++ তে কোনও কাঠামো তৈরি করা সম্ভব নয়। উত্তরাধিকার সূত্রে প্রাপ্ত structকীওয়ার্ডটি ব্যবহার করে কোনও শ্রেণি তৈরি করা সম্ভব ।
হালকা ঘোড়দৌড়

1
এই উত্তরটি C ++ সম্পর্কে বলে মনে হচ্ছে না। সি ++ এ structক্লাস ঘোষণা করে (সহ public/ private/ protected, উত্তরাধিকার ইত্যাদি)।
মেলপোমেন

স্ট্রাক্টগুলি কীভাবে বিমূর্ত হয়? কোনও ফাইলের কাঁচা স্ট্রাক্ট লেখার ক্ষেত্রেও সি-এ সমস্যাগুলি ভরাট (সাধারণত সমস্যাগুলির মধ্যে প্যাডিং, এন্ডিয়ানসনেস, বিভিন্ন শব্দের আকার ইত্যাদি অন্তর্ভুক্ত)। আপনি এই SIZEম্যাক্রোটি কী সম্পর্কে কথা বলছেন?
মেলপোমেন

10

1) কোনও শ্রেণীর সদস্যরা ডিফল্টরূপে ব্যক্তিগত এবং কাঠামোর সদস্যরা ডিফল্টরূপে সর্বজনীন।

উদাহরণস্বরূপ প্রোগ্রাম 1 সংকলনে ব্যর্থ হয় এবং প্রোগ্রাম 2 দুর্দান্ত কাজ করে।

// Program 1
#include <stdio.h>

class Test {
    int x; // x is private
};
int main()
{
  Test t;
  t.x = 20; // compiler error because x is private
  getchar();
  return 0;
}
Run on IDE
// Program 2
#include <stdio.h>

struct Test {
    int x; // x is public
};
int main()
{
  Test t;
  t.x = 20; // works fine because x is public
  getchar();
  return 0;
}

২) ক্লাস / স্ট্রাক্ট থেকে স্ট্রাক্ট নেওয়ার সময় বেস ক্লাস / স্ট্রাক্টের জন্য ডিফল্ট অ্যাক্সেস-স্পেসিফায়ার পাবলিক হয়। এবং ক্লাস প্রাপ্ত করার সময়, ডিফল্ট অ্যাক্সেস নির্দিষ্টকরণকারী ব্যক্তিগত।

উদাহরণস্বরূপ প্রোগ্রাম 3 সংকলনে ব্যর্থ হয় এবং প্রোগ্রাম 4 সূক্ষ্ম কাজ করে।

// Program 3
#include <stdio.h>

class Base {
public:
    int x;
};

class Derived : Base { }; // is equilalent to class Derived : private Base {}

int main()
{
  Derived d;
  d.x = 20; // compiler error becuase inheritance is private
  getchar();
  return 0;
}
Run on IDE
// Program 4
#include <stdio.h>

class Base {
public:
    int x;
};

struct Derived : Base { }; // is equilalent to struct Derived : public Base {}

int main()
{
  Derived d;
  d.x = 20; // works fine becuase inheritance is public
  getchar();
  return 0;
}

আমি বিশেষজ্ঞদের দ্বারা উল্লিখিত কোড উদাহরণগুলি 3-7 সরিয়েছি
সুরজ কে থমাস

8

কেবলমাত্র অন্যান্য পার্থক্য হ'ল ক্লাস এবং স্ট্রাক্টগুলির ডিফল্ট উত্তরাধিকার, যা আশ্চর্যজনকভাবে যথাক্রমে ব্যক্তিগত এবং সর্বজনীন।


5
  1. কোনও কাঠামোর সদস্যরা ডিফল্টরূপে সর্বজনীন হয়, শ্রেণীর সদস্যরা ডিফল্টরূপে ব্যক্তিগত হয়।
  2. অন্য কাঠামো বা শ্রেণি থেকে কাঠামোর জন্য ডিফল্ট উত্তরাধিকার সর্বজনীন another অন্য কাঠামো বা শ্রেণি থেকে শ্রেণীর জন্য ডিফল্ট উত্তরাধিকার ব্যক্তিগত।
class A{    
public:    
    int i;      
};

class A2:A{    
};

struct A3:A{    
};


struct abc{    
    int i;
};

struct abc2:abc{    
};

class abc3:abc{
};


int _tmain(int argc, _TCHAR* argv[])
{    
    abc2 objabc;
    objabc.i = 10;

    A3 ob;
    ob.i = 10;

    //A2 obja; //privately inherited
    //obja.i = 10;

    //abc3 obss;
    //obss.i = 10;
}

এটি ভিএস ২০০৫-এ রয়েছে।


_tmainস্ট্যান্ডার্ড সি ++ নয়।
মেলপোমেন

4

স্পেসিফিকেশন না, না। মূল পার্থক্য হ'ল প্রোগ্রামার প্রত্যাশায় যখন তারা 2 বছরের মধ্যে আপনার কোডটি পড়ে। স্ট্রাক্টগুলি প্রায়শই POD বলে ধরে নেওয়া হয়। স্ট্রাক্টগুলি টেমপ্লেট মেটাপগ্রোগ্রামিংয়েও ব্যবহৃত হয় যখন আপনি কোনও জিনিসকে সংজ্ঞায়িত করার পরিবর্তে অন্য কোনও উদ্দেশ্যে নির্ধারণ করছেন।


4

আরেকটি বিষয় লক্ষণীয়, আপনি যদি এমন কোনও উত্তরাধিকার অ্যাপ্লিকেশন আপডেট করেন যা ক্লাসগুলি ব্যবহারের জন্য স্ট্রাক্টযুক্ত থাকে তবে আপনি নিম্নলিখিত সমস্যাটিতে চলে যেতে পারেন:

পুরানো কোডের স্ট্রাক্ট রয়েছে, কোড সাফ হয়েছে এবং এগুলি ক্লাসে পরিবর্তিত হয়েছে। তারপরে একটি ভার্চুয়াল ফাংশন নতুন আপডেট ক্লাসে যুক্ত করা হয়েছিল।

ভার্চুয়াল ফাংশনগুলি যখন ক্লাসে থাকে তখন অভ্যন্তরীণভাবে সংকলক ফাংশনগুলিতে নির্দেশ করতে ক্লাসের ডেটাতে অতিরিক্ত পয়েন্টার যুক্ত করে।

এটি কীভাবে পুরানো লিগ্যাসি কোডটি ভেঙে দেবে তা যদি পুরানো কোডে কোথাও স্ট্রাক্টটি মেমফিল ব্যবহার করে সমস্তটি শূন্যে সাফ করার জন্য পরিষ্কার করা হয় তবে এটি অতিরিক্ত পয়েন্টার ডেটাও স্টম্প করবে।


1
স্ট্রাক্ট সাফ করার জন্য মেমফিল ব্যবহার করা কোডে সম্ভবত অন্যান্য আপত্তিকর অভ্যাস রয়েছে। সাবধানতার সাথে যান।
ডেভিড থর্নলি

@DavidThornley: নিশ্চিহ্ন একটি শূন্য-ভরাট ব্যবহারের বা আরম্ভ একটি ডাটা স্ট্রাকচার সি আদর্শ একটি মিশ্র ভাষার প্রকল্পের হয়, এক সি অংশে কোড এড়াতে আশা করতে পারে না callocপক্ষে new। কোডের সি অংশ দ্বারা ব্যবহৃত যে কোনও কাঠামো আসলে পিওডিএস রয়েছে তা নিশ্চিত করার চেষ্টা করা সমস্তই করতে পারে।
সুপারক্যাট

4
  1. একটি বর্গ শব্দ দ্বারা সংজ্ঞায়িত সদস্য classহয় privateডিফল্টরূপে। মূলশব্দ struct(বা union) publicদ্বারা সংজ্ঞায়িত শ্রেণীর সদস্যরা ডিফল্টরূপে।

  2. একটি বেস বর্গ জন্য একটি অ্যাক্সেস-সুনির্দিষ্টভাবে উল্লেখ করা অনুপস্থিতিতে publicযখন অধিকৃত হয় উদ্ভূত বর্গ ঘোষিত হয় structএবং privateযখন বর্গ ঘোষিত হয় অধিকৃত হয় class

  3. আপনি একটি enum classকিন্তু একটি না ঘোষণা করতে পারেন enum struct

  4. আপনি ব্যবহার করতে পারেন template<class T>কিন্তু না template<struct T>

এও নোট করুন যে সি ++ স্ট্যান্ডার্ড আপনাকে কোনও প্রকারকে a হিসাবে ফরওয়ার্ড-ডিক্লেয়ার করতে দেয় structএবং তারপরে classপ্রকারটি এবং বিপরীত ঘোষণার সময় ব্যবহার করে। এছাড়াও, std::is_class<Y>::valueহয় trueওয়াই একটি হচ্ছে জন্য structএকটি class, কিন্তু falseএকটি জন্য enum class


উত্তম উত্তর, যদিও আমি একটি স্পষ্ট অনির্বচনীয় 0 মিস করছি) সি ++ এর মধ্যে structএবং classসি ++ এর মধ্যে পার্থক্য হ'ল ডেটা টাইপের (বা কিছু ভাল বিকল্প;) এর মধ্যে নয়
আইডাক্ল্যাভ 463035818

@ প্রাক্তন অজ্ঞাত 6630৩৩৮৮১৮: তবে আপনি কি মনে করেন না std::is_class<Y>::valueযে এটি কভার করে?
বাথশেবা

হ্যাঁ, কেবল ভেবেছিল এটি আরও বিশিষ্ট হতে পারে, কারণ সাধারণ ভুল বোঝাবুঝি করে এবং একবারে কেবলমাত্র বিশৃঙ্খলা থেকে বেরিয়ে আসে।
idclev 463035818

কোনও বিষয় নয়, আপনার উত্তরটি যেমনটি ঠিক তেমনি, আমি অন্য একটি লিখেছি, আরও একটিতে আঘাত
লাগায় না

4

এর মধ্যে classএবং পার্থক্য structহ'ল ডেটা টাইপের মধ্যে নয় কীওয়ার্ডের মধ্যে পার্থক্য। এই দুই

struct foo : foo_base { int x;};
class bar : bar_base { int x; };

উভয়ই একটি শ্রেণির ধরণের সংজ্ঞা দেয়। এই প্রসঙ্গে কীওয়ার্ডের পার্থক্য হ'ল ভিন্ন ডিফল্ট অ্যাক্সেস:

  • foo::xপ্রকাশ্য এবং foo_baseপ্রকাশ্যে উত্তরাধিকারসূত্রে প্রাপ্ত
  • bar::xব্যক্তিগত এবং bar_baseব্যক্তিগতভাবে উত্তরাধিকারসূত্রে প্রাপ্ত

2

এখানে একটি ভাল ব্যাখ্যা: http://carcino.gen.nz/tech/cpp/struct_vs_class.php

সুতরাং, আরও একবার: সি ++ তে স্ট্রাক্টের একটি শ্রেণীর সাথে অভিন্ন, ব্যতীত স্ট্রাক্টের সদস্যদের ডিফল্টরূপে জনসাধারণের দৃশ্যমানতা থাকে তবে একটি শ্রেণির সদস্যদের ডিফল্টরূপে ব্যক্তিগত দৃশ্যমানতা থাকে।


2

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


2

আইএসও আইইসি 14882-2003

9 ক্লাস

§3

কাঠামো ক্লাস-কী দ্বারা সংজ্ঞায়িত একটি শ্রেণি struct; এর সদস্য এবং বেস ক্লাস (ক্লজ 10) ডিফল্টরূপে প্রকাশিত হয় (ধারা 11)


2

আর একটি প্রধান পার্থক্য হ'ল টেম্পলেটগুলির ক্ষেত্রে। আমি যতদূর জানি, আপনি কোনও টেমপ্লেট সংজ্ঞায়িত করার সময় কোনও কাঠামো ব্যবহার না করে আপনি একটি ক্লাস ব্যবহার করতে পারেন।

template<class T> // OK
template<struct T> // ERROR, struct not allowed here

1
যদি আপনি জোর দেওয়ার পরিকল্পনা করে থাকেন যে কাঠামোগুলি সাধারণ আকার হিসাবে ব্যবহার করা যায় না, তবে আপনি একটি ভুল। এবং structসেখানে কেবল কনভেনশন দ্বারা অনুমোদিত নয় (এটির মূলশব্দটিclass আলাদাভাবে বলতে এখানে বিভিন্ন অর্থে ব্যবহৃত হয়, টেমপ্লেট পরামিতিগুলির জন্য 'শ্রেণি' বা 'টাইপনেম' দেখুন )
dma_k

কীওয়ার্ডটি সেখানে অনুমোদিত নয়, তবে আপনি structকেবল একটি জরিমানা দিয়ে সংজ্ঞায়িত শ্রেণিতে পাস করতে পারেন । কেবল এটি চেষ্টা করুন। struct T{}; template <typename T> void foo() {} foo<T>();
অরবিটে মেঘের হালকাতা রেস 21

1

অন্যান্য উত্তরে ব্যক্তিগত / পাবলিক খেলাপিদের উল্লেখ করা হয়েছে, (তবে মনে রাখবেন যে স্ট্রাক্ট একটি শ্রেণি একটি কাঠামো; এগুলি দুটি পৃথক আইটেম নয়, একই আইটেমটি সংজ্ঞায়নের দুটি উপায়)।

কী লক্ষণীয় হতে পারে (বিশেষত যেহেতু প্রশ্নকর্তা এমএসভিসি ++ ব্যবহার করছেন সম্ভবত যেহেতু তিনি "নিয়ন্ত্রণহীন" সি ++ উল্লেখ করেছেন) হ'ল ভিজ্যুয়াল সি ++ নির্দিষ্ট পরিস্থিতিতে অভিযোগ করে যদি কোনও শ্রেণীর সাথে ঘোষিত হয় classএবং তারপরে সংজ্ঞায়িত করা হয় struct(বা সম্ভবত অন্যভাবে রাউন্ডে) ), যদিও মান বলে যে এটি পুরোপুরি আইনী।


আমি জানি এটি খুব দেরিতে মন্তব্য, তবে সচেতন থাকুন যে পূর্বোক্ত সতর্কতা যোগ্যতা ছাড়াই নয় কারণ উইন্ডোজ এবিআই ম্যাঙ্গাল স্ট্রাক্ট এবং ক্লাসকে পৃথক পৃথক করে তোলে এবং ক্লাস এবং স্ট্রাক্টের ঘোষিত (ফরোয়ার্ড) ঘোষণার ফলে লিঙ্কিং সমস্যাগুলি বোঝা শক্ত হয়ে যেতে পারে!
এমএফএইচ

1
  • । শ্রেণিতে ডিফল্টরূপে সমস্ত সদস্য ব্যক্তিগত হয় তবে কাঠামোর সদস্যরা ডিফল্টরূপে সর্বজনীন হয়।

    1. স্ট্রাক্টের জন্য কনস্ট্রাক্টর এবং ডেস্ট্রাক্টরের মতো কোনও পদ নেই, তবে ক্লাস সংকলকের জন্য যদি আপনি সরবরাহ না করেন তবে ডিফল্ট তৈরি করে।

    2. আকারের খালি কাঠামো 0 বাইট হিসাবে আরও বড় আকারের খালি শ্রেণি 1 বাইট স্ট্রাক্ট ডিফল্ট অ্যাক্সেসের ধরণটি সর্বজনীন। একটি স্ট্রাক্ট সাধারণত ডেটা গোষ্ঠীকরণের জন্য ব্যবহার করা উচিত।

    শ্রেণীর ডিফল্ট অ্যাক্সেসের ধরনটি ব্যক্তিগত এবং উত্তরাধিকারের জন্য ডিফল্ট মোডটি ব্যক্তিগত। গোষ্ঠীভুক্ত ডেটা এবং সেই ডেটাগুলিতে পরিচালিত পদ্ধতিগুলির জন্য একটি শ্রেণি ব্যবহার করা উচিত।

    সংক্ষেপে, উদ্দেশ্যটি যখন ডেটা গোষ্ঠীভুক্ত করা হয় তখন স্ট্রাক্ট ব্যবহার করা হয় এবং যখন ডেটা বিমূর্তি এবং সম্ভবত উত্তরাধিকার প্রয়োজন হয় তখন ক্লাস ব্যবহার করা হয়।

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


3
"২. আকারের খালি কাঠামোটি 0 বাইট হ'ল আকারের খালি শ্রেণি 1 বাইট"। মিথ্যা। আমি সবেমাত্র পরীক্ষা করেছি g++। আপনি খালি বেস অপ্টিমাইজেশনের কথা ভাবছেন, তবে এটি উভয়ের ক্ষেত্রেও প্রযোজ্য।
cdunn2001

1
সত্য না. সি ++ তে একটি খালি কাঠামোর আকার 1 হয় সি তে একটি খালি কাঠামো অনুমোদিত নয়। জিসিসি কমপ্লেক্স এক্সটেনশন হিসাবে সিতে ফাঁকা স্ট্রাক্টের অনুমতি দেয় এবং এই জাতীয় কাঠামোর আকার 0 থাকে
জোহান রেড

এই উত্তরটি ভুল। আকারের জিনিসটি ছাড়াও, কনস্ট্রাক্টর / ডেস্ট্রাক্টর অংশটিও সঠিক নয়: স্ট্রাক্টে কনস্ট্রাক্টর এবং ডেস্ট্রাক্টর ঠিক ঠিক থাকতে পারে। প্রকৃতপক্ষে, structসি ++ এ পূর্ণাঙ্গ ক্লাস তৈরি করে।
মেলপোমেন

1

অন্যান্য উত্তরের দ্বারা বিহিত থাকা অবস্থায়, এটি স্পষ্টভাবে উল্লেখ করা হয়নি - ব্যবহারের উপর নির্ভর করে স্ট্রাইকগুলি সি সামঞ্জস্যপূর্ণ; ক্লাস হয় না।

এর অর্থ যদি আপনি এমন একটি শিরোনাম লিখে থাকেন যে আপনি সি সামঞ্জস্যপূর্ণ হতে চান তবে আপনার স্ট্রাক্ট ছাড়া অন্য কোনও বিকল্প নেই (যা সি বিশ্বে ফাংশন থাকতে পারে না; তবে ফাংশন পয়েন্টার থাকতে পারে)।


-1

কাঠামো বা শ্রেণীর জন্য কখন যেতে হবে সে সম্পর্কে আপনি গাইডলাইনগুলির জন্য এটি বিবেচনা করতে পারেন, https://msdn.microsoft.com/en-us/library/ms229017%28v=vs.110%29.aspx

ON ধরণের উদাহরণগুলি ছোট এবং সাধারণত স্বল্প-কালীন হয় বা সাধারণত অন্য বস্তুতে এম্বেড থাকে তবে শ্রেণীর পরিবর্তে কাঠামোর সংজ্ঞা দিচ্ছেন √

এক্স AVOID কোনও কাঠামাকে সংজ্ঞায়িত করছে না যদি না টাইপটিতে নিম্নলিখিত সমস্ত বৈশিষ্ট্য থাকে:

এটি যৌক্তিকভাবে একটি একক মান উপস্থাপন করে, আদিম ধরণের (int, ডাবল, ইত্যাদি) এর অনুরূপ।

এটির একটি আকারের আকার 16 বাইটের নিচে রয়েছে।

এটি অপরিবর্তনীয়।

এটি ঘন ঘন বক্স করতে হবে না।


এটি নেট। সি # সম্পর্কে, সি ++ নয়।
মেলপোমেন

-2

ক্লাসটি কেবল সফটওয়্যার ইঞ্জিনিয়ারিংয়ের প্রসঙ্গেই অর্থবহ। ডেটা স্ট্রাকচার এবং অ্যালগরিদমের প্রসঙ্গে শ্রেণি এবং কাঠামো এর চেয়ে আলাদা নয়। শ্রেণীর সদস্যকে রেফারেন্স করতে হবে এমন কোনও নিয়ম সীমাবদ্ধ নেই's

শ্রেণিবিহীন টন লোকের সাথে বৃহত প্রকল্পটি বিকাশ করার সময় আপনি শেষ পর্যন্ত জটিল সংযুক্ত কোড পেতে পারেন কারণ প্রত্যেকে নিজের পছন্দমতো ফাংশন এবং ডেটা ব্যবহার করেন। ক্লাস কোডগুলি ডিউপলিং এবং পুনঃব্যবহার করার জন্য অনুমতি নিয়ন্ত্রণ এবং সহজাত সরবরাহ করে।

আপনি যদি কিছু সফ্টওয়্যার ইঞ্জিনিয়ারিং নীতিগুলি পড়েন তবে আপনি দেখতে পাবেন বেশিরভাগ মানগুলি ক্লাস ছাড়া সহজেই প্রয়োগ করা যায় না। উদাহরণ স্বরূপ: http://en.wikedia.org/wiki/SOLID_%28obobict-oriented_design%29

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


এই উত্তরটি C ++ সম্পর্কে বলে মনে হচ্ছে না। সি ++ এ structক্লাস ঘোষণা করে (অনুমতি নিয়ন্ত্রণ, উত্তরাধিকার ইত্যাদি সহ)।
মেলপোমেন

-3

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


ওপি ইতিমধ্যে উল্লেখ করেছে যে structসদস্যরা ডিফল্টরূপে সর্বজনীন, এবং ২০০৯ সালের গৃহীত উত্তর উত্তরের উল্লেখ করে। কেন আরও একটি উত্তর লিখবেন যা 4 বছর পরে কোনও নতুন তথ্য যুক্ত করে না?
মেলপোমেন

-3

এই সমস্ত কারণগুলির মধ্যে, এই সিদ্ধান্তে পৌঁছানো যায় যে ধারণাটি "কাঠামোগুলির" পরিবর্তে বাস্তব বিশ্বের বস্তুগুলির প্রতিনিধিত্ব করার জন্য শ্রেণিকক্ষ সবচেয়ে উপযুক্ত। উদাহরণস্বরূপ, ডিফল্ট উত্তরাধিকার স্ট্রাইকগুলির জন্য সর্বজনীন তবে আমরা যদি এই নিয়মকে বাস্তব বিশ্বের জন্য প্রয়োগ করি তবে এটি হাস্যকর। তবে শ্রেণির ডিফল্ট উত্তরাধিকারের মধ্যে ব্যক্তিগত যা আরও বাস্তবসম্মত।

যাইহোক, আমার যা ন্যায়সঙ্গত করতে হবে তা হল ক্লাসটি অনেক বিস্তৃত, বাস্তব বিশ্বের প্রয়োগযোগ্য ধারণা, যেখানে কাঠামোটি অভ্যন্তরীণ সংস্থার সাথে আদিম ধারণা (ইভেন্টহফ স্ট্রাক্ট ওওপি ধারণাগুলি অনুসরণ করে, তাদের একটি খারাপ অর্থ রয়েছে)


1
কীভাবে ব্যক্তিগত উত্তরাধিকার "আরও বাস্তববাদী"? বেশিরভাগ প্রোগ্রামিং ভাষার এমনকি ব্যক্তিগত উত্তরাধিকারের ধারণাও নেই।
মেলপোমেন

-3

উফগুলিতে স্ট্রাকচার এবং ক্লাস কীওয়ার্ডের মধ্যে প্রধান পার্থক্য হ'ল কাঠামোতে উপস্থিত কোনও সরকারী এবং ব্যক্তিগত সদস্যের ঘোষণা।


এই উত্তরটি C ++ সম্পর্কে বলে মনে হচ্ছে না। সি ++ এ structক্লাস ঘোষণা করে (সহ public/ private/ protected, উত্তরাধিকার ইত্যাদি)।
মেলপোমেন

-3

** আপডেট: ** দয়া করে এই উত্তরটি উপেক্ষা করুন। আমি এই সম্ভাবনাটি বিবেচনা করি নি যে কাঠামোর জন্য, মানটি অবিচ্ছিন্ন করা হয়েছিল তবে কেবল 0 হতে হয়েছিল struct কাঠামো এবং শ্রেণীর মধ্যে আরম্ভের পার্থক্য নেই।


ডিফল্ট প্রাথমিককরণের সাথে স্ট্রাক্ট এবং ক্লাসগুলির মধ্যে আমি অন্যরকম দেখতে পাচ্ছি।

struct Foo {
    int a;
};

class Bar {
    int a;
};

class Tester {
    Foo m_Foo = Foo();
    Bar m_Bar = Bar();

public:
    Tester() {}
};

int main() {
    auto myTester = Tester();
}

সেই কোডটি চালান এবং মাই টেস্টার পরীক্ষা করুন। আপনি দেখতে পাবেন যে m_Foo এর জন্য, স্ট্রাক্ট, m_Foo.a 0 থেকে শুরু করা হয়েছে, তবে m_Bar এর জন্য m_Bar.a শ্রেণিটি অবিচ্ছিন্ন করা হয়েছে। সুতরাং ডিফল্ট কনস্ট্রাক্টর স্ট্রাক্ট বনাম শ্রেণীর জন্য কি করে তার মধ্যে পার্থক্য রয়েছে বলে মনে হয়। আমি ভিজ্যুয়াল স্টুডিওর সাথে এটি দেখছি।


1
কীভাবে আপনি এটি নির্ধারণ করেছিলেন যে m_Foo.aএটি শুরু করা হয়েছিল? যদি এটি অবিশ্রুত হয় এবং স্রেফ ঘটে যায় 0?
মেলপোমেন

আহ, আমি করিনি। আমার খারাপ। এটি কাঠামো এবং শ্রেণীর মধ্যে পার্থক্য নয়। প্রারম্ভিক বৈশিষ্ট্য একই।
এরিক হিল

-4

কাঠামো এবং শ্রেণীর মধ্যে প্রধান পার্থক্য হ'ল স্ট্রাক্টে আপনি কেবলমাত্র বিভিন্ন ডেটা ধরণের ডেটা ভেরিয়েবল ঘোষণা করতে পারেন যখন শ্রেণিতে আপনি ডেটা ভেরিয়েবল, সদস্য ফাংশন এবং আপনি ফাংশনের মাধ্যমে ডেটা ভেরিয়েবলগুলি ম্যানিপুলেট করতে পারবেন।

-> ক্লাস বনাম স্ট্রাক্টে আমি খুঁজে পেল এমন আরও একটি সহজ জিনিস হ'ল যদি কোনও প্রোগ্রামে ফাইলগুলি প্রয়োগ করার সময় আপনি যদি নতুন নতুন ক্রিয়াকলাপের জন্য নতুন স্ট্রাক্টের কোনও স্ট্রাক্টের কিছু ক্রিয়াকলাপ করতে চান এবং আপনার প্রয়োজন হয় ফাইলটি পড়ার পরে স্ট্রাক্টের অবজেক্টটি পাস করুন যাতে এটিতে কিছু অপারেশন করা যায়। ক্লাসে থাকাকালীন আপনি যদি এমন কোনও ফাংশন করেন যা প্রতিটি সময়ে প্রয়োজনীয় ডেটার উপর কিছু অপারেশন করে..এই সহজ আপনাকে ফাইল থেকে অবজেক্টটি পড়তে হবে এবং ফাংশনটি কল করতে হবে ..

তবে এটি প্রোগ্রামারের উপর নির্ভর করে যেভাবে সে / তাকে উপযুক্ত বলে মনে করে ... আমার মতে আমি ক্লাসটি প্রতিটি সময় পছন্দ করি কারণ এটি ওওপিগুলিকে সমর্থন করে এবং এটি প্রায় প্রতিটি ভাষায় প্রয়োগ করার কারণ এবং এটি সর্বকালের প্রোগ্রামিংয়ের দুর্দান্ত বৈশিষ্ট্যটি নির্ধারণ করে; - )

এবং হ্যাঁ, আমি উল্লেখ করতে ভুলে গেছি সবচেয়ে অবিস্মরণীয় পার্থক্যটি হ'ল শ্রেণি ডেটা লুকানো সমর্থন করে এবং স্ট্রাক্ট না করার সময় ডেটা টাইপ করে নির্মিত এমন ক্রিয়াকলাপগুলিও সমর্থন করে!


1
সি ++ এ structসদস্য ফাংশন থাকতে পারে
chtz

@ সিএইচটিজ ধন্যবাদ ... আমি এই মুহূর্তে এই বৈশিষ্ট্যটি সম্পর্কে জানতে পেরেছি .. অনেক অনেক ধন্যবাদ .. আমি কেবল একজন শিক্ষানবিশই না যতটা বিশেষজ্ঞ না ভবিষ্যতে আপনার ছেলেদের কাছ থেকে
যুগ রাওয়াল

এবং প্রকৃতপক্ষে সদস্য ফাংশনটি এর বৃহত্তর অর্থের উদ্দেশ্যে করা উচিত। structকনস্ট্রাক্টর, সদস্য ফাংশন এবং ডিসট্রাক্টর থাকতে পারে (সম্ভবত ভার্চুয়াল, সম্ভবত ব্যক্তিগত, সুরক্ষিত বা পাবলিক)। তারা উত্তরাধিকারী হতে পারে এবং উত্তরাধিকারসূত্রে প্রাপ্ত হতে পারে। সুতরাং প্রকৃতপক্ষে ... একটি শ্রেণীর যা কিছু থাকতে পারে। একটি টিপিকাল কনভেনশন হ'ল স্ট্রাক্ট দিয়ে ঘোষণা করা যা আপনি সিতে কাঠামো হিসাবে ঘোষণা করেছেন, এবং শ্রেণি হিসাবে যদি আমরা প্রাইভেট এবং সুরক্ষিত ভেরিয়েবল, ভার্চুয়াল ফাংশন, কর্টর এবং ডটর ইত্যাদি ঘোষণা করি। তবে এটি কেবল একটি সম্মেলন, ভাষা দ্বারা প্রয়োগ করা হয়নি
জিয়ান পাওলো

-5

আমি অন্য একটি পার্থক্য খুঁজে পেয়েছি। আপনি যদি ক্লাসে কোনও কনস্ট্রাক্টরকে সংজ্ঞায়িত না করেন তবে সংকলক একটিকে সংজ্ঞায়িত করবে। তবে স্ট্রাক্টে আপনি যদি কনস্ট্রাক্টরকে সংজ্ঞায়িত না করেন তবে সংকলকটিও কনস্ট্রাক্টরকে সংজ্ঞায়িত করবেন না। সুতরাং কিছু ক্ষেত্রে যে সত্যই আমাদের কোনও নির্মাণকারীর দরকার নেই, স্ট্রাকটি আরও ভাল পছন্দ (পারফরম্যান্স টিপ)। এবং আমার খারাপ ইংরেজি জন্য দুঃখিত।


4
এটি সত্য নয়। structকীওয়ার্ডের সাথে সংজ্ঞায়িত কোনও শ্রেণি classএবং এই ক্ষেত্রে কীওয়ার্ডের সাথে সংজ্ঞায়িত শ্রেণীর মধ্যে কোনও পার্থক্য নেই ।
ইয়মেট

আমি যখন কনস্ট্রাক্টরের সাথে স্ট্রাক্ট ব্যবহার করি তখন কনস্ট্রাক্টর সহ ক্লাসের চেয়ে ভাল গতি পাই।
আলী

@ অলি না আপনি করবেন না
লাইটনেস রেস

-5

শ্রেণিগুলি হল রেফারেন্সের ধরণ এবং কাঠামোগুলি হ'ল মান ধরণের।
যখন আমি বলি শ্রেণিগুলি রেফারেন্সের ধরণ,
মূলত এগুলিতে একটি উদাহরণ ভেরিয়েবলের ঠিকানা থাকবে।

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

Class MyClass
{
    Public Int DataMember;  //By default, accessibility of class data members 
                            //will be private. So I am making it as Public which 
                            //can be accessed outside of the class.
}

প্রধান পদ্ধতিতে,
আমি নতুন শ্রেণীর অপারেটর ব্যবহার করে এই শ্রেণীর একটি উদাহরণ তৈরি করতে পারি যা এই শ্রেণীর জন্য মেমরি বরাদ্দ করে
এবং এর ভিত্তি ঠিকানাটি MyClass টাইপ ভেরিয়েবল (_myClassObject2) এ সঞ্চয় করে।

Static Public void Main (string[] arg)
{
    MyClass _myClassObject1 = new MyClass();
    _myClassObject1.DataMember = 10;

    MyClass _myClassObject2 = _myClassObject1;
    _myClassObject2.DataMember=20;
}

উপরের প্রোগ্রামে, MyClass _myClassObject2 = _myClassObject1; নির্দেশ নির্দেশ করে যে মাইক্লাস টাইপ উভয় ভেরিয়েবল

  1. myClassObject1
  2. myClassObject2

এবং একই মেমরি অবস্থান নির্দেশ করবে।
এটি মূলত একই মেমরির অবস্থানটিকে একই ধরণের অন্য ভেরিয়েবলে নির্ধারণ করে।

সুতরাং মাইক্লাস টাইপের যে কোনও একটি বস্তুর মধ্যে আমরা যে কোনও পরিবর্তন করি তা অন্যের উপর প্রভাব ফেলবে
যেহেতু উভয়ই একই মেমরির অবস্থানটির দিকে নির্দেশ করছে।

"_myClassObject1. ডেটা মেম্বার = 10;" এই লাইনে অবজেক্টের ডেটা মেম্বারদের উভয়ই 10 এর মান ধারণ করে
; "_myClassObject2.DataMember = 20;" এই লাইনে অবজেক্টের ডেটা মেম্বার উভয়ই 20 এর মান ধারণ করে
Event টির Event আমরা পয়েন্টারগুলির মাধ্যমে কোনও অবজেক্টের ডাটাবেসগুলি অ্যাক্সেস করছি are

শ্রেণীর চেয়ে পৃথক, কাঠামো মান ধরণের। উদাহরণ স্বরূপ:

Structure MyStructure
{
    Public Int DataMember;  //By default, accessibility of Structure data 
                            //members will be private. So I am making it as 
                            //Public which can be accessed out side of the structure.
}

Static Public void Main (string[] arg)
{
    MyStructure _myStructObject1 = new MyStructure();
    _myStructObject1.DataMember = 10;

    MyStructure _myStructObject2 = _myStructObject1;
    _myStructObject2.DataMember = 20;
}

উপরের প্রোগ্রামে,
নতুন অপারেটর ব্যবহার করে মাই স্ট্রাকচার টাইপের অবজেক্ট ইনস্ট্যান্ট
করা এবং মাই স্ট্রাকচার টাইপটির মাই স্ট্রাক্টঅবজেক্ট ভেরিয়েবলের মধ্যে ঠিকানা সংরক্ষণ করা এবং
"_myStructObject1.DataMember = 10" ব্যবহার করে কাঠামোর ডেটা সদস্যকে 10 মান নির্ধারণ করা।

পরের লাইনে,
আমি মাইস্ট্রাকচার টাইপের আরেকটি ভেরিয়েবল _myStructObject2 ঘোষণা করছি এবং এর মধ্যে _myStructObject1 নির্ধারণ করছি।
এখানে। নেট সি # সংকলক _myStructObject1 অবজেক্টের আরেকটি অনুলিপি তৈরি করে এবং
মেমরি স্ট্রাকচার ভেরিয়েবল _myStructObject2 এ সেই মেমরির অবস্থান নির্ধারণ করে।

সুতরাং _myStructObject1 এ আমরা যাই পরিবর্তন করবো না তা মাইস্ট্রাক্ট্রু টাইপের আর কোনও ভেরিয়েবল _myStructObject2 এর উপর কখনই প্রভাব ফেলবে না।
সে কারণেই আমরা বলছি স্ট্রাকচারগুলি মান ধরণের।

সুতরাং ক্লাসের জন্য তাত্ক্ষণিক বেস ক্লাসটি অবজেক্ট এবং স্ট্রাকচারের জন্য তাত্ক্ষণিক বেস ক্লাস হ'ল ভ্যালু টাইপ যা অবজেক্ট থেকে উত্তরাধিকার সূত্রে প্রাপ্ত।
ক্লাসগুলি একটি উত্তরাধিকারকে সমর্থন করবে যেখানে স্ট্রাকচারগুলি তা করবে না।

আমরা কীভাবে বলছি?
আর এর পেছনের কারণ কী?
উত্তর ক্লাস হয়।

এটি বিমূর্ত, সিল করা, স্ট্যাটিক এবং আংশিক হতে পারে এবং ব্যক্তিগত, সুরক্ষিত এবং অভ্যন্তরীণ সুরক্ষিত হতে পারে না।


4
আমি মনে করি এটি সি # এর জন্য প্রশ্নের উত্তর দেওয়ার চেষ্টা করছে? প্রশ্নটি সি ++ সম্পর্কে, এবং এটি এই উত্তরটিকে ভুল করে তোলে, তাই না?
smw

@smw একেবারে, তিনি নিজের নমুনা কোডটি সি # তে লিখেছেন এবং আমি এখানে এসেছি তা পরীক্ষা করতে এসেছি যে সি ++ structএবং এর মধ্যে প্যারামিটারের মধ্যে পার্থক্য নেই class। এখানে কেউই এটি উল্লেখ করেছে না, পুরো ওয়েবও নেই। সুতরাং আমি এটি সি ++ এর ক্ষেত্রে প্রযোজ্য বলে মনে করি না।
জন

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

2
এই উত্তর সম্পূর্ণ বোকা। এটি এর কোড উদাহরণগুলির জন্য ভিজ্যুয়াল বেসিক এবং সি # এর একটি অদ্ভুত মিশ্রণ ব্যবহার করে এবং পুরো "শ্রেণিগুলি হল রেফারেন্সের ধরণ এবং কাঠামোগুলি হ'ল মান ধরণের" ... জিনিসটি কেবল নেট। (যেমন সি #) এর ক্ষেত্রে প্রযোজ্য সি ++ তে নয়। তুমি ভুল ঘরে আছো বন্ধু। এই হল সেই জায়গা যেখানে আপনি অংশভুক্ত stackoverflow.com/questions/13049
TheFlash

তবে এই উত্তরটি সি (++) এর ক্ষেত্রে একই বৈধ, এটি স্ট্রাক্টগুলি মান ধরণের মতো ব্যবহৃত হয় used int a = 3; int b = a;এবং অনুরূপMyStruct a=MyStruct("data"); MyStruct b = a;
ভাগ্যডোনাল্ড

-8

কাঠামো এবং শ্রেণীর মধ্যে 3 টি মৌলিক পার্থক্য রয়েছে

1 স্টেম মেমরি স্ট্যাক মেমরির কাঠামোর জন্য সংরক্ষিত (যা প্রোগ্রামিং ভাষার নিকটে) স্ট্যাক মেমরির শ্রেণীর জন্য কেবল রেফ্রেন্সের জন্য সংরক্ষিত আছে এবং প্রকৃত স্মৃতি হিপ মেমরিতে সংরক্ষিত আছে কিনা।

2 এনডি - ডিফল্ট কাঠামোর দ্বারা শ্রেণিটি ব্যক্তিগত হিসাবে বিবেচনা করা হোক না কেন সেটিকে জনসাধারণ হিসাবে বিবেচনা করে।

3 আরডি- কাঠামোয় কোডটি পুনরায় ব্যবহার করতে পারে না তবে শ্রেণিতে আমরা বহু সময় একই কোডটিকে পুনরায় ব্যবহার করতে পারি যার নাম হেরিরিয়েন্স


2
সি ++ স্ট্রাকচারগুলি উত্তরাধিকার এবং বিমূর্ত পদ্ধতি সমর্থন করে। কাঠামো এবং শ্রেণি একইভাবে বরাদ্দ করা হয়। এম্বেড থাকা সিস্টেমগুলির জন্য "নতুন" দিয়ে ইনস্ট্যান্ট করা না হলেও গাদা হয়ে ক্লাস বরাদ্দ করা।
JCMS

2
# 1 টিও ভুল। আপনি যখন স্থানীয় ভেরিয়েবল হিসাবে type ধরণের কিছু ঘোষণা করেন তখন স্ট্যাকটি ব্যবহৃত হয় এবং আপনি যখন "নতুন" অপারেটর ব্যবহার করেন তখন গাদা ব্যবহৃত হয়।
স্কোর_উন্ডার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.