সি / সি ++ স্ট্রাক্ট বনাম ক্লাস


108

আমার সি ++ ক্লাস শেষ করার পরে আমার কাছে মনে হয়েছিল স্ট্রাক্ট / ক্লাসগুলি কয়েকটি ছোট ছোট পার্থক্য বাদে কার্যত অভিন্ন।

আমি সি তে আগে কখনও প্রোগ্রাম করি নি; তবে আমি জানি যে এটির স্ট্রাক্ট রয়েছে। সি-তে অন্য স্ট্রাইকগুলির উত্তরাধিকারী হওয়া এবং সরকারী / ব্যক্তিগত একটি সংশোধক স্থাপন করা সম্ভব?

আপনি যদি নিয়মিত সিতে এটি করতে পারেন তবে বিশ্বে কেন আমাদের সি ++ প্রয়োজন? ক্লাস কি স্ট্রাক্ট থেকে আলাদা করে তোলে?

c++  class  struct 

সম্ভাব্য প্রতিলিপির stackoverflow.com/questions/54585/...
gonzobrains

উত্তর:


146

সি ++ তে স্ট্রাইক এবং ক্লাসগুলি প্রায় একই রকম; পার্থক্যটি হ'ল যেখানে প্রাইভেট থেকে ডিফল্ট ক্লাসে অ্যাক্সেস মডিফায়ার (সদস্য ভেরিয়েবল, পদ্ধতি এবং বেস ক্লাসের জন্য), স্ট্রাইকগুলিতে ডিফল্টে ডিফল্টে অ্যাক্সেস মডিফায়ারগুলি অ্যাক্সেস করতে পারে।

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

যদিও সি-তে কিছু ওওপি জাল করা সম্ভব, উদাহরণস্বরূপ, ফাংশনগুলি সংজ্ঞায়িত করে যা সমস্তগুলি তাদের প্রথম প্যারামিটার হিসাবে কোনও কাঠামোর দিকে নির্দেশ করে, বা মাঝেমধ্যে একই প্রথম কয়েকটি ক্ষেত্রের সাথে "সাব / সুপারক্লাস" হতে জোর করে তোলে —এর সর্বদা সাজান বোল্ট করা, এবং সত্যই ভাষার অংশ নয়।


ওওপি সম্ভাব্য থেকে। নেট ছেলেরা এটিকে এভাবে সংজ্ঞায়িত করেছে ✓ কনসাইডার যদি শ্রেণীর পরিবর্তে কাঠামো সংজ্ঞায়িত করে তবে ধরণের উদাহরণগুলি ছোট এবং সাধারণভাবে স্বল্প-জীবনী হয় বা সাধারণত অন্য বস্তুতে এম্বেড থাকে। এক্স এভিআইডিড স্ট্রাক্ট সংজ্ঞায়িত করে যতক্ষণ না টাইপটিতে নিম্নলিখিত সমস্ত বৈশিষ্ট্য থাকে: ১. এটি যৌক্তিকভাবে একটি একক মানকে উপস্থাপন করে, আদিম ধরণের (ইন্ট, ডাবল ইত্যাদি) অনুরূপ। ২. এটির আকারের আকার 16 বাইটের নিচে রয়েছে। ৩. এটি অপরিবর্তনীয়।
অভিজিৎ

5
@ অভিজিৎ এটি সি # তে স্ট্রাইক এবং ক্লাসের মধ্যে পার্থক্য, তবে এটি কেবল সি ++ এর চেয়ে অপ্রাসঙ্গিক এবং সি এর চেয়ে আরও অনেক বেশি, সি # তে ক্লাস এবং স্ট্রাক্টগুলি আসলে আলাদা; সি ++ তে তেমন নয় এবং সি এর কেবল ওও ছাড়াই স্ট্রাক্ট রয়েছে।
আন্টাল স্পেক্টর-জাবুস্কি

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

15

অন্য যে ডিফল্ট অ্যাক্সেসের মধ্যে পার্থক্য রয়েছে (সরকারী / ব্যক্তিগত), কোনও পার্থক্য নেই।

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

নোট করুন যে সি ইউনিয়নগুলি সি ++ এর সাথে কাজ করে তবে অন্যভাবে নয়। উদাহরণ স্বরূপ

union WorksWithCppOnly{
    WorksWithCppOnly():a(0){}
    friend class FloatAccessor;
    int a;
private:
    float b;
};

এবং একইভাবে

typedef union friend{
    int a;
    float b;
} class;

কেবল সি তে কাজ করে


9
আপনার সি কোডে সিপিপি কীওয়ার্ড ব্যবহার করা এবং তারপরে এটি সিপিপি সামঞ্জস্যপূর্ণ নয় দাবি করা বোকামি
দানি

7

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

গাইডলাইন থেকে এখানে একটি প্রাসঙ্গিক বিভাগ:

সি .২: ক্লাসটির যদি ইনগ্রেন্ট থাকে তবে ক্লাসটি ব্যবহার করুন; ডেটা সদস্যরা স্বতন্ত্রভাবে পরিবর্তিত হতে পারে যদি কাঠামো ব্যবহার করুন

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

