একটি গভীর অনুলিপি এবং অগভীর অনুলিপি মধ্যে পার্থক্য কি?
একটি গভীর অনুলিপি এবং অগভীর অনুলিপি মধ্যে পার্থক্য কি?
উত্তর:
অগভীর কপিগুলি যতটা সম্ভব নকল করুন। একটি সংগ্রহের অগভীর অনুলিপি উপাদান কাঠামোর অনুলিপি। অগভীর অনুলিপি সহ দুটি সংগ্রহ এখন পৃথক উপাদানগুলি ভাগ করে।
গভীর অনুলিপি সব কিছু নকল। মূল সংগ্রহের অনুলিপিযুক্ত সমস্ত উপাদান সহ একটি সংগ্রহের একটি গভীর অনুলিপি দুটি সংগ্রহ।
প্রস্থ বনাম গভীরতা; আপনার বস্তুর সাথে মূল নোড হিসাবে রেফারেন্সের গাছ হিসাবে বিবেচনা করুন।
অগভীর:
ভেরিয়েবলগুলি এ এবং বি মেমোরির বিভিন্ন ক্ষেত্রকে নির্দেশ করে, যখন বি এ-কে নির্ধারিত হয় দুটি ভেরিয়েবল একই মেমরির ক্ষেত্রকে নির্দেশ করে। পরে যে কোনও বিষয়বস্তুতে পরিবর্তনগুলি তত্ক্ষণাত্ অন্য সামগ্রীতে প্রতিফলিত হয়, কারণ তারা সামগ্রী ভাগ করে দেয়।
ডীপ:
ভেরিয়েবলগুলি এ এবং বি মেমোরির বিভিন্ন ক্ষেত্রকে নির্দেশ করে, যখন বি মেমোরি ক্ষেত্রের মানগুলিকে এ-তে নির্ধারিত হয় যা এটিকে বিন্দুতে মেমরি অঞ্চলে নীতিবদ্ধ করে যা বি বিন্দুতে নির্দেশ করে। পরবর্তীকালে এর লিখিত সামগ্রীর পরিবর্তনগুলি এ বা বিতে অনন্য থেকে যায়; বিষয়বস্তু ভাগ করা হয় না।
সংক্ষেপে, এটি কোনটি নির্দেশ করে তা নির্ভর করে। অগভীর অনুলিপিতে, বস্তু বি মেমরির এ এর অবস্থানকে আপত্তি করতে নির্দেশ করে। গভীর অনুলিপিতে, বস্তুর A এর মেমরি অবস্থানের সমস্ত জিনিস বি এর মেমরির অবস্থানটির জন্য অনুলিপি করা হয়।
এই উইকি নিবন্ধটিতে দুর্দান্ত চিত্র রয়েছে।
নিম্নলিখিত চিত্র বিবেচনা করার চেষ্টা করুন
উদাহরণস্বরূপ অবজেক্ট.মেমবারওয়াই ক্লোন একটি অগভীর অনুলিপি লিঙ্ক তৈরি করে
এবং ICloneable ইন্টারফেস ব্যবহার করে আপনি এখানে বর্ণিত হিসাবে গভীর অনুলিপি পেতে পারেন
বিশেষত আইওএস বিকাশকারীদের জন্য:
যদি B
একটি হয় অগভীর কপি এর A
, তারপর আদিম ডেটা মত জন্য B = [A assign];
এবং বস্তু এটা কেমন জন্য B = [A retain]
;
বি এবং একই মেমরি অবস্থানের একটি বিন্দু
যদি B
এর একটি গভীর অনুলিপি হয় A
, তবে এটির মতোB = [A copy];
বি এবং বিভিন্ন মেমরি অবস্থানের জন্য একটি বিন্দু
বি মেমরি ঠিকানা এ এর মতোই
খ এর এ এর মতো সামগ্রী রয়েছে
অগভীর অনুলিপি: সদস্যের মানগুলি একটি বস্তু থেকে অন্য বস্তুতে অনুলিপি করে।
গভীর অনুলিপি: সদস্যের মানগুলি একটি বস্তু থেকে অন্য বস্তুতে অনুলিপি করে।
যে কোনও পয়েন্টার অবজেক্টগুলি নকল করে এবং ডিপ কপি করা হয়।
উদাহরণ:
class String
{
int size;
char* data;
};
String s1("Ace"); // s1.size = 3 s1.data=0x0000F000
String s2 = shallowCopy(s1);
// s2.size =3 s2.data = 0X0000F000
String s3 = deepCopy(s1);
// s3.size =3 s3.data = 0x0000F00F
// (With Ace copied to this location.)
আমি এখানে একটি সংক্ষিপ্ত, সহজ উত্তরটি দেখতে পাইনি - তাই আমি এটি দিয়ে চেষ্টা করব।
অগভীর অনুলিপি সহ উত্স দ্বারা নির্দেশিত যে কোনও বস্তুর গন্তব্য দ্বারাও নির্দেশ করা হয় (যাতে কোনও রেফারেন্সযুক্ত বস্তু অনুলিপি না হয়)।
একটি গভীর অনুলিপি সহ, উত্স দ্বারা নির্দেশিত যে কোনও বস্তু অনুলিপি করা হয় এবং অনুলিপিটি গন্তব্য দ্বারা নির্দেশিত হয় (সুতরাং এখন প্রতিটি রেফারেন্সযুক্ত বস্তুর 2 থাকবে)। এটি বস্তু গাছকে পুনরুক্ত করে।
সহজে বোঝার জন্য আপনি এই নিবন্ধটি অনুসরণ করতে পারেন: https://www.cs.utexas.edu/~scottm/cs307/handouts/दीपCopying.htm
অগভীর অনুলিপি:
গভীর অনুলিপি:
Two দুটি অবজেক্টের কল্পনা করুন: একই ধরণের A এবং B _t (সি ++ এর সাথে সম্মত) এবং আপনি এ থেকে বি-তে অগভীর / গভীর অনুলিপি করার বিষয়ে ভাবছেন}
অগভীর অনুলিপি: কেবল এ এর বি এর রেফারেন্সের একটি অনুলিপি তৈরি করে এ এর ঠিকানার একটি অনুলিপি হিসাবে এটি ভাবুন। সুতরাং, এ এবং বি এর ঠিকানাগুলি একই হবে অর্থাত তারা একই মেমরির অবস্থান অর্থাৎ ডেটা বিষয়বস্তুগুলিতে নির্দেশ করবে।
গভীর অনুলিপি: খালি এ এর সমস্ত সদস্যের একটি অনুলিপি তৈরি করে, বি এর জন্য আলাদা স্থানে মেমরি বরাদ্দ করে এবং অনুলিপি করা সদস্যদের গভীর অনুলিপি অর্জনের জন্য বি তে নিয়োগ দেয়। এইভাবে, যদি এ অ-অযৌক্তিক হয়ে যায় তবে বি এখনও স্মৃতিতে বৈধ। ব্যবহারের সঠিক শব্দটি ক্লোনিং হবে, যেখানে আপনি জানেন যে তারা উভয়ই সম্পূর্ণ এক, তবে এখনও আলাদা (অর্থাত মেমরির জায়গাতে দুটি পৃথক সত্তা হিসাবে সঞ্চিত)। আপনি আপনার ক্লোন মোড়ক সরবরাহ করতে পারেন যেখানে আপনি অনুলিপি / বর্জনীয় তালিকার মাধ্যমে সিদ্ধান্ত নিতে পারবেন গভীর অনুলিপি করার সময় কোন বৈশিষ্ট্যগুলি নির্বাচন করতে হবে। আপনি এপিআই তৈরি করার সময় এটি বেশ সাধারণ অনুশীলন।
জড়িত অংশগুলি আপনি কেবলমাত্র শ্যালো অনুলিপি করতে বেছে নিতে পারেন understand আপনি যখন সি ++ বা সি এর সাথে ডিল করার জন্য প্রচুর সংখ্যক পয়েন্টার রেখেছেন তখন কোনও বস্তুর অগভীর অনুলিপি করা সত্যিই খারাপ ধারণা।
EXAMPLE_OF_DEEP COPY_ একটি উদাহরণ হ'ল আপনি যখন ইমেজ প্রসেসিং এবং অবজেক্টের স্বীকৃতি দেওয়ার চেষ্টা করছেন তখন আপনার প্রসেসিং অঞ্চলগুলির বাইরে "অপ্রাসঙ্গিক এবং পুনরাবৃত্ত গতি "টি মাস্ক করা দরকার। আপনি যদি ইমেজ পয়েন্টার ব্যবহার করে থাকেন তবে সেই মাস্ক চিত্রগুলি সংরক্ষণ করার জন্য আপনার কাছে স্পেসিফিকেশন থাকতে পারে। এখন ... আপনি যদি চিত্রটির অগভীর অনুলিপি করেন, যখন পয়েন্টার রেফারেন্সগুলি স্ট্যাক থেকে মেরে ফেলা হয়, আপনি রেফারেন্সটি এবং তার অনুলিপিটি হারিয়েছেন অর্থাৎ কোনও সময়ে অ্যাক্সেস লঙ্ঘনের একটি রানটাইম ত্রুটি থাকবে। এই ক্ষেত্রে, আপনার যা প্রয়োজন তা হ'ল এটি বন্ধ করে আপনার চিত্রের একটি গভীর অনুলিপি। ভবিষ্যতে আপনার যদি মুখোশের প্রয়োজন হয় তবে আপনি এটি পুনরুদ্ধার করতে পারেন।
EXAMPLE_OF_SHALLOW_COPY স্ট্যাকওভারফ্লোতে থাকা ব্যবহারকারীদের তুলনায় আমি খুব বেশি জ্ঞানবান নই তাই এই অংশটি মুছে ফেলতে নির্দ্বিধায় এবং যদি আপনি স্পষ্ট করতে পারেন তবে একটি ভাল উদাহরণ রেখে যেতে পারেন। তবে আমি সত্যিই মনে করি অগভীর অনুলিপি করা ভাল ধারণা নয় যদি আপনি জানেন যে আপনার প্রোগ্রামটি অসীম সময়ের জন্য চলবে অর্থাৎ ফাংশন কলগুলির সাথে স্ট্যাকের উপর অবিচ্ছিন্ন "পুশ-পপ" অপারেশন চলছে। যদি আপনি কোনও অপেশাদার বা নবজাতক ব্যক্তির কাছে কিছু প্রদর্শন করে থাকেন (যেমন সি / সি ++ টিউটোরিয়াল স্টাফ) তবে এটি সম্ভবত ঠিক আছে। তবে আপনি যদি নজরদারি এবং সনাক্তকরণ সিস্টেম, বা সোনার ট্র্যাকিং সিস্টেমের মতো কোনও অ্যাপ্লিকেশন চালিয়ে যাচ্ছেন তবে আপনার অজানা আপনার অনুলিপিগুলি অনুলিপি করা উচিত নয় কারণ এটি আপনার প্রোগ্রামটি শীঘ্রই বা পরে হত্যা করবে।
অগভীর কপি কি?
অগভীর অনুলিপি কোনও বস্তুর বিট বুদ্ধিযুক্ত অনুলিপি। একটি নতুন অবজেক্ট তৈরি করা হয়েছে যার মূল অবজেক্টের মানগুলির একটি অনুলিপি রয়েছে। যদি অবজেক্টের কোনও ক্ষেত্র অন্য অবজেক্টের রেফারেন্স হয় তবে কেবলমাত্র রেফারেন্স ঠিকানাগুলি অনুলিপি করা হয়, কেবলমাত্র মেমরির ঠিকানাটি অনুলিপি করা হয়।
এই চিত্র সালে MainObject1
ক্ষেত্র রয়েছে field1
টাইপ int-, এবং ContainObject1
ধরণ ContainObject
। আপনার একটি অগভীর কপি পেয়েছেন MainObject1
, MainObject2
সঙ্গে তৈরি করা হয় field2
এর অনুলিপি মান ধারণকারী field1
এবং এখনও নির্দেশিত ContainObject1
নিজেই। নোট করুন যেহেতু field1
আদিম ধরণের, তাই এর মান অনুলিপি করা হয়েছে field2
তবে যেহেতু ContainedObject1
একটি অবজেক্ট তাই MainObject2
এখনও পয়েন্ট করে ContainObject1
। করা যে কোনো পরিবর্তন তাই ContainObject1
এ MainObject1
প্রতিফলিত হবে MainObject2
।
এখন যদি এটি অগভীর অনুলিপি হয় তবে আসুন দেখে নেওয়া যাক গভীর অনুলিপিটি কী?
ডিপ কপি কি?
একটি গভীর অনুলিপি সমস্ত ক্ষেত্রের অনুলিপি করে এবং ক্ষেত্রগুলি দ্বারা নির্দেশিত গতিশীলভাবে মেমরির অনুলিপি তৈরি করে। একটি গভীর অনুলিপি ঘটে যখন কোনও বস্তু যার সাথে এটি উল্লেখ করা হয় তার সাথে অনুলিপি করা হয়।
এই চিত্র সালে MainObject1 ক্ষেত্র আছে field1
টাইপ int-, এবং ContainObject1
ধরণ ContainObject
। আপনার একটি গভীর কপি পেয়েছেন MainObject1
, MainObject2
সঙ্গে তৈরি করা হয় field2
এর অনুলিপি মান ধারণকারী field1
এবং ContainObject2
এর কপি মান ধারণকারী ContainObject1
। করা যে কোনো পরিবর্তন দ্রষ্টব্য ContainObject1
মধ্যে MainObject1
মধ্যে প্রতিফলিত হবে না MainObject2
।
field3
যে যখন সমস্যাটির মতো গভীর কিছু বোঝার চেষ্টা করতে পারে, সেই উদাহরণটিতে কোথায় # 3 হচ্ছে ContainObject2
?
অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ে কোনও ধরণের সদস্য ক্ষেত্রের সংগ্রহ অন্তর্ভুক্ত থাকে। এই ক্ষেত্রগুলি হয় মান দ্বারা বা রেফারেন্স দ্বারা (যেমন, একটি মানের একটি পয়েন্টার) সংরক্ষণ করা যেতে পারে।
অগভীর অনুলিপিতে, টাইপের একটি নতুন উদাহরণ তৈরি করা হয় এবং মানগুলি নতুন উদাহরণে অনুলিপি করা হয়। রেফারেন্স পয়েন্টারগুলিও মানগুলির মতোই অনুলিপি করা হয়। অতএব, রেফারেন্সগুলি মূল বস্তুর দিকে নির্দেশ করছে। রেফারেন্স দ্বারা সঞ্চিত সদস্যদের যে কোনও পরিবর্তনগুলি মূল এবং অনুলিপি উভয়তেই উপস্থিত হয়, যেহেতু কোনও অনুলিপি রেফারেন্সযুক্ত বস্তুর তৈরি করা হয়নি।
একটি গভীর অনুলিপিতে, মান দ্বারা সঞ্চিত ক্ষেত্রগুলি আগের মতো অনুলিপি করা হয়, তবে রেফারেন্স দ্বারা সঞ্চিত বস্তুগুলির পয়েন্টারগুলি অনুলিপি করা হয় না। পরিবর্তে, রেফারেন্স করা অবজেক্টের একটি গভীর অনুলিপি তৈরি করা হয় এবং নতুন অবজেক্টের একটি পয়েন্টার সংরক্ষণ করা হয়। এই রেফারেন্সযুক্ত অবজেক্টগুলিতে যে কোনও পরিবর্তন করা হয়েছে তা বস্তুর অন্যান্য অনুলিপিগুলিকে প্রভাবিত করবে না।
'শ্যালোপি' স্মৃতিতে একই জায়গায় 'উত্স' হিসাবে দেখায়। 'ডিপকপি' স্মৃতিতে পৃথক অবস্থানের দিকে নির্দেশ করে তবে বিষয়বস্তু একই are
অগভীর ক্লোনিং:
সংজ্ঞা: "কোনও বস্তুর অগভীর অনুলিপি 'মূল' অবজেক্টটি অনুলিপি করে, তবে অভ্যন্তরীণ বস্তুগুলি অনুলিপি করে না।" যখন কোনও কাস্টম অবজেক্ট (যেমন। কর্মচারী) এর সবেমাত্র আদিম, স্ট্রিং টাইপের ভেরিয়েবল থাকে তখন আপনি শ্যালো ক্লোনিং ব্যবহার করেন।
Employee e = new Employee(2, "john cena");
Employee e2=e.clone();
আপনি super.clone();
ওভাররাইড ক্লোন () পদ্ধতিতে ফিরে আসেন এবং আপনার কাজ শেষ।
ডিপ ক্লোনিং :
সংজ্ঞা: "অগভীর অনুলিপিটির বিপরীতে একটি গভীর অনুলিপি কোনও বস্তুর সম্পূর্ণ স্বতন্ত্র অনুলিপি।"
অর্থ যখন কোনও কর্মচারী বস্তু অন্য কাস্টম অবজেক্ট ধারণ করে:
Employee e = new Employee(2, "john cena", new Address(12, "West Newbury", "Massachusetts");
তারপরে আপনাকে ওভাররাইড হওয়া ক্লোন () পদ্ধতিতে 'ঠিকানা' অবজেক্টটি ক্লোন করতে কোড লিখতে হবে। অন্যথায় ঠিকানা অবজেক্টটি ক্লোন করবে না এবং আপনি ক্লোনকৃত কর্মচারী বস্তুতে ঠিকানার মান পরিবর্তন করলে এটি বাগের কারণ হয়ে দাঁড়ায়, যা মূলটিকেও প্রতিফলিত করে।
var source = { firstName="Jane", lastname="Jones" };
var shallow = ShallowCopyOf(source);
var deep = DeepCopyOf(source);
source.lastName = "Smith";
WriteLine(source.lastName); // prints Smith
WriteLine(shallow.lastName); // prints Smith
WriteLine(deep.lastName); // prints Jones
গভীর কপি
একটি গভীর অনুলিপি সমস্ত ক্ষেত্রের অনুলিপি করে এবং ক্ষেত্রগুলি দ্বারা নির্দেশিত গতিশীলভাবে মেমরির অনুলিপি তৈরি করে। একটি গভীর অনুলিপি ঘটে যখন কোনও বস্তু যার সাথে এটি উল্লেখ করা হয় তার সাথে অনুলিপি করা হয়।
অগভীর কপি
অগভীর অনুলিপি কোনও বস্তুর বিট বুদ্ধিযুক্ত অনুলিপি। একটি নতুন অবজেক্ট তৈরি করা হয়েছে যার মূল অবজেক্টের মানগুলির একটি অনুলিপি রয়েছে। যদি অবজেক্টের কোনও ক্ষেত্র অন্য অবজেক্টের রেফারেন্স হয় তবে কেবলমাত্র রেফারেন্স ঠিকানাগুলি অনুলিপি করা হয়, কেবলমাত্র মেমরির ঠিকানাটি অনুলিপি করা হয়।
অগভীর অনুলিপি - মূল এবং অগভীর-অনুলিপি করা অবজেক্টের অভ্যন্তরে রেফারেন্স ভেরিয়েবলের মধ্যে সাধারণ বস্তুর রেফারেন্স থাকে।
গভীর অনুলিপি - মূল এবং গভীর-অনুলিপি করা বস্তুর অভ্যন্তরে রেফারেন্স ভেরিয়েবলের বিভিন্ন অবজেক্টের রেফারেন্স থাকে।
ক্লোন সর্বদা অগভীর অনুলিপি করে।
public class Language implements Cloneable{
String name;
public Language(String name){
this.name=name;
}
public String getName() {
return name;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
প্রধান শ্রেণি অনুসরণ করা হয়-
public static void main(String args[]) throws ClassNotFoundException, CloneNotSupportedException{
ArrayList<Language> list=new ArrayList<Language>();
list.add(new Language("C"));
list.add(new Language("JAVA"));
ArrayList<Language> shallow=(ArrayList<Language>) list.clone();
//We used here clone since this always shallow copied.
System.out.println(list==shallow);
for(int i=0;i<list.size();i++)
System.out.println(list.get(i)==shallow.get(i));//true
ArrayList<Language> deep=new ArrayList<Language>();
for(Language language:list){
deep.add((Language) language.clone());
}
System.out.println(list==deep);
for(int i=0;i<list.size();i++)
System.out.println(list.get(i)==deep.get(i));//false
}
উপরের আউটপুট হবে-
মিথ্যা সত্য সত্য
মিথ্যা মিথ্যা মিথ্যা
অরিজিনাল অবজেক্টে করা যে কোনও পরিবর্তন গভীর অবজেক্টে নয় অগভীর বস্তুতে প্রতিফলিত হবে।
list.get(0).name="ViSuaLBaSiC";
System.out.println(shallow.get(0).getName()+" "+deep.get(0).getName());
আউটপুট- ViSuaLBaSiC সি
আমি আনুষ্ঠানিক সংজ্ঞা চেয়ে উদাহরণ দিতে চাই।
var originalObject = {
a : 1,
b : 2,
c : 3,
};
এই কোডটি অগভীর অনুলিপিটি দেখায় :
var copyObject1 = originalObject;
console.log(copyObject1.a); // it will print 1
console.log(originalObject.a); // it will also print 1
copyObject1.a = 4;
console.log(copyObject1.a); //now it will print 4
console.log(originalObject.a); // now it will also print 4
var copyObject2 = Object.assign({}, originalObject);
console.log(copyObject2.a); // it will print 1
console.log(originalObject.a); // it will also print 1
copyObject2.a = 4;
console.log(copyObject2.a); // now it will print 4
console.log(originalObject.a); // now it will print 1
এই কোডটি একটি গভীর অনুলিপি দেখায় :
var copyObject2 = Object.assign({}, originalObject);
console.log(copyObject2.a); // it will print 1
console.log(originalObject.a); // it will also print 1
copyObject2.a = 4;
console.log(copyObject2.a); // now it will print 4
console.log(originalObject.a); // !! now it will print 1 !!
1 1 4 4 4 4 4 4
সাধারণ শর্তে, একটি শ্যালো অনুলিপি কল বাই রেফারেন্সের অনুরূপ এবং একটি ডিপ কপি কল বাই মানের সাথে সমান
কল বাই রেফারেন্সে, কোনও ফাংশনের আনুষ্ঠানিক এবং আসল পরামিতি উভয়ই একই মেমরির অবস্থান এবং মানকে বোঝায়।
কল বাই ভ্যালুতে, কোনও ফাংশনের আনুষ্ঠানিক এবং আসল প্যারামিটার উভয়ই বিভিন্ন মেমরি অবস্থানকে বোঝায় তবে একই মান থাকা।
একটি অগভীর অনুলিপি একটি নতুন যৌগিক বস্তু তৈরি করে এবং এর মধ্যে এটির রেফারেন্সগুলি মূল অবজেক্টে sertোকায়।
অগভীর অনুলিপিটির বিপরীতে ডিপকপি নতুন যৌগিক অবজেক্ট তৈরি করে এবং মূল যৌগিক বস্তুর মূল কপিরাইটগুলি সন্নিবেশ করায়।
একটি উদাহরণ নিতে দিন।
import copy
x =[1,[2]]
y=copy.copy(x)
z= copy.deepcopy(x)
print(y is z)
উপরের কোডগুলি FALSE মুদ্রণ করে।
দেখা যাক কিভাবে।
মূল যৌগিক অবজেক্ট x=[1,[2]]
(যৌগ হিসাবে ডাকা হয় কারণ এটিতে বস্তুর অভ্যন্তরে অবজেক্ট থাকে (ইনসেপশন))
আপনি ছবিতে দেখতে পাচ্ছেন, তালিকার ভিতরে একটি তালিকা রয়েছে।
তারপরে আমরা এটি ব্যবহার করে একটি অগভীর অনুলিপি তৈরি করি y = copy.copy(x)
। পাইথন এখানে যা করে তা হ'ল এটি একটি নতুন যৌগিক বস্তু তৈরি করবে তবে তাদের ভিতরে থাকা বস্তুগুলি অরিজেনাল অবজেক্টগুলিকে নির্দেশ করছে।
চিত্রটিতে এটি বাহ্যিক তালিকার জন্য একটি নতুন অনুলিপি তৈরি করেছে। তবে অভ্যন্তরীণ তালিকাটি মূল তালিকার মতোই রয়েছে।
এখন আমরা এটি ব্যবহার করে এর ডিপকপি তৈরি করি z = copy.deepcopy(x)
। পাইথন এখানে যা করে তা হ'ল এটি বাইরের তালিকার পাশাপাশি অভ্যন্তরের তালিকার জন্য নতুন বস্তু তৈরি করবে। নীচের ছবিতে প্রদর্শিত (লাল হাইলাইটেড)
শেষে কোড প্রিন্টগুলি False
, যেহেতু y এবং z একই জিনিস নয়।
আছে HTH।
অগভীর অনুলিপি একটি নতুন অবজেক্ট তৈরি করছে এবং তারপরে বর্তমান বস্তুর অ স্থিতিশীল ক্ষেত্রগুলি নতুন অবজেক্টে অনুলিপি করছে। যদি কোনও ক্ষেত্রের মান প্রকার হয় -> ক্ষেত্রের একটি বিট-বিট কপি সম্পাদন করা হয়; একটি রেফারেন্স টাইপের জন্য -> রেফারেন্সটি অনুলিপি করা হয়েছে তবে রেফারেন্স করা বস্তুটি নয়; সুতরাং আসল বস্তু এবং এর ক্লোন একই পদার্থকে বোঝায়।
ডিপ অনুলিপি একটি নতুন অবজেক্ট তৈরি করছে এবং তারপরে বর্তমান বস্তুর ননস্ট্যাটিক ক্ষেত্রগুলি নতুন অবজেক্টে অনুলিপি করছে। যদি কোনও ক্ষেত্রের মান প্রকার হয় -> ক্ষেত্রের একটি বিট-বিট কপি সঞ্চালিত হয়। যদি ক্ষেত্রটি কোনও রেফারেন্স টাইপ হয় -> রেফারেন্স করা অবজেক্টের একটি নতুন কপি করা হয়। ক্লোন করা ক্লাসগুলি অবশ্যই [সিরিয়ালাইজযোগ্য] হিসাবে পতাকাঙ্কিত করতে হবে।
[ব্লগ] থেকে নেওয়া: http://sickprogrammersarea.blogspot.in/2014/03/technical-interview-questions-on-c_6.html
ডিপ অনুলিপিতে একই শ্রেণীর অন্য উদাহরণ তৈরি করতে একটি বস্তুর বিষয়বস্তু ব্যবহার করে জড়িত। একটি গভীর অনুলিপিতে, দুটি বস্তুতে এইচটি তথ্য একই তথ্য থাকতে পারে তবে লক্ষ্য বস্তুর নিজস্ব বাফার এবং সংস্থান থাকবে। উভয় বস্তুর ধ্বংসটি বাকী বস্তুকে প্রভাবিত করবে না। অতিরিক্ত লোড অ্যাসাইনমেন্ট অপারেটর অবজেক্টগুলির একটি গভীর অনুলিপি তৈরি করবে।
অগভীর অনুলিপিতে একটি বস্তুর বিষয়বস্তু একই শ্রেণীর অন্য একটি দৃষ্টান্তে অনুলিপি করা যাতে মিরর ইমেজ তৈরি হয়। রেফারেন্স এবং পয়েন্টারগুলির সরাসরি অনুলিপি করার কারণে, দুটি অবজেক্ট অপ্রত্যাশিত হওয়ার জন্য অন্য অবজেক্টের একই বাহ্যিকভাবে থাকা সামগ্রীগুলি ভাগ করবে will
ব্যাখ্যা:
একটি অনুলিপি নির্মাণকারী ব্যবহার করে আমরা কেবল সদস্য দ্বারা ডেটা মানগুলির সদস্যকে অনুলিপি করি। অনুলিপি করার এই পদ্ধতিটিকে অগভীর অনুলিপি বলা হয়। যদি অবজেক্টটি একটি সাধারণ শ্রেণি হয় তবে এতে অন্তর্নির্মিত এবং কোনও পয়েন্টার সমন্বিত থাকে তবে এটি গ্রহণযোগ্য হবে। এই ফাংশনটি মানগুলি এবং অবজেক্টগুলিকে ব্যবহার করবে এবং এর আচরণটি অগভীর অনুলিপি দ্বারা পরিবর্তিত হবে না, কেবলমাত্র পয়েন্টারগুলির সদস্য যেগুলি সদস্য রয়েছে সেগুলি অনুলিপি করা হয়েছে এবং ঠিকানাটি দেখানো মানটি নয়। এরপরে অবজেক্টের ডেটা মানগুলি অজান্তে ফাংশন দ্বারা পরিবর্তিত হবে। যখন ফাংশন সুযোগের বাইরে চলে যায়, তখন তার সমস্ত ডেটা সহ অবজেক্টের অনুলিপিটি স্ট্যাকের বাইরে পপ হয়।
যদি অবজেক্টটির কোনও পয়েন্টার থাকে তবে একটি গভীর অনুলিপি কার্যকর করা দরকার। কোনও অবজেক্টের গভীর অনুলিপি সহ ফ্রি স্টোরে অবজেক্টের জন্য মেমরি বরাদ্দ করা হয় এবং নির্দেশিত উপাদানগুলি অনুলিপি করা হয়। একটি ফাংশন থেকে ফিরে আসা বস্তুর জন্য একটি গভীর অনুলিপি ব্যবহার করা হয়।
অন্যান্য উত্তরে আরও যুক্ত করতে,
অগভীর অনুলিপি নতুন রেফারেন্স তৈরি করবে না তবে গভীর অনুলিপি নতুন রেফারেন্স তৈরি করবে।
এখানে গভীর এবং অগভীর অনুলিপিটি ব্যাখ্যা করার জন্য প্রোগ্রামটি দেওয়া হচ্ছে।
public class DeepAndShollowCopy {
int id;
String name;
List<String> testlist = new ArrayList<>();
/*
// To performing Shallow Copy
// Note: Here we are not creating any references.
public DeepAndShollowCopy(int id, String name, List<String>testlist)
{
System.out.println("Shallow Copy for Object initialization");
this.id = id;
this.name = name;
this.testlist = testlist;
}
*/
// To performing Deep Copy
// Note: Here we are creating one references( Al arraylist object ).
public DeepAndShollowCopy(int id, String name, List<String> testlist) {
System.out.println("Deep Copy for Object initialization");
this.id = id;
this.name = name;
String item;
List<String> Al = new ArrayList<>();
Iterator<String> itr = testlist.iterator();
while (itr.hasNext()) {
item = itr.next();
Al.add(item);
}
this.testlist = Al;
}
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Oracle");
list.add("C++");
DeepAndShollowCopy copy=new DeepAndShollowCopy(10,"Testing", list);
System.out.println(copy.toString());
}
@Override
public String toString() {
return "DeepAndShollowCopy [id=" + id + ", name=" + name + ", testlist=" + testlist + "]";
}
}
আর্যগুলি অনুলিপি করা হচ্ছে:
অ্যারে একটি শ্রেণি, যার অর্থ এটি রেফারেন্স টাইপ হয় তাই অ্যারে 1 = অ্যারে 2 ফলাফল দুটি ভেরিয়েবলের ক্ষেত্রে একই অ্যারে রেফারেন্স করে।
তবে এই উদাহরণটি দেখুন:
static void Main()
{
int[] arr1 = new int[] { 1, 2, 3, 4, 5 };
int[] arr2 = new int[] { 6, 7, 8, 9, 0 };
Console.WriteLine(arr1[2] + " " + arr2[2]);
arr2 = arr1;
Console.WriteLine(arr1[2] + " " + arr2[2]);
arr2 = (int[])arr1.Clone();
arr1[2] = 12;
Console.WriteLine(arr1[2] + " " + arr2[2]);
}
অগভীর ক্লোনটির অর্থ ক্লোনযুক্ত অ্যারে দ্বারা প্রতিনিধিত্ব করা কেবল মেমরির অনুলিপি করা হয়।
অ্যারেতে যদি মান ধরণের অবজেক্ট থাকে তবে মানগুলি অনুলিপি করা হয় ;
অ্যারেটিতে যদি রেফারেন্সের ধরণ থাকে তবে কেবলমাত্র রেফারেন্সগুলি অনুলিপি করা হয় - ফলস্বরূপ দুটি অ্যারে রয়েছে যার সদস্যরা একই বস্তুটিকে রেফারেন্স করে ।
একটি গভীর অনুলিপি তৈরি করতে - যেখানে রেফারেন্সের ধরণটি নকল করা আছে, আপনাকে অবশ্যই অ্যারের মধ্য দিয়ে লুপ করতে হবে এবং প্রতিটি উপাদানটিকে ম্যানুয়ালি ক্লোন করতে হবে।
private void button1_Click(object sender, EventArgs e) { int[] arr1 = new int[]{1,2,3,4,5}; int[] arr2 = new int[]{6,7,8,9,0}; MessageBox.Show(arr1[2] + " " + arr2[2]); arr2 = arr1; MessageBox.Show(arr1[2] + " " + arr2[2]); arr1[2] = 12; MessageBox.Show(arr1[2] + " " + arr2[2]); }
আমি নিম্নলিখিত লাইন থেকে বুঝতে পেরেছি।
অগভীর অনুলিপি অবজেক্টের লক্ষ্যবস্তু করার জন্য কোনও অবজেক্ট মানের ধরণের (ইন্টি, ফ্লোট, বুল) ক্ষেত্রগুলি অনুলিপি করে এবং অবজেক্টের রেফারেন্স প্রকারগুলি (স্ট্রিং, বর্গ ইত্যাদি) টার্গেট অবজেক্টে রেফারেন্স হিসাবে অনুলিপি করা হয় । এই টার্গেটে রেফারেন্সের প্রকারগুলি উত্স অবজেক্টের মেমরির অবস্থানটির দিকে নির্দেশ করবে।
গভীর অনুলিপি কোনও অবজেক্টের মান এবং রেফারেন্সের ধরণের লক্ষ্যবস্তুগুলির সম্পূর্ণ নতুন অনুলিপিতে অনুলিপি করে। এর অর্থ মান প্রকার এবং রেফারেন্স উভয়ই একটি নতুন মেমরি অবস্থান বরাদ্দ করা হবে।
উপরের সমস্ত সংজ্ঞায় যুক্ত করা, আরও একটি এবং সর্বাধিক ব্যবহৃত গভীর অনুলিপি, ক্লাসের অনুলিপি কন্সট্রাক্টর (বা ওভারলোডিং অ্যাসাইনমেন্ট অপারেটর) এ।
অগভীর অনুলিপি -> হল যখন আপনি অনুলিপি নির্মাণকারী সরবরাহ করছেন না। এখানে কেবলমাত্র বস্তু অনুলিপি করা হয় তবে শ্রেণির সমস্ত সদস্য অনুলিপি করেন না।
গভীর অনুলিপি -> হ'ল আপনি যখন নিজের ক্লাসে অনুলিপি নির্মাণকারী বা ওভারলোড অ্যাসাইনমেন্টটি প্রয়োগ করার সিদ্ধান্ত নিয়েছেন এবং ক্লাসের সমস্ত সদস্যদের অনুলিপি করার অনুমতি দেন।
MyClass& MyClass(const MyClass& obj) // copy constructor for MyClass
{
// write your code, to copy all the members and return the new object
}
MyClass& operator=(const MyClass& obj) // overloading assignment operator,
{
// write your code, to copy all the members and return the new object
}
অনুলিপি নির্মাণকারী একই বর্গের পূর্বে নির্মিত বস্তুর সাথে নতুন অবজেক্টটি আরম্ভ করার জন্য ব্যবহৃত হয়। ডিফল্ট সংকলক একটি অগভীর অনুলিপি লিখেছিলেন। গতিশীল মেমরি বরাদ্দ জড়িত না হলে অগভীর অনুলিপি সূক্ষ্মভাবে কাজ করে কারণ যখন গতিশীল মেমরি বরাদ্দ জড়িত থাকে তখন উভয় বস্তু একটি স্তূপে একই মেমরি অবস্থানের দিকে নির্দেশ করবে, সুতরাং এই সমস্যাটি সরাতে আমরা গভীর অনুলিপিটি লিখেছি যাতে উভয় বস্তুর নিজস্ব বৈশিষ্ট্যগুলির অনুলিপি থাকে একটি স্মৃতিতে। সম্পূর্ণ উদাহরণ এবং ব্যাখ্যা সহ বিশদটি পড়তে আপনি নিবন্ধটি দেখতে পারবেন C ++ নির্মাণকারী ।