C++ موو کنسٹرکٹر

C Mww Kns Rk R



C++ پروگرامنگ بہترین زبان ہے کیونکہ یہ ہمیں فنکشنز، کنسٹرکٹرز، ہیڈر فائلز، کلاسز اور بہت کچھ کے ساتھ سہولت فراہم کرتی ہے، جس سے کوڈنگ مزید دلچسپ اور آسان ہوتی ہے۔ C++ پروگرامنگ میں کنسٹرکٹرز میں سے ایک 'move' کنسٹرکٹر ہے۔ 'موو' کنسٹرکٹر ایک منفرد قسم کا کنسٹرکٹر ہے جو متحرک طور پر مختص میموری یا دیگر وسائل کی ملکیت کو ایک موثر اور وسائل کے لحاظ سے ایک شے سے دوسری چیز میں منتقل کرنے کی اجازت دیتا ہے۔

C++ پروگرامنگ میں، نقل کو کم کرنے اور کارکردگی کو بڑھانے کے لیے 'موو' کنسٹرکٹرز متعارف کرائے گئے تھے۔ یہ کاپی کرنے کے عمل کو کم سے کم کرکے کارکردگی کو بہتر بنانے میں اہم کردار ادا کرتا ہے۔ یہ گائیڈ C++ پروگرامنگ میں 'حرکت' کنسٹرکٹر کے بارے میں گہرائی سے دریافت کرتا ہے۔







مثال 1:

کوڈ کو یہاں شروع کرنے کے لیے، ہم 'iostream' اور 'string' ہیڈر فائلیں شامل کرتے ہیں جو ہمارے کوڈ کو مکمل طور پر چلائے گی کیونکہ ان ہیڈر فائلز میں بہت سے فنکشنز کا اعلان کیا جاتا ہے۔ جب ہمیں 'cout' اسٹیٹمنٹ کو استعمال کرنا ہوتا ہے تو 'iostream' ہیڈر فائل کو استعمال کیا جاتا ہے کیونکہ اس فنکشن کو اس کے اندر ظاہر کیا جاتا ہے۔ جب ہمیں سٹرنگ ٹائپ ڈیٹا کے ساتھ کام کرنا ہو تو 'سٹرنگ' ہیڈر فائل ضروری ہے۔



اس کے بعد، ان ہیڈر فائلوں کے نیچے 'نیم اسپیس std' شامل کیا جاتا ہے۔ پھر، ہم یہاں ایک کلاس بناتے ہیں۔ کلاس کا نام 'منتقل' ہے۔ اس کے نیچے، 'پرائیویٹ' کلیدی لفظ شامل کیا گیا ہے جس میں ہم 'my_str' نام کے ساتھ ایک نجی سٹرنگ متغیر کا اعلان کرتے ہیں۔ اب، ہم 'عوامی' کلیدی لفظ رکھتے ہیں جہاں ہم ڈیفالٹ کنسٹرکٹر کی تعریف شامل کرتے ہیں۔ ہم 'یہ یہاں ڈیفالٹ سٹرنگ ہے' کو 'my_str' کو بطور پیرامیٹر منتقل کرتے ہیں اور ڈیفالٹ کنسٹرکٹر کو خالی چھوڑ دیتے ہیں۔



اس کے بعد، ہم کنسٹرکٹر کی تعریف کاپی کرتے ہیں اور 'my_str' کو 'my_obj.my_str' سے شروع کرتے ہیں۔ اس کے نیچے، ہم ایک لائن پرنٹ کرتے ہیں اور پھر 'حرکت' کنسٹرکٹر کی تعریف رکھتے ہیں۔ یہاں، ہم 'my_str' کو 'my_obj.my_str' کے ساتھ دوبارہ شروع کرتے ہیں۔ ہم اس کے نیچے کوئی بیان شامل نہیں کرتے ہیں۔ یہ خالی ہے. اس کے بعد، ہم اسٹرنگ کی قسم کے 'displayMyObject()' نامی فنکشن کا اعلان کرتے ہیں اور 'return str' کا استعمال کرتے ہیں تاکہ یہ سٹرنگ واپس آجائے۔





ہم عالمی 'new_temp' فنکشن کو 'move' قسم میں رکھتے ہیں۔ اس کے نیچے، ہمارے پاس 'return temp' ہے جو موو ٹائپ آبجیکٹ کو لوٹاتا ہے۔ اب، ہم 'main()' ڈرائیور کوڈ اور 'move' قسم کا 'new_obj1' رکھتے ہیں اور 'rvalue' سے 'move' کنسٹرکٹر حاصل کرتے ہیں۔ آگے کی لائن میں، ہم 'new_obj1.displayMyObject()' کو 'lvalue' سے 'move' کنسٹرکٹر حاصل کرنے کے لیے رکھتے ہیں۔ اس کے بعد، ہم 'move' کنسٹرکٹر کو 'my_obj1' آبجیکٹ کے ساتھ کہتے ہیں۔ پھر، ہم 'my_obj1' کی ملکیت دوسرے آبجیکٹ کو منتقل کرتے ہیں جو کہ 'my_obj2' ہے۔