সমস্ত ডেটা সদস্য যদি একে অপরের থেকে স্বতন্ত্রভাবে পরিবর্তিত হতে পারে তবে কোনও আক্রমণকারী সম্ভব হয় না।

কোনও শ্রেণীর যদি কোনও ব্যক্তিগত ডেটা থাকে তবে কোনও ব্যবহারকারীর বিনা ব্যবহারকারীর ব্যবহার ব্যতীত কোনও বিষয় সম্পূর্ণরূপে আরম্ভ করতে পারে না। সুতরাং, শ্রেণি নির্ধারক একটি নির্মাণকারী সরবরাহ করবে এবং এর অর্থ নির্দিষ্ট করতে হবে। এটি কার্যকরভাবে একটি আগত ব্যক্তিকে সংজ্ঞায়িত করার সুনির্দিষ্ট প্রয়োজনের অর্থ।

প্রয়োগ

সমস্ত ডেটা বেসরকারী এবং জনসাধারণের সদস্যদের সহ ক্লাস সহ স্ট্রাইকগুলি সন্ধান করুন।

দেওয়া কোডের উদাহরণগুলি:

struct Pair {  // the members can vary independently
    string name;
    int volume;
};

// but

class Date {
public:
    // validate that {yy, mm, dd} is a valid date and initialize
    Date(int yy, Month mm, char dd);
    // ...
private:
    int y;
    Month m;
    char d;    // day
};

Classউদাহরণস্বরূপ, একে অপরের কাছ থেকে প্রাপ্ত বা আন্তঃসম্পর্কিত সদস্যদের জন্য এগুলি ভালভাবে কাজ করে। তারা তাত্ক্ষণিকভাবে স্যানিটি পরীক্ষা করতে সহায়তা করতে পারে। Struct"ব্যাগ অফ ডেটা" রাখার জন্য ভাল কাজ করে, যেখানে বিশেষ কিছু হয় না তবে সদস্যরা যৌক্তিকভাবে একত্রিত হওয়ার বিষয়টি বোঝায়।

এ থেকে, এটি উপলব্ধি করে যে classএসইগুলি এনক্যাপসুলেশন এবং অন্যান্য সম্পর্কিত কোডিং ধারণাগুলি সমর্থন করে, এটি structকেবল খুব কার্যকর নয়।


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

6

সদস্য ফাংশনগুলি সংজ্ঞায়িত করা বা সি থেকে একে অপরের কাছ থেকে স্ট্রাইক নেওয়া সম্ভব নয়

এছাড়াও, সি ++ কেবল সি + "ডেরিভ স্ট্রাক্ট" নয়। টেমপ্লেট, রেফারেন্স, ব্যবহারকারীর সংজ্ঞায়িত নেমস্পেস এবং অপারেটর ওভারলোডিং সমস্ত সি তে বিদ্যমান নেই


আমি জানি যে টেমপ্লেটগুলি ইত্যাদির জন্য সি তে বিদ্যমান নেই তবে আমি powerসি এর স্ট্রাক্ট সম্পর্কে অবগত ছিলাম না সুতরাং সি ++ কেবলমাত্র স্ট্রাক্টগুলিকে সি'র সাথে 'পিছনে' সামঞ্জস্যপূর্ণ ব্যবহার করে?

4
শুধু পিছনের সামঞ্জস্য জন্য? ব্যবহারিক ভিত্তিতে সম্ভবত এটির জন্য কিছু রয়েছে, তবে পার্থক্যটি অভিপ্রায়র সংকেত হতে পারে: যেখানে আমি একটি ব্যবহার করি যেখানে structবেশিরভাগ প্যাসিভ পিওডি ধরণের জিনিসযুক্ত।
ডিএমকেই --- প্রাক্তন-মডারেটর বিড়ালছানা

@ ডিএমকেই: এটির মূল্যের জন্য, বেশিরভাগ এসটিএল ফান্টেক্টর (যেমন std::less) স্ট্রাক্ট হিসাবে সংজ্ঞায়িত করা হয়, ক্লাস নয়।
বিলি ওনিল

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

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

3

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


1

সি ++ প্রাথমিকভাবে স্ট্রোক ব্যবহার করে 1) সি এবং 2) পিওডি ধরণের সাথে পিছনের দিকে সামঞ্জস্য। সি স্ট্রাক্টগুলির কোনও পদ্ধতি, উত্তরাধিকার বা দৃশ্যমানতা নেই।


2
এটির মূল্যের জন্য, বেশিরভাগ এসটিএল ফান্টেক্টর (যেমন std::less) স্ট্রাক্ট হিসাবে সংজ্ঞায়িত করা হয়, ক্লাস নয়।
বিলি ওনিল

3
মনে রাখবেন যে সি ++ স্ট্রাক্টের পদ্ধতি, উত্তরাধিকার এবং দৃশ্যমানতা রয়েছে।
Robertwb

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