সি এবং সি++-এর মধ্যে পার্থক্য
| বিষয় | সি | সি++ |
|---|---|---|
| পরিচয় | ডেনিস রিচি ১৯৬৯ সালের দিকে এটি বিএল অ্যাটএন্ডটি ল্যাবসে তৈরি করেন। | বিয়ার্ন স্ট্রৌস্ট্রূপ ১৯৭৯ সালে এটি তৈরি করেন। |
| ভাষার ধরন | প্রক্রিয়ামূলক (Procedural) প্রোগ্রামিং ভাষা। | প্রক্রিয়ামূলক এবং অবজেক্ট-ওরিয়েন্টেড উভয় প্রোগ্রামিং প্যারাডাইম সমর্থন করে। |
| OOPs বৈশিষ্ট্য | OOPs ধারণা সমর্থন করে না, তাই পলিমরফিজম, এনক্যাপসুলেশন এবং ইনহেরিটেন্স নেই। | অবজেক্ট-ওরিয়েন্টেড ভাষা হওয়ায় পলিমরফিজম, এনক্যাপসুলেশন এবং ইনহেরিটেন্স সমর্থন করে। |
| ডেটা নিরাপত্তা | এনক্যাপসুলেশন না থাকায় ডেটা বাইরের কোড দ্বারা ম্যানিপুলেট করা যায়। | এনক্যাপসুলেশন ডেটা লুকিয়ে রাখে যাতে ডেটা স্ট্রাকচার এবং অপারেটর উদ্দেশ्यानুসারে ব্যবহার হয়। |
| চালিত ধরন | ফাংশন-চালিত ভাষা। | অবজেক্ট-চালিত ভাষা। |
| সমর্থিত বৈশিষ্ট্য | ফাংশন ও অপারেটর ওভারলোডিং, নেমস্পেস এবং রেফারেন্স ভেরিয়েবল সমর্থন করে না। | ফাংশন ও অপারেটর ওভারলোডিং, নেমস্পেস এবং রেফারেন্স ভেরিয়েবল সমর্থন করে। |
পয়েন্টার এবং রেফারেন্সের মধ্যে পার্থক্য
- রেফারেন্স একটি বিদ্যমান ভেরিয়েবলকে অন্য নাম দিয়ে নির্দেশ করে, পয়েন্টার ভেরিয়েবলের ঠিকানা সংরক্ষণ করে।
- রেফারেন্সে নাল মান দিতে পারা যায় না, কিন্তু পয়েন্টারে সম্ভব।
- রেফারেন্স ভেরিয়েবল পাস-বাই-ভ্যালু দ্বারা রেফারেন্স করা যায়, পয়েন্টার পাস-বাই-রেফারেন্স দ্বারা।
- রেফারেন্স ঘোষণার সময়ই আরম্ভ করতে হয়, পয়েন্টারের জন্য বাধ্যতামূলক নয়।
- রেফারেন্স মূল ভেরিয়েবলের মতোই মেমরি ঠিকানা শেয়ার করে কিন্তু স্ট্যাকে কিছু জায়গা নেয়, পয়েন্টারের নিজস্ব মেমরি ঠিকানা এবং আকার থাকে।
সি++-এ ভার্চুয়াল ফাংশন কী?
ভার্চুয়াল ফাংশন ব্যবহার করে বেস ক্লাস পয়েন্টারের একটি তালিকা তৈরি করা যায় এবং ডেরাইভড ক্লাসের মেথড কল করা যায়, ডেরাইভড ক্লাস অবজেক্টের ধরন না জানলেও। ভার্চুয়াল ফাংশন রানটাইমে সমাধান হয় (লেট বাইনডিং)।
যদি বেস ক্লাসে একটি ভার্চুয়াল ফাংশন ঘোষণা করা হয়, তবে সেই বেস ক্লাস থেকে ডেরাইভড প্রতিটি ক্লাসে সেটি ভার্চুয়াল হয়ে যায়। তাই ডেরাইভড ক্লাসে রিডিফাইন করার সময় virtual কিওয়ার্ড ব্যবহার করা বাধ্যতামূলক নয়।
উদাহরণ
#include <iostream>
using namespace std;
class B {
public:
virtual void s() {
cout << "In Base \n";
}
};
class D : public B {
public:
void s() {
cout << "In Derived \n";
}
};
int main() {
D d;
B *b = &d;
b->s(); // "In Derived" প্রিন্ট হবে
return 0;
}
আউটপুট
In Derived
সি++-এ this পয়েন্টার কী?
সি++-এ প্রতিটি অবজেক্টের নিজস্ব ঠিকানার অ্যাক্সেস থাকে this পয়েন্টারের মাধ্যমে। এটি সমস্ত মেম্বার ফাংশনের একটি নISPRতি প্যারামিটার। মেম্বার ফাংশনের ভিতরে this ব্যবহার করে আহ্বানকারী অবজেক্টকে নির্দেশ করা যায়।
ফ্রেন্ড ফাংশনের this পয়েন্টার নেই, কারণ ফ্রেন্ড ক্লাসের সদস্য নয়। শুধু মেম্বার ফাংশনের this পয়েন্টার থাকে।
উদাহরণ
#include <iostream>
using namespace std;
class Box {
public:
Box(double l = 2.0, double b = 2.0, double h = 2.0) {
cout << "Constructor called." << endl;
length = l; breadth = b; height = h;
}
double Volume() {
return length * breadth * height;
}
int compare(Box box) {
return this->Volume() > box.Volume();
}
private:
double length, breadth, height;
};
int main() {
Box Box1(3.3, 1.2, 1.5);
Box Box2(8.5, 6.0, 2.0);
if (Box1.compare(Box2))
cout << "Box2 is smaller than Box1" << endl;
else
cout << "Box2 is equal to or larger than Box1" << endl;
return 0;
}
আউটপুট
Constructor called. Constructor called. Box2 is equal to or larger than Box1