Skip to content

মডিউল ৬-০ঃ সূচনা

এই মডিউলে আমরা কি কি শিখবো:

  • সি++ এর স্ট্রিং ক্লাস এর কন্সট্রাক্টর দেখব
  • স্ট্রিং সর্ট করা দেখব
  • রেঞ্জ বেসড ফর লুপ দেখব
  • রিভার্স ওয়ে তে ওয়ার্ড প্রিন্ট করা দেখব
  • ডায়নামিক অবজেক্ট কপি করা দেখব

মডিউল ৬-১ঃ স্ট্রিং কন্সট্রাক্টর

সি প্লাস প্লাস এ বিল্ট-ইন স্ট্রিং ক্লাসে বিল্ট-ইন কন্সট্রাক্টর আছে। এই কন্সট্রাক্টরকে যেরকম ভেলু দেওয়া সেরকম ভাবে কাজ করে। মোট ৪ ভাবে আমরা এই কন্সট্রাক্টরকে ব্যাবহার করতে পারি।

১। শুধু একটি স্ট্রিং দিয়ে:

কন্সট্রাক্টরকে শুধু একটি স্ট্রিং দিয়ে কল করলে সে ওই স্ট্রিংটিকে ভেরিয়েবলের মধ্যে এসাইন করে দেয়। ঠিক যেমন আমরা স্ট্রিং এ ভেলু এসাইন করি তেমনি। নরমালি এটি খুব একটা ব্যাবহার করা হয় না। আমাদের স্ট্রিং এর মধ্যে ভেলু এসাইন করতে হলে আমরা নরমালি ( string s="hello world"; এভাবে ) এসাইন করে ফেলি।

cpp
#include <bits/stdc++.h>

using namespace std;

int main()

{

 // string s="hello world"; // আমরা নরমালি এভাবে এসাইন করি স্ট্রিং।

 string s("hello world"); // স্ট্রিং ক্লাসকে কল করে কন্সট্রাক্টরকে একটি স্ট্রিং দিয়ে দিচ্ছি। কন্সট্রাক্টর সেটি স্ট্রিং s এর মধ্যে এসাইন করে দিচ্ছে।

 cout<<s<<endl;

 return 0;

}

২। একটি স্ট্রিং এবং একটি নাম্বার দিয়ে:

কন্সট্রাক্টরকে একটি স্ট্রিং এবং একটি নাম্বার দিয়ে কল করলে সে ওই স্ট্রিং এর প্রথম থেকে ওই নাম্বার সংখ্যক ক্যারেক্টার ঐ স্ট্রিং ভেরিয়েবলের মধ্যে এসাইন করে দেয়।

cpp
#include <bits/stdc++.h>

using namespace std;

int main()

{

 string s("hello world", 7); // স্ট্রিং ক্লাসকে কল করে কন্সট্রাক্টরকে একটি স্ট্রিং এবং একটি নাম্বার 7 দিয়ে দিচ্ছি। কন্সট্রাক্টর সেই স্ট্রিং এর প্রথম 7টি ক্যারেক্টার স্ট্রিং s মধ্যে এসাইন করে দিচ্ছে।

 cout<<s<<endl; // প্রিন্ট করলে দেখতে পাব প্রথম 7টি ক্যারেক্টার স্ট্রিং এর মধ্যে আছে।

 return 0;

}

৩। একটি স্ট্রিং ভেরিয়েবল এবং একটি নাম্বার দিয়েঃ

কন্সট্রাক্টরকে একটি স্ট্রিং ভেরিয়েবল এবং একটি নাম্বার দিয়ে কল করলে সে ওই স্ট্রিং এর প্রথম থেকে ওই নাম্বার সংখ্যক ক্যারেক্টার বাদ দিয়ে বাকি স্ট্রিংটুকু ওই স্ট্রিং ভেরিয়েবলের মধ্যে এসাইন করে দেয়।

cpp
#include <bits/stdc++.h>

using namespace std;

int main()

{

 string a="hello world"; // একটি স্ট্রিং ভেরিয়েবল নেওয়া হয়েছে।

 string s(a, 4); // স্ট্রিং ক্লাসকে কল করে কন্সট্রাক্টরকে একটি স্ট্রিং ভেরিয়েবল a এবং একটি নাম্বার 4 দিয়ে দিচ্ছি। কন্সট্রাক্টর সেই স্ট্রিং a এর প্রথম 4টি ক্যারেক্টার বাদ দিয়ে বাকি অংশটুকু স্ট্রিং s মধ্যে এসাইন করে দিচ্ছে।

 cout<<s<<endl; // প্রিন্ট করলে দেখতে পাব প্রথম 4টি ক্যারেক্টার বাদে বাকি অংশটুকু স্ট্রিং এর মধ্যে আছে।

 return 0;

}

৪। একটি নাম্বার এবং একটি ক্যারেক্টার দিয়েঃ

কন্সট্রাক্টরকে শুধু একটি নাম্বার এবং একটি ক্যারেক্টার দিয়ে কল করলে সে ওই স্ট্রিং এ ওই ক্যারেক্টারটি ওই নাম্বার সংখ্যক বার রেখে দিবে।

cpp
#include <bits/stdc++.h>

using namespace std;

int main()

{

 string s(26, 'A'); // স্ট্রিং ক্লাসকে কল করে কন্সট্রাক্টরকে একটি নাম্বার 26 এবং একটি ক্যারেক্টার A দিয়ে দিচ্ছি। কন্সট্রাক্টর সেই স্ট্রিং s এর মধ্যে 26টি A এসাইন করে দিচ্ছে।

 cout<<s<<endl; // প্রিন্ট করলে দেখতে পাব 26টি A স্ট্রিং এর মধ্যে আছে।

 return 0;

}

মডিউল ৬-২ঃ সর্ট ফাংশন ব্যাবহার করে স্ট্রিং সর্ট করা

আমরা বিল্ট-ইন সর্ট ফাংশন ব্যাবহার করে এরে সর্ট করা দেখেছি। ঠিক সেইমভাবে আমরা স্ট্রিংও সর্ট করে ফেলতে পারি। সর্ট ফাংশনের মধ্যে আমাদের স্টার্ট এবং এন্ড পয়েন্টার দিতে হয়। এক্ষেত্রে স্ট্রিং ক্লাসের বিল্ট-ইন begin() এবং end() ফাংশন আমরা ব্যাবহার করতে পারি।

cpp
#include <bits/stdc++.h>

using namespace std;

int main()

{

 string s;

 cin>>s; // স্ট্রিং ইনপুট নেওয়া হচ্ছে।

 sort(s.begin(),s.end()); // বিল্ট-ইন সর্ট ফাংশন ব্যাবহার করে স্ট্রিং সর্ট করা হচ্ছে। এক্ষেত্রে স্টার্ট পয়েন্টার হিসেবে স্ট্রিং ক্লাসের বিল্ট-ইন begin() এবং এন্ড পয়েন্টার হিসেবে end() ফাংশন ব্যাবহার করা হয়েছে।

 cout<<s<<endl; // সর্টেড স্ট্রিং প্রিন্ট করা হচ্ছে।

 return 0;

}

মডিউল ৬-৩ঃ স্ট্রিং এ রেঞ্জ বেসড ফর লুপ

স্ট্রিং এর উপর আমরা শর্টকাটে রেঞ্জ বেসড ফর লুপ চালাতে পারি। আমাদের স্ট্রিং এর নাম যদি হয় s তাহলে আমরা লুপ লিখব এভাবে for(char c:s) -> এই লুপ প্রতিবার স্ট্রিং s থেকে একটি করে ক্যারেক্টার c বের করে নিয়ে আসবে। তারপর আমরা চাইলে সেই c কে প্রিন্ট করে দিতে পারব। লুপটি স্ট্রিং শেষ না হওয়া পর্যন্ত চলতে থাকবে।