کوڈ 1:

# شامل کریں

#include

استعمال کرتے ہوئے نام کی جگہ std ;

کلاس اقدام

{

نجی :
string my_str ;
عوام :
اقدام ( ) : my_str ( 'یہ یہاں ڈیفالٹ سٹرنگ ہے' )
{
}
اقدام ( const اقدام اور my_obj ) : my_str ( my_obj my_str )
{


cout << 'کاپی کنسٹرکٹر کو طلب کیا گیا، اقدام ناکام ہوگیا! \n ' ;

}
اقدام ( اقدام && my_obj ) : my_str ( اقدام ( my_obj my_str ) )
{
}
string displayMyObject ( )
{
واپسی my_str ;
}
} ;
نیا_ٹیمپ منتقل کریں۔ ( tmp منتقل کریں۔ )
{
واپسی tmp ;
}
int مرکزی ( )
{
new_obj1 کو منتقل کریں۔ = new_temp ( اقدام ( ) ) ;


cout << 'منتقل () کال کرنے سے پہلے : new_obj1 = ' << new_obj1. ڈسپلے مائی آبجیکٹ ( ) << endl ;

new_obj2 کو منتقل کریں۔ = اقدام ( new_obj1 ) ;

cout << 'move() کنسٹرکٹر کال کے بعد: new_obj1 =' << new_obj1. ڈسپلے مائی آبجیکٹ ( ) << endl ;

cout << 'move() کنسٹرکٹر کال کے بعد: new_obj2 =' << new_obj2. ڈسپلے مائی آبجیکٹ ( ) << endl ;

واپسی 0 ;

}

آؤٹ پٹ:

آؤٹ پٹ رینڈر کرتا ہے کہ 'move()' طریقہ کو کال کرنے سے پہلے، 'new_obj1' ڈیفالٹ سٹرنگ پر مشتمل ہوتا ہے۔ لیکن 'Move' کلاس موو() طریقہ کو کال کرنے کے بعد، 'my_obj1' میں ایک خالی سٹرنگ ہے اور 'my_obj2' میں ڈیفالٹ سٹرنگ ہے۔



مثال 2:

یہاں، ہم ایک اور ہیڈر فائل شامل کرتے ہیں جو کہ 'ویکٹر' ہیڈر فائل ہے۔ ہم اسے شامل کرتے ہیں جب بھی ہمیں ویکٹرز پر کارروائیوں میں ہیرا پھیری کرنی ہوتی ہے۔ ہم یہاں جو کلاس بناتے ہیں وہ 'Move' کلاس ہے۔ ہم یہاں ایک 'پبلک' کنسٹرکٹر بھی بناتے ہیں جس میں ہم 'int* ویلیو' را پوائنٹر کو کلاس ممبر کا ڈیٹا قرار دیتے ہیں۔ اس کے نیچے، ہمارے پاس 'پبلک' ہے جس میں ہم 'Move' کنسٹرکٹر رکھتے ہیں اور 'int v1' کو اس کے پیرامیٹر کے طور پر پاس کرتے ہیں۔

اس کے بعد، ہم اشیاء کو ایک ڈھیر میں قرار دیتے ہیں۔ ہم 'ویلیو' کو 'نئے انٹ' کے ساتھ اور '* ویلیو' کو 'v1' کے ساتھ شروع کرتے ہیں۔ اس کے بعد، 'cout' کو رکھیں جہاں ہم ایک لائن شامل کرتے ہیں جو کوڈ پر عمل کرنے پر پرنٹ کرتی ہے۔ اس کے نیچے، ہم 'کاپی' کنسٹرکٹر کا استعمال کرتے ہیں۔ یہ 'کاپی' کنسٹرکٹر گہری کاپی بنا کر ڈیٹا کو کاپی کرتا ہے۔ ہم 'Move' کنسٹرکٹر کو رکھتے ہیں اور 'Move&& new_source' کو اس کے پیرامیٹر کے طور پر پاس کرتے ہیں۔ اس کے نیچے، ہم 'cout' رکھتے ہیں جو مطلوبہ بیان کو ظاہر کرنے میں مدد کرتا ہے۔

ہم یہ تعین کرنے کے لیے 'nullptr' کلیدی لفظ داخل کرتے ہیں کہ آیا حوالہ کے استعمال سے پہلے کوئی پوائنٹر خالی ہے یا نہیں۔ اب، ہم '~Move()' ڈسٹرکٹر بھی رکھتے ہیں جس میں ہم 'if' شرط لگاتے ہیں جو اس بات کی تصدیق کرتا ہے کہ آیا 'ویلیو' 'nullptr' کے برابر نہیں ہے۔ جب اس شرط کی تصدیق ہو جاتی ہے، تو اس کے نیچے بیان پر عمل ہوتا ہے۔ اگر یہ شرط تصدیق شدہ نہیں ہے تو، یہ 'cout' بیان کو چھوڑ دیتا ہے جو 'if' شرط کے بعد موجود ہے اور 'دوسرے' حصے کی طرف بڑھ جاتا ہے۔