cpp
#include <bits/stdc++.h>

using namespace std;

int main()

{

 string s;

 cin>>s;

 // for(int i=0;i<s.size();i++) // নরমালি আমরা এভাবে লুপ চালাতাম। এটি ইন্ডেক্স বেসড লুপ। এখানে আমরা ইন্ডেক্স এর উপর লুপ চালিয়ে তারপর সেই ইনডেক্সে থাকা ভেলু প্রিন্ট করে দেই।

 // {

 // cout<<s[i]<<endl;

 // }

 for(char c:s) // শর্টকাটে রেঞ্জ বেসড ফর লুপ চালানো হয়েছে। এই লুপ প্রতিবার স্ট্রিং s থেকে একটি করে ক্যারেক্টার c বের করে নিয়ে আসবে।

 {

 cout<<c<<endl; // তারপর সেই ক্যারেক্টার c কে প্রিন্ট করে দেওয়া হচ্ছে।

 }

 return 0;

}

রেঞ্জ বেসড ফর লুপটি আমরা চালাই স্ট্রিং এর এলিমেন্ট এর উপর। এই লুপে কোনভাবে ইনডেক্স এক্সেস করা যায় না। তাই ইনডেক্স প্রয়োজোন হলে আমাদের নরমাল লুপই চালাতে হবে।

মডিউল ৬-৪ঃ রিভার্স ওয়ার্ড প্রিন্টিং স্ট্রিংস্ট্রিম ব্যাবহার করে

আমরা স্ট্রিংস্ট্রিম দিয়ে একটি স্ট্রিং থেকে ওয়ার্ড প্রিন্ট করা দেখেছি। আজকে আমরা দেখব কিভাবে স্ট্রিংস্ট্রিম দিয়ে একটি স্ট্রিং এর ওয়ার্ড প্রিন্ট করা যায় রিভার্স ওয়েতে।

cpp
#include <bits/stdc++.h>

using namespace std;

int main()

{

 string s;

 getline(cin, s);

 stringstream ss;

 ss << s;

 string word;

 while (ss >> word) {

 cout << word << endl;

 }



 return 0;

}

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

তার আগে আমরা দেখে নেই কিভাবে একটি স্ট্রিংকে রেফারেন্স হিসেবে পাঠাতে পারি ফাংশনের মধ্যে।

cpp
#include <bits/stdc++.h>

using namespace std;

void print(string s) // ফাংশনের প্যারামিটার হিসেবে স্ট্রিংটি নেওয়া হচ্ছে।

{

 s="world"; // স্ট্রিং এর ভেলু চেঞ্জ করে দেওয়া হচ্ছে।

}

int main()

{

 string s="hello"; // একটি স্ট্রিং ডিক্লেয়ার করে তার মধ্যে hello রেখে দেওয়া হচ্ছে।

 print(s); // ফাংশন কল করে তার মধ্যে স্ট্রিংটি দিয়ে দেওয়া হচ্ছে।

 cout<<s<<endl; // স্ট্রিং প্রিন্ট করা হচ্ছে।

 return 0;

}

কোডটি রান করলে দেখব স্ট্রিং এর ভেলু চেঞ্জ হয় নি। শুরুতে hello ছিল তাই আছে। প্রিন্ট করলে দেখতে পাব hello প্রিন্ট হচ্ছে। এর কারন আমরা জানি, আমরা যদি চাই ফাংশনে কোন চেঞ্জ করলে সেটি মেইন ফাংশনেও চেঞ্জ হয়ে যাক, তাহলে আমাদেরকে রেফারেন্স হিসেবে পাঠাতে হয়।

cpp
#include <bits/stdc++.h>

using namespace std;

void print(string & s) // ফাংশনের প্যারামিটার হিসেবে স্ট্রিংটি নেওয়া হচ্ছে কিন্তু রেফারেন্স হিসেবে।

{

 s="world";

}

int main()

{

 string s="hello";

 print(s);

 cout<<s<<endl;

 return 0;

}

এবার কোডটি রান করলে দেখতে পাব স্ট্রিং এর ভেলু চেঞ্জ হয়ে গিয়েছে

আমরা যদি চাই ফাংশনে কোন চেঞ্জ করলে সেটি মেইন ফাংশনেও চেঞ্জ হয়ে যাক, তাহলে আমাদেরকে ফাংশনের প্যারামিটার এর মধ্যে রেফারেন্স হিসেবে রিসিভ করতে হবে।

এবার আমরা স্ট্রিংস্ট্রিম এর কাজটি করব রিকারশন দিয়ে।

cpp
#include <bits/stdc++.h>

using namespace std;

void print(stringstream & ss) // প্যারামিটারে আসা স্ট্রিংটি রিসিভ করা হচ্ছে স্ট্রিংস্ট্রিম এবং রেফারেন্স দিয়ে।

{

 string word;

 if(ss>>word) // প্রতিবার একটি করে ওয়ার্ড নেওয়া হচ্ছে স্ট্রিংস্ট্রিম থেকে।

 {

 cout<<word<<endl; // ওয়ার্ডটি প্রিন্ট করা হচ্ছে।

 print(ss); // রিকারশন ফাংশনকে কল করা হচ্ছে।

 }

}

int main()

{

 string s;

 getline(cin, s); // স্ট্রিং ইনপুট নেওয়া হচ্ছে।

 stringstream ss(s); // স্ট্রিংস্ট্রিম এর মধ্যে স্ট্রিংটি দিয়ে দেওয়া হচ্ছে।

 print(ss); // ফাংশন কল করে স্ট্রিংটি দিয়ে দেওয়া হচ্ছে।

 return 0;

}

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

cpp
#include <bits/stdc++.h>

using namespace std;

void print(stringstream & ss)

{

 string word;

 if(ss>>word)

 {

 print(ss); // আমরা আগে রিকারশনকে কল করছি।

 cout<<word<<endl; // তারপর প্রিন্ট করছি।

 }

}

int main()

{

 string s;

 getline(cin, s);

 stringstream ss(s);

 print(ss);

 return 0;

}

এবার এই কোডটি রান করলে দেখতে পাব ইনপুট দেওয়া স্ট্রিংটি ওয়ার্ড বাই ওয়ার্ড প্রিন্ট হচ্ছে রিভার্স ওয়েতে।

নিচের C++ কোডটি reverse() ফাংশন ব্যবহার করে একটি স্ট্রিং ইনপুট নিয়ে সেটিকে উল্টে দেয় এবং তারপর আউটপুট প্রিন্ট করে:

এখানে,

🔸 reverse() ফাংশনটি algorithm হেডার থেকে এসেছে।

🔸 এটি s স্ট্রিংয়ের শুরু (s.begin()) থেকে শেষ (s.end()) পর্যন্ত প্রতিটি ক্যারেক্টারকে উল্টে দেয়।

🔸 যেমন: HelloolleH

Code:

cpp
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    string s;
    cin >> s; // ব্যবহারকারীর কাছ থেকে একটি স্ট্রিং ইনপুট নেওয়া হচ্ছে, যেমনঃ Hello

    reverse(s.begin(), s.end()); // এটি `s` স্ট্রিংয়ের শুরু থেকে শেষ পর্যন্ত প্রতিটি ক্যারেক্টারকে উল্টে দেয়

    cout << s << endl;
    return 0;
}

Output:

olleH

মডিউল ৬-৫ঃ ক্লাসের ভেতর ফাংশন

এবার আমরা দেখব কিভাবে ক্লাসের ভেতর ফাংশন নিয়ে কাজ করতে হয়।

শুরুতে আমরা একটি ক্লাস নিয়ে নেই।

cpp
#include <bits/stdc++.h>

using namespace std;

class Person

{

 public:

 string name; // এবার আর আমাদের ক্যারেক্টার এরে নেওয়ার প্রয়োজন নেই আমরা স্ট্রিং নিয়ে নিব।

 int age;

 Person(string nm, int ag)

 {

 name=nm;

 age=ag;

 }

};

int main()

{

 Person rakib("Rakib Ahsan", 24); // যেহেতু আমরা স্ট্রিং ডাটা টাইপ নিয়েছি তাই সরাসরি স্ট্রিং এ ভেলু এসাইন করে দেওয়া যাবে। আলাদাভাবে কপি করে বসাতে হবে না।

 cout<<rakib.name<<" "<< rakib.age << endl;

 return 0;

}

এবার আমরা চাইলে ক্লাসের ভেতর ফাংশনও নিয়ে নিতে পারব। অবজেক্ট থেকে ডট (.) দিয়ে ভ্যারিয়েবল যেভাবে এক্সেস করা যায় ঠিক একইভাবে ফাংশনও এক্সেস করা যাবে

cpp
#include <bits/stdc++.h>

using namespace std;

class Person

{

 public:

 string name;

 int age;

 Person(string nm, int ag)

 {

 name=nm;

 age=ag;

 }

 void print() // ক্লাসের ভেতর একটি ফাংশন নেওয়া হয়েছে।

 {

 cout<<name<<" "<<age<<endl; // ফাংশনের ভেতর অবজেক্টের নাম এবং বয়স প্রিন্ট করে দেওয়া হচ্ছে।

 }

};

int main()

{

 Person rakib("Rakib Ahsan", 24); // অবজেক্ট ডিক্লেয়ার করা হচ্ছে।

 rakib.print(); // অবজেক্টকে ডট দিয়ে যেভাবে ভেরিয়েবল পাওয়া যেত ঠিক তেমনি ফাংশনও পাওয়া যায়। যেহেতু এটি একটি ফাংশন তাই এটিকে কল করতে হয় () দিয়ে। কল করার পর এটি নরমাল ফাংশন এর মতোই কাজ করে।

 return 0;

}

মডিউল ৬-৬ঃ this কি-ওয়ার্ড রিকেপ

আমরা চাইলে স্ট্রিং এর সাথেও this কি-ওয়ার্ড ব্যাবহার করতে পারি।

cpp
#include <bits/stdc++.h>

using namespace std;

class Person

{

 public:

 string name;

 int age;

 Person(string name, int age)

 {

 this->name=name; // ক্লাস ভেরিয়েবল এবং কন্সট্রাক্টর এর প্যারামিটার এর ভেরিয়েবল সেইম তাই this কি-ওয়ার্ড ব্যাবহার করা হচ্ছে।

 this->age=age;

 }

};

int main()

{

 Person rakib("Rakib Ahsan", 24);

 cout<<rakib.name<<" "<< rakib.age << endl;

 return 0;

}

মডিউল ৬-৭ঃ ডায়নামিক অবজেক্ট কপি করা

এবার আমরা দেখব কিভাবে ডায়নামিক অবজেক্ট কপি করা যায়।

আমরা দুটি ডায়নামিক অবজেক্ট নিয়ে একটির মধ্যে আরেকটি কপি করে রেখে দেই।

cpp
#include <bits/stdc++.h>

using namespace std;

class Person

{

 public:

 string name;

 int age;

 Person(string name, int age)

 {

 this->name=name;

 this->age=age;

 }

};

int main()

{

 Person* rakib=new Person("Rakib Ahsan", 25); // দুটি ডায়নামিক অবজেক্ট ডিক্লেয়ার করা হয়েছে rakib এবং sakib নামে।

 Person* sakib=new Person("Sakib Ahamed", 23);



 rakib=sakib; // rakib এর মধ্যে sakib কে কপি করে রেখে দেওয়া হচ্ছে।



 cout<<rakib->name<<" "<<rakib->age<<endl; // তারপর রাকিব এর নাম এবং বয়স প্রিন্ট করা হচ্ছে।

 return 0;

}

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

cpp
#include <bits/stdc++.h>

using namespace std;

class Person

{

 public:

 string name;

 int age;

 Person(string name, int age)

 {

 this->name=name;

 this->age=age;

 }

};

int main()

{

 Person* rakib=new Person("Rakib Ahsan", 25); // দুটি ডায়নামিক অবজেক্ট ডিক্লেয়ার করা হয়েছে rakib এবং sakib নামে।

 Person* sakib=new Person("Sakib Ahamed", 23);



 rakib=sakib; // rakib এর মধ্যে sakib কে কপি করে রেখে দেওয়া হচ্ছে।

 delete sakib; // sakib কে ডিলিট করে দেওয়া হচ্ছে।

 cout<<rakib->name<<" "<<rakib->age<<endl;

 return 0;

}

কোডটি রান করলে দেখব এবার কিছুই প্রিন্ট হচ্ছে না। এখন আমরা যদি প্রপারলি অবজেক্ট কপি করতে চাই তাহলে আমাদের অবজেক্টের প্রতিটি ভ্যারিয়েবল আলাদা আলাদা ভাবে কপি করতে হবে।

cpp
#include <bits/stdc++.h>

using namespace std;

class Person

{

 public:

 string name;

 int age;

 Person(string name, int age)

 {

 this->name=name;

 this->age=age;

 }

};

int main()

{

 Person* rakib=new Person("Rakib Ahsan", 25); // দুটি ডায়নামিক অবজেক্ট ডিক্লেয়ার করা হয়েছে rakib এবং sakib নামে।

 Person* sakib=new Person("Sakib Ahamed", 23);



 rakib->name=sakib->name; // সাকিব অবজেক্ট এর নাম রাকিব অবজেক্ট এর নামে রেখে দেওয়া হচ্ছে।

 rakib->age=sakib->age; // সাকিব অবজেক্ট এর বয়স রাকিব অবজেক্ট এর বয়সে রেখে দেওয়া হচ্ছে।



 delete sakib; // sakib কে ডিলিট করে দেওয়া হচ্ছে।

 cout<<rakib->name<<" "<<rakib->age<<endl;

 return 0;

}

এবার কোডটি রান করলে দেখতে পাব সাকিবকে ডিলিট করে দেওয়ার পরও রাকিব এর নাম এবং বয়স প্রোপারলি প্রিন্ট হচ্ছে। কারন আমরা সরাসরি কপি না করে একটি একটি ভেরিয়েবল ম্যানুয়ালি কপি করেছি।

এই পুরো কাজটি আমরা একটি একটি ভ্যারিয়েবলে না করে যদি সরাসরি করতে চাই এবং ডিলিট করে দেওয়ার পরও যেন থেকে যায় সেটা যদি চাই তাহলে আমরা এইভাবে ( *rakib=*sakib ) করতে পারি। তাহলে উপরে আমরা যেভাবে একটি একটি করে ভেরিয়েবল কপি করেছিলাম ঠিক এই কাজটিই হবে এখানে। এটি হচ্ছে একটি একটি ভেরিয়েবল কপি করার শর্টকাট।

cpp
#include <bits/stdc++.h>

using namespace std;

class Person

{

 public:

 string name;

 int age;

 Person(string name, int age)

 {

 this->name=name;

 this->age=age;

 }

};

int main()

{

 Person* rakib=new Person("Rakib Ahsan", 25);

 Person* sakib=new Person("Sakib Ahamed", 23);



 *rakib=*sakib; // একটি একটি ভেরিয়েবল কপি করার শর্টকাট

 delete sakib;



 cout<<rakib->name<<" "<<rakib->age<<endl;

 return 0;

}

এবার কোডটি রান করলে দেখতে পাব সাকিবকে ডিলিট করে দেওয়ার পরও রাকিব এর নাম এবং বয়স প্রোপারলি প্রিন্ট হচ্ছে।

এবার নিশ্চয়ই আপনারা ৩.৫ মডিউলের প্র্যাকটিস প্রবলেম ধোনি এবং কোহলি প্রবলেমটির আন্সার পেয়ে গিয়েছেন।

Released under the MIT License.