اس کے بعد، ہم 'ڈیلیٹ' کلیدی لفظ کا استعمال کرتے ہیں جو کسی چیز کو ڈیلوکیٹ کرنے میں مدد کرتا ہے یا ہم کہہ سکتے ہیں کہ یہ اس میموری کو جاری کرتا ہے جو آبجیکٹ کے ڈیٹا کے جزو کے لیے مختص کی گئی ہے۔ اب، ہم یہاں 'main()' طریقہ استعمال کرتے ہیں اور 'my_vec' نام کے ساتھ اپنی 'Move' کلاس کا ویکٹر بناتے ہیں۔ اس کے بعد، ہم 'push_back()' فنکشن کا استعمال کرتے ہیں جو ویکٹر کے اختتامی نقطہ پر قدر داخل کرنے میں مدد کرتا ہے۔ 'ویکٹر' ہیڈر فائل میں یہ فنکشن ہوتا ہے۔ سب سے پہلے، ہم ویکٹر میں '39' داخل کرتے ہیں۔ پھر، '57' ڈالا جاتا ہے اور 'push_back()' طریقہ استعمال کرکے '91' بھی ڈالا جاتا ہے۔

کوڈ 2:

# شامل کریں

#شامل <ویکٹر>

استعمال کرتے ہوئے نام کی جگہ std ;

کلاس اقدام {

نجی :
int * قدر ;
عوام :
اقدام ( int v1 )
{
قدر = نئی int ;
* قدر = v1 ;

cout << 'کنسٹرکٹر کو بلایا جاتا ہے'

<< v1 << endl ;

} ;
اقدام ( const اقدام اور نیا_ذریعہ )
: اقدام { * نیا_ذریعہ قدر }
{


cout << 'کاپی کنسٹرکٹر کو کہا جاتا ہے -'

<< 'کے لیے گہری کاپی'

<< * نیا_ذریعہ قدر

<< endl ;

}
اقدام ( اقدام && نیا_ذریعہ )
: قدر { نیا_ذریعہ قدر }
{


cout << 'کنسٹرکٹر کو منتقل کریں'

<< * نیا_ذریعہ قدر << endl ;

نیا_ذریعہ قدر = nullptr ;

}
~ منتقل ( )
{
اگر ( قدر ! = nullptr )


cout << 'تباہ کرنے والے کو بلایا جاتا ہے'

<< * قدر << endl ;

اور

cout << 'تباہ کرنے والے کو کہتے ہیں'

<< 'nullptr کے لیے'

<< endl ;

حذف کریں قدر ;

}

} ;

int مرکزی ( )

{

ویکٹر < اقدام > میری چیز ;

میری چیز. پیچھے دھکیلا ( اقدام { 39 } ) ;
میری چیز. پیچھے دھکیلا ( اقدام { 57 } ) ;
میری چیز. پیچھے دھکیلا ( اقدام { 91 } ) ;
واپسی 0 ;


}

آؤٹ پٹ:

اس سے ظاہر ہوتا ہے کہ 'کاپی' فنکشن کو استعمال کرنے کے بجائے، ہمیں 'کاپی' فنکشن کو غیر ضروری کال کو روکنے کے لیے 'موو' فنکشن کا استعمال کرنا ہوگا۔ 'حرکت' کنسٹرکٹر کو یہاں استعمال کیا جاتا ہے جب ہم آبجیکٹ کو کسی عارضی چیز یا کسی ایسی چیز سے شروع کرتے ہیں جو تباہ ہوجائے گی۔ دیے گئے ڈیٹا کی گہری کاپی میں ہیرا پھیری کرنے کے بجائے، 'منتقل' کنسٹرکٹر وسائل کی ملکیت کو ایک آبجیکٹ سے دوسری چیز میں منتقل کرتا ہے۔

نتیجہ

اس گائیڈ میں، ہم نے 'حرکت' کنسٹرکٹر کے بارے میں دریافت کیا۔ ہم نے وضاحت کی کہ C++ پروگرامنگ میں 'منتقل' کنسٹرکٹر کسی چیز کے وسائل کو مؤثر طریقے سے دوسری چیز میں منتقل کرنے کا ایک منفرد طریقہ ہے۔ ہم نے اس بات پر تبادلہ خیال کیا کہ 'موو' کنسٹرکٹر کو کال کرنے میں کم اوور ہیڈ ہوتا ہے، جس سے کوڈ زیادہ میموری کو موثر بناتا ہے۔ ہم نے اس حقیقت کو دریافت کیا کہ C++ پروگرامنگ میں 'move' کنسٹرکٹر ایک طاقتور خصوصیت ہے۔ ہم نے 'موو' کنسٹرکٹر کے تصور کو واضح کرنے کے لیے عملی مثالوں کا بھی استعمال کیا اور C++ پروگرامنگ میں 'موو' کنسٹرکٹر کو استعمال کرنے کے کارکردگی کے فوائد کا مظاہرہ کیا۔