زنگ

کسانی هستند که این خبر را قبل از شما می خوانند.
برای دریافت آخرین مقالات مشترک شوید.
پست الکترونیک
نام
نام خانوادگی
چگونه می خواهید The Bell را بخوانید
بدون اسپم

اعضای کلاس را می توان با کلمه کلیدی استاتیک استفاده کرد. در این زمینه ، معنای آن شبیه به C است. وقتی یک عضو کلاس استاتیک اعلام شد ، به کامپایلر دستور می دهد که فقط یک نسخه از آن عضو وجود داشته باشد ، مهم نیست که چه تعداد از اشیاء آن کلاس ایجاد می شود. یک عضو ثابت توسط همه اشیاء این کلاس به اشتراک گذاشته می شود. با ایجاد اولین شیء ، تمام داده های استاتیک به صفر می رسند و هیچ اولیه سازی دیگری ارائه نمی شود.

وقتی عضو داده های یک کلاس را اعلام می کنید ، آن عضو تعریف نشده است. درعوض ، شما باید آنها را در سطح جهانی در خارج از کلاس تأمین کنید. این کار با اعلام مجدد یک متغیر استاتیک ، با استفاده از عملگر دامنه برای شناسایی طبقه ای که به آن متغیر تعلق دارد ، انجام می شود. این امر به منظور اختصاص حافظه برای متغیر استاتیک ضروری است.

برنامه زیر را به عنوان نمونه در نظر بگیرید:

#عبارتند از
شمارنده کلاس (
شمارش int استاتیک؛
عمومی:
void setcount (int i) (count \u003d i؛)؛
نمایش خالی نمایش () (cout<< count << " "; }
};
int counter :: count؛ // تعریف شمارش
int main () (
پیشخوان a، b؛
a.showcount ()؛ // نمایش 0
b.showcount ()؛ // نمایش 0
a.setcount (10)؛ // تعداد استاتیک را روی 10 تنظیم کنید
a.showcount ()؛ // چاپ 10
b.showcount ()؛ // همچنین 10 را چاپ می کند
بازگشت 0؛
}

اول از همه ، به این واقعیت توجه می کنیم که یک متغیر استاتیک از تعداد نوع عدد صحیح در دو مکان اعلام می شود: در کلاس پیشخوان و سپس - به عنوان یک متغیر جهانی. Borland C ++ تعداد اولیه را به صفر رساند. به همین دلیل اولین تماس برای نمایش () صفر را چاپ می کند. سپس تعداد مجموعه ها را برابر با 10 قرار دهید. پس از آن ، هر دو مقدار a و b با استفاده از تابع showcount () مقدار برابر برابر 10 را با هم برابر می کنند. از آنجا که فقط یک نسخه از تعداد مشترک توسط اشیاء a و b وجود دارد ، در در هر دو حالت ، مقدار 10 است.

همچنین می توان از توابع عضو ثابت استفاده کرد. توابع عضو استاتیک نمی توانند به طور مستقیم داده های غیر استاتیک یا توابع غیر استاتیک اعلام شده در کلاس خود را ارجاع دهند. دلیل این امر این است که آنها این نشانگر را ندارند ، بنابراین هیچ راهی برای دانستن اینکه داده های غیر استاتیک با آنها کار کنند وجود ندارد. به عنوان مثال ، اگر شما دو شیء از کلاس دارید که دارای یک تابع استاتیک f () هستند ، و اگر f () در تلاش است به یک متغیر غیر استاتیک متغیر که توسط آن کلاس تعریف شده است دسترسی پیدا کنید ، چگونه می توانید از کدام نسخه از var استفاده کنید؟ کامپایلر نمی تواند چنین مشکلی را حل کند. این دلیلی است که توابع استاتیک فقط به سایر کارکردهای استاتیک یا دادههای استاتیک دسترسی دارند. همچنین ، توابع استاتیک را نمی توان مجازی یا با اصلاح کننده های ثابت یا متغیر اعلام کرد. یک تابع استاتیک را می توان با استفاده از یک شی کلاس یا با استفاده از نام کلاس و عملگر دامنه نامید. با این حال ، به خاطر داشته باشید که حتی هنگامی که شما با استفاده از یک شیء ، یک استاتیک را صدا می کنید ، این نشانگر به آن منتقل نمی شود.

برنامه کوتاه زیر یکی از کاربردهای بسیاری برای کارکردهای استاتیک را نشان می دهد. دسترسی به یک منبع محدود مانند یک پرونده مشترک در یک شبکه بسیار متداول است. همانطور که این برنامه نشان می دهد ، استفاده از داده ها و توابع استاتیک به عنوان روشی عمل می کند که از طریق آن یک شی می تواند وضعیت یک منبع را بررسی کرده و در صورت امکان ، به آن دسترسی پیدا کند.

#عبارتند از


دسترسی به کلاس (
static enum access_t acs؛
// ...
عمومی:


{
بازگشت acs؛
}
// ...
};

int main ()
{
دسترسی obj1 ، obj2؛
دسترسی :: set_access (قفل شده)؛ // تماس با استفاده از نام کلاس
// ... کد

if (obj2.get_access () \u003d\u003d باز شده) (// تماس با استفاده از یک شی

فحش دادن<< "Access resource.\n";
}
دیگر ممکن است<< "Locked out.\n";
// ...
بازگشت 0؛
}

با راه اندازی این برنامه ، "قفل شده" روی صفحه ظاهر می شود. توجه داشته باشید که تابع set_access () با نام کلاس و عملگر دامنه فراخوانی می شود. تابع get_access () با یک شیء و یک عملگر نقطه نامیده می شود. هر یک از این اشکال را می توان هنگام فراخوانی یک عملکرد استاتیک استفاده کرد و هر دو اثر یکسانی دارند. ارزش این را دارد که کمی با این برنامه آزمایش کنید تا مطمئن شوید که نحوه عملکرد صحیح آن را درک کرده اید.

همانطور که اشاره شد ، توابع استاتیک فقط به همان توابع استاتیک یا داده های ایستا در همان کلاس دسترسی مستقیم دارند. برای بررسی این مسئله ، سعی کنید نسخه زیر برنامه را کامپایل کنید:

// این برنامه حاوی خطایی است و کامپایل نمی شود
#عبارتند از
enum access_t (مشترک ، in_use ، قفل شده ، قفل).
// کلاس منابع کمیاب را کنترل می کند
دسترسی به کلاس (
static enum access_t acs؛
من // ایستا نیست
// ...
عمومی:
استاتیک void set_access (تعداد دسترسی_تها) (acs \u003d a؛)
دسترسی استاتیک enum access_t get_access ()
{
من \u003d 100؛ // کامپایل نمی شود
بازگشت acs؛
}
// ...
};
enum access_t access :: acs؛ // تعریف acs
int main ()
{
دسترسی obj1 ، obj2؛
دسترسی :: set_access (قفل شده)؛ // تماس با استفاده از نام کلاس
// ... کد
// می تواند obj2 به منبع دسترسی داشته باشد
if (obj2.get_access () \u003d\u003d باز شده) (// تماس با استفاده از یک شی
دسترسی :: set_access (in_use)؛ // تماس با استفاده از نام کلاس
فحش دادن<< "Access resource.\n";
}
دیگر ممکن است<< "Locked out.\n";
// ...
}

این برنامه کامپایل نمی شود زیرا تابع get_access () در تلاش است تا به یک متغیر غیر استاتیک دسترسی پیدا کند.

در ابتدا ، دیگر نیازی به استفاده فوری از اعضای استاتیک نیست ، اما با تجربه در زمینه برنامه نویسی C ++ ، آنها در موقعیت های خاص بسیار مفید می شوند ، زیرا به شما امکان می دهند از استفاده از متغیرهای جهانی خودداری کنید.

سپس می توانیم مستقیماً از طریق نام کلاس و اپراتور رزولوشن دامنه به آنها دسترسی پیدا کنیم. اما اگر متغیرهای عضو استاتیک خصوصی باشند چه؟ کد زیر را در نظر بگیرید:

در این حالت ، ما به طور مستقیم نمی توانیم به چیز اصلی :: s_value از اصلی () دسترسی پیدا کنیم ، زیرا این عضو خصوصی است. به طور معمول ، اعضای خصوصی یک کلاس از طریق روش های عمومی قابل دسترسی هستند. در حالی که ما می توانیم یک روش عادی برای دسترسی به s_value ایجاد کنیم ، باید برای استفاده از این روش یک شیء از آن کلاس ایجاد کنیم! گزینه بهتری وجود دارد: ما می توانیم این روش را استاتیک کنیم.

مانند متغیرهای عضو ثابت روش های استاتیک به هیچ یک از کلاس های کلاس گره خورده اند. در اینجا مثالی در بالا آورده شده است ، اما با یک روش ثابت:

کلاس هر چیزی (خصوصی: static int s_value؛ public: static int getValue () (Return s_value؛) // روش static)؛ int Anywhere :: s_value \u003d 3؛ // تعریف متغیر عضو کلاس استاتیک int main () (std :: cout<< Anything::getValue() << "\n"; }

از آنجا که روش های استاتیک به یک شی خاص محدود نمی شوند ، می توان آنها را مستقیماً از طریق نام کلاس و عملگر اندازه گیری دامنه و همچنین از طریق اشیاء کلاس فراخوانی کرد (اما این توصیه نمی شود).

روشهای استاتیک دارای این * اشاره گر نیستند

روش های استاتیک دو ویژگی جالب دارند. اول ، از آنجا که روش های استاتیک به یک جسم محدود نمی شوند ، چنین نمی کنند! در اینجا معنی دارد ، از آنجا که این * اشاره گر همیشه به جسمی که روش کار می کند اشاره می کند. روشهای استاتیک ممکن است از طریق یک شی کار نکنند ، بنابراین این اشاره گر نیز لازم نیست.

دوم ، روشهای استاتیک می توانند مستقیماً به سایر اعضای استاتیک (متغیرها یا توابع) دسترسی پیدا کنند ، اما آنها نمی توانند به اعضای غیراستاتیک دسترسی پیدا کنند. این امر به این دلیل است که اعضای غیر استاتیک متعلق به جسم کلاس هستند ، اما روش های استاتیک چنین نیست!

یک مثال دیگر

روشهای ایستا را می توان خارج از بدن کلاس تعریف کرد. این کار به همان روشهایی انجام می شود که با روش های معمولی انجام می شود. مثلا:

#عبارتند از کلاس IDGenerator (خصوصی: static int s_nextID؛ // اعلان یک متغیر عضو استاتیک عمومی: static int getNextID ()؛ // اعلام یک روش استاتیک)؛ // تعریف متغیر عضو ثابت در خارج از بدن کلاس است. توجه داشته باشید که ما از کلمه کلیدی استاتیک در اینجا استفاده نمی کنیم // تولید شناسه در 1 int IDGenerator :: s_nextID \u003d 1؛ // تعریف یک روش ایستا خارج از بدن کلاس است. توجه داشته باشید که ما از کلمه کلیدی استاتیک در اینجا استفاده نمی کنیم int IDGenerator :: getNextID () (Return s_nextID ++؛) int main () (برای (int count \u003d 0؛ count)< 4; ++count) std::cout << "The next ID is: " << IDGenerator::getNextID() << "\n"; return 0; }

#عبارتند از

کلاس IDGenerator

خصوصی:

static int s_nextID؛ // اعلام متغیر عضو استاتیک

عمومی:

static int getNextID ()؛ // اعلام روش استاتیک

// تولید شناسه را در 1 شروع کنید

int IDGenerator :: s_nextID \u003d 1؛

int IDGenerator :: getNextID () (Return s_nextID ++؛)

int main ()

برای (تعداد شمارش \u003d 0؛ شمارش< 4 ; ++ count )

std :: cout<< "The next ID is: " << IDGenerator :: getNextID () << "\n" ;

بازگشت 0؛

نتیجه اجرای برنامه فوق:

شناسه بعدی: 1
شناسه بعدی: 2
شناسه بعدی: 3
شناسه بعدی: 4

لطفا توجه داشته باشید ، از آنجا که تمام متغیرها و کارکردهای این کلاس استاتیک هستند ، برای کار با آن نیازی به ایجاد یک شیء از این کلاس نداریم! برای ذخیره مقدار شناسه بعدی که به آن اختصاص داده می شود از یک متغیر عضو استاتیک استفاده می شود و از یک روش ایستا برای بازگشت شناسه و افزایش آن استفاده می شود.

هشدار درباره کلاسها با تمام اعضای ثابت

هنگام نوشتن کلاس با تمام اعضای استاتیک مراقب باشید. در حالی که این "کلاسهای کاملا استاتیک" می توانند مفید باشند ، اما اشکالاتی نیز دارند.

اول ، از آنجا که تمام اعضای استاتیک فقط یک بار ایجاد می شوند ، نمی توان چندین نسخه از یک "کلاس کاملاً استاتیک" (بدون کلون کردن کلاس و تغییر نام بیشتر آن). به عنوان مثال ، اگر ما به دو شیء مستقل از کلاس IDGenerator احتیاج داریم ، از طریق کلاس "کاملاً استاتیک" این امکان پذیر نخواهد بود.

C ++ از سازنده های ساکن پشتیبانی نمی کند

اگر می توانید یک متغیر عضو معمولی را از طریق یک ساختار اولیه تنظیم کنید ، پس از نظر منطقی باید بتوانید متغیرهای عضو ثابت را از طریق یک سازنده ثابت تنظیم کنید. و در حالی که برخی از زبانهای مدرن به همین منظور از سازنده های ساکن پشتیبانی می کنند ، متأسفانه C ++ یکی از آنها نیست.

اگر متغیر استاتیک شما مستقیماً قابل تنظیم باشد ، پس هیچ سازنده ای لازم نیست: حتی اگر خصوصی باشد ، می توانید یک متغیر عضو استاتیک را تعریف کنید. ما این کار را در مثال بالا با s_nextID انجام می دهیم. یک مثال دیگر:

class Something (عمومی: static std :: وکتور s_mychars؛ )؛ std :: وکتور Something :: s_mychars \u003d ("o" ، "a" ، "u" ، "i" ، "e")؛ // متغیر عضو ثابت را تعریف کنید

کلاس چیزی

عمومی:

static std :: وکتور< char > s_mychars؛

std :: وکتور< char > Something :: s_mychars \u003d ("o" ، "a" ، "u" ، "i" ، "e")؛ // متغیر عضو ثابت را تعریف کنید

اگر شروع به کار متغیر عضو استاتیک شما نیاز به اجرای کد دارد (مانند یک حلقه) ، چندین روش مختلف برای این کار وجود دارد. راه بعدی بهترین روش است:

#عبارتند از #عبارتند از class Something (خصوصی: static std :: وکتور s_mychars؛ عمومی: کلاس _nested // یک کلاس تو در تو را با نام _nested تعریف کنیم (عمومی: _nested () // سازنده _ توجیه شده متغیر عضو استاتیک ما را تنظیم می کند (s_mychars.push_back ("o")؛ s_mychars.push_back ("a")؛ s_mychars.push_back ("تو")؛ s_mychars.push_back ("من")؛ s_mychars.push_back ("e")؛))؛ // روش استاتیک برای خروج s_mychars استاتیک void getSomething () (برای (اتومبیل و عنصر: s_mychars) std :: cout<< element << " "; } private: static _nested s_initializer; // используем статический объект класса _nested для гарантии того, что конструктор _nested выполнится }; std::vector چیزی :: s_mychars؛ // متغیر عضو استاتیک ما را تعریف کنیم چیزی :: _ توشیح چیزی :: s_initializer؛ // s_initializer استاتیک ما را تعریف کنید ، که از سازنده _nested برای شروع اولیه s_mychars int main () استفاده خواهد کرد (چیزی :: getSomething () ؛ بازگشت 0؛)

#عبارتند از

#عبارتند از

کلاس چیزی

خصوصی:

static std :: وکتور< char > s_mychars؛

عمومی:

کلاس _مستند // یک کلاس تو در تو را با نام _nested تعریف کنید

عمومی:

تو در تو () // _ سازنده nested متغیر عضو استاتیک ما را اولیه می کند

s_mychars push_back ("o")؛

s_mychars push_back ("الف")؛

s_mychars push_back ("تو")؛

s_mychars push_back ("من")؛

s_mychars push_back ("ه")؛

آخرین بروزرسانی: 08.10.2017

علاوه بر متغیرها و روشهایی که مستقیماً به یک شی ارتباط دارند ، C ++ به شما امکان می دهد متغیرها و روشهایی را که مستقیماً به یک کلاس یا در غیر این صورت اعضای استاتیک یک کلاس مربوط می شوند ، تعریف کنید. متغیرها و روشهای ثابت به طور کلی برای کل کلاس اعمال می شود. کلمه کلیدی استاتیک برای تعریف آنها استفاده می شود.

به عنوان مثال ، یک بانک ممکن است سپرده های مختلف زیادی داشته باشد ، اما تمام سپرده ها دارای نرخ بهره مشترکی خواهند بود. بنابراین ، برای توصیف حساب بانکی ، کلاس زیر را تعریف و استفاده می کنیم:

#عبارتند از کلاس حساب (عمومی: حساب (مبلغ دو برابر) (این-\u003e مبلغ \u003d مبلغ)) استاتیک int getRate () (نرخ بازده؛) استاتیک void setRate (int r) (نرخ \u003d r؛) double getIncome () (مبلغ برگشتی + sum * نرخ / 100؛) خصوصی: مبلغ مضاعف؛ نرخ استاتیک int؛)؛ int Account :: نرخ \u003d 8؛ int main () (Account Account1 (20000)؛ Account Account2 (50000)؛ Account :: setRate (5)؛ // بازنشانی نرخ std :: cout<< "Rate: " << Account::getRate() << std::endl; std::cout << "Rate: " << account1.getRate() << " Income: " << account1.getIncome() << std::endl; std::cout << "Rate: " << account2.getRate() << " Income: " << account2.getIncome() << std::endl; return 0; }

کلاس Account برای مدیریت این متغیر ، یک نرخ متغیر استاتیک و دو عملکرد ثابت را تعریف می کند. در هنگام تعریف توابع استاتیک ، باید در نظر داشت که در داخل آنها فقط می توانیم از متغیرهای کلاس استاتیک مانند متغیر نرخ استفاده کنیم. در توابع استاتیک نمی توانید از متغیرهای غیر استاتیک استفاده کنید.

علاوه بر این ، این اشاره گر را نمی توان در توابع استاتیک ، که در اصل از قبل آشکار است ، استفاده کرد ، زیرا این موضوع به جسم فعلی اشاره می کند ، و توابع استاتیک به عنوان یک کل به کل کلاس اشاره می کنند.

همچنین حائز اهمیت است که اگر کلاس شامل متغیرهای ایستا باشد ، باید خارج از کلاس نیز تعریف شوند:

Int Account :: نرخ \u003d 8؛

اولیه سازی متغیر اختیاری است.

همچنین شایان ذکر است از آنجا که اعضای استاتیک به طور کلی به کل کلاس مراجعه می کنند ، از نام کلاس برای ارجاع به اعضای استاتیک استفاده می شود و به دنبال آن اپراتور ::. یا می توانیم از طریق متغیرهای این کلاس به اعضای عمومی کلاس دسترسی پیدا کنیم:

حساب :: getRate () account1.getRate ()

خروجی کنسول برنامه:

نرخ: 5 نرخ: 5 درآمد: 21000 نرخ: 5 درآمد: 52500

همچنین از ثابتهای استاتیک اغلب در کلاسها استفاده می شود. به عنوان مثال ، بیایید متغیر نرخ را در کلاس Account ثابت کنیم:

#عبارتند از حساب کلاس (عمومی: const static int int \u003d 8؛ Account (مبلغ دو برابر) (this-\u003e sum \u003d sum؛) double getIncome () (مبلغ بازده + مبلغ * نرخ / 100؛) خصوصی: مبالغ دو برابر؛) int main () (Account Account1 (20000)؛ Account Account2 (50000)؛ std :: cout<< "Rate: " << account1.rate << "\tIncome: " << account1.getIncome() << std::endl; std::cout << "Rate: " << account2.rate << "\tIncome: " << account2.getIncome() << std::endl; return 0; }

بر خلاف متغیرهای استاتیک ، ثابت نیست که ثابت باید در خارج از کلاس تعریف شود.

کلمه کلیدی استاتیک

بعضی اوقات شما باید عضو یک کلاس را تعریف کنید که مستقل از سایر اشیاء آن کلاس استفاده شود. به طور معمول ، دسترسی به یک عضو یک کلاس از طریق یک شیء از آن کلاس سازماندهی می شود ، اما در عین حال ، شما می توانید یک عضو کلاس را برای استفاده مستقل و بدون مراجعه به نمونه خاصی از شی ایجاد کنید. برای ایجاد چنین عضو کلاس ، کافی است که در همان ابتدای اعلامیه آن ذکر شود کلمه کلیدی استاتیک.

اگر یک عضو کلاس استاتیک اعلام شود ، قبل از ایجاد هر نوع اشیاء در کلاس خود و بدون مراجعه به هیچ جسم در دسترس می باشد. با استفاده از کلمه کلیدی استاتیک می توانید متغیرها و روش ها را اعلام کنید. متداول ترین نمونه عضو استاتیک روش Main () است که به عنوان چنین اعلام می شود زیرا باید در همان ابتدای اجرای برنامه توسط سیستم عامل فراخوانی شود.

برای استفاده از یک عضو ثابت در خارج از یک کلاس ، فقط کافی است نام کلاس را با یک عملگر نقطه مشخص کنید. اما نیازی به ایجاد یک هدف برای این کار نیست. در واقع ، یک عضو استاتیک با مراجعه به یک شیء ، بلکه با نام کلاس آن قابل دسترسی نیست.

متغیرهای اعلام شده ایستا در اصل جهانی هستند. هنگامی که اشیاء در کلاس خود اعلام می شوند ، نسخه ای از متغیر استاتیک ایجاد نمی شود. در عوض ، تمام نمونه های کلاس متغیر استاتیک یکسان دارند. چنین متغیری قبل از استفاده در کلاس آغاز می شود.

نمونه ای از استفاده از کلید واژه استاتیک:

استفاده از سیستم؛ با استفاده از System.Collections.Generic؛ با استفاده از System.Linq؛ با استفاده از System.Text؛ namespace ConsoleApplication1 (کلاس myCircle کلاس (// 2 روش که باعث می شود مساحت و طول یک دایره استاتیک عمومی دو برابر SqrCircle (شعاع int)) (بازگشت Math.PI * شعاع * شعاع)) استاتیک عمومی دوبل LongCircle (شعاع int) (بازگشت 2 * Math.PI * شعاع؛)) کلاس کلاس برنامه (استاتیک خالی استاتیک اصلی (استدلال رشته) (int r \u003d 10؛ // روش های فراخوانی از کلاس دیگر // بدون آنکه یک شیء از این کلاس Console.WriteLine ("مساحت یک دایره با شعاع (0) \u003d (1 : #. ##) "، r، myCircle.SqrCircle (r))؛ Console.WriteLine (" طول دایره (0: #. ##) "، myCircle.LongCircle (r))؛ Console.ReadLine ()؛ )))

تعدادی محدودیت در استفاده از روشهای نوع استاتیک وجود دارد:

    یک روش ثابت نباید این مرجع را داشته باشد ، زیرا چنین روشی نسبت به هیچ شیء اجرا نمی شود

    در روشی از نوع استاتیک ، فقط سایر روشهای نوع استاتیک می توانند مستقیماً فراخوانی شوند ، اما یک روش نمونه از همان کلاس نیست. نکته این است که روش های نمونه بر روی اشیاء خاص کار می کنند ، و یک روش ایستا روی یک جسم فراخوانی نمی شود. بنابراین ، چنین روشی اشیایی ندارد که بتواند روی آن کار کند.

    محدودیت های مشابه برای داده های استاتیک اعمال می شود. برای روشی از نوع استاتیک ، فقط سایر داده ها از نوع استاتیک ، تعریف شده در کلاس آن ، مستقیماً در دسترس هستند. او به ویژه نمی تواند روی متغیر نمونه ای از کلاس خود عمل کند ، زیرا او اشیایی را ندارد که بتواند با آنها کار کند

سازندگان استاتیک

سازنده را نیز می توان ایستا اعلام کرد. از یک سازنده استاتیک معمولاً برای اولیه سازی مؤلفه هایی استفاده می شود که در کل کلاس اعمال می شود ، و نه برای یک نمونه واحد از یک شیء از آن کلاس. بنابراین ، اعضای کلاس قبل از ایجاد هر نوع اشیاء این کلاس با یک سازنده ایستا آغاز می شوند:

استفاده از سیستم؛ با استفاده از System.Collections.Generic؛ با استفاده از System.Linq؛ با استفاده از System.Text؛ namespace ConsoleApplication1 (کلاس MyClass (public static int a؛ public int b؛ // MyBlay استاتیک سازنده استاتیک)) (a \u003d 10؛) // سازنده عادی MyClass () (b \u003d 12؛) کلاس کلاس برنامه (درجه اعتبار ساکن استاتیک اصلی) (string args) (Console.WriteLine ("دسترسی به نمونه ای از کلاس a:" + MyClass.a)؛ MyClass obj \u003d MyClass جدید ()؛ Console.WriteLine ("دسترسی به نمونه ای از کلاس b:" + obj.b)؛ کنسول .ReadLine ()؛)))

توجه داشته باشید که سازنده استاتیک هنگام بارگیری کلاس و قبل از سازنده نمونه به طور خودکار خوانده می شود. نتیجه گیری کلی تر از این می توان نتیجه گرفت: یک سازنده استاتیک باید قبل از هر سازنده نمونه اجرا شود. علاوه بر این ، سازندگان استاتیک اصلاح کننده های دسترسی ندارند - آنها دسترسی پیش فرض دارند و بنابراین نمی توان از یک برنامه فراخوانی کرد.

کلاسهای استاتیک

کلاس را می توان ایستا اعلام کرد. یک کلاس استاتیک دو خاصیت اصلی دارد. ابتدا اشیاء کلاس استاتیک ایجاد کنید نمی تواند... و ثانیا ، یک کلاس استاتیک فقط باید شامل اعضای استاتیک باشد. کلاس استاتیک با استفاده از فرم زیر اعلامیه کلاس ایجاد می شود ، که با کلمه کلیدی استاتیک اصلاح شده است.

نام کلاس کلاس استاتیک (// ...

کلاس های استاتیک عمدتاً در دو مورد استفاده می شوند. ابتدا ، یک کلاس استاتیک هنگام ایجاد نیاز است روش فرمت... روشهای پسوند عمدتا مربوط به زبان LINQ است. و ثانیا ، از یک کلاس استاتیک برای ذخیره مجموعه ای از روش های استاتیک مرتبط با یکدیگر استفاده می شود.

درس 25. توابع استاتیک و اعضای داده

تاکنون ، هر شیئی که ایجاد می کنید مجموعه ای از اقلام داده خاص خود را دارد. بسته به هدف برنامه شما ، ممکن است شرایطی وجود داشته باشد که اشیاء همان کلاس نیاز به یک یا چند مورد داده را به اشتراک بگذارند. به عنوان مثال ، فرض کنید که شما در حال نوشتن برنامه پرداخت هستید که ساعت کار برای 1000 کارمند را ردیابی می کند. برای تعیین نرخ مالیات ، برنامه باید از شرایطی که هر کارمند در آن کار می کند آگاه باشد. اجازه دهید یک متغیر کلاس برای این مورد استفاده شود state_of_workبا این حال ، اگر همه کارمندان تحت شرایط یکسان کار کنند ، برنامه شما می تواند این مورد را برای همه اشیاء از نوع به اشتراک بگذارد کارمندبنابراین ، برنامه شما با بیرون راندن 999 نسخه از همان اطلاعات ، میزان حافظه مورد نیاز را کاهش می دهد. برای به اشتراک گذاشتن یک عنصر کلاس ، باید آن عنصر را به عنوان اعلام کنید استاتیک (استاتیک).این آموزش مراحلی را که برای به اشتراک گذاشتن یک عضو کلاس با اشیاء متعدد باید دنبال کنید ، طی می کند. در پایان این آموزش ، شما بر مفاهیم اساسی زیر تسلط خواهید یافت:

    C ++ به شما امکان می دهد تا اشیاء از همان نوع داشته باشید که یک یا چند عضو یک کلاس را به اشتراک می گذارند.

    اگر برنامه شما مقداری را به یک مورد مشترک اختصاص می دهد ، سپس تمام اشیاء آن کلاس بلافاصله به آن مقدار جدید دسترسی پیدا می کنند.

    برای ایجاد یک عضو کلاس مشترک ، باید قبل از نام کلمه کلاس با کلمه کلیدی پیش بروید ایستا

    بعد از اینکه برنامه عنصر کلاس را به عنوان اعلام کرد استاتیک ،باید یک متغیر جهانی (خارج از تعریف کلاس) را که مربوط به این عضو کلاس مشترک است اعلام کند.

    برنامه های شما می توانند از کلمه کلیدی استفاده کنند استاتیک ،برای ایجاد روشی از یک کلاس قابل تماس است در حالی که برنامه ممکن است هنوز هیچ اشیاء آن کلاس را اعلام نکرده باشد.

اشتراک گذاری اطلاعات ITEM

به طور معمول ، وقتی اشیاء از یک کلاس خاص ایجاد می کنید ، هر شیء مجموعه داده های خاص خود را بدست می آورد. با این وجود ، ممکن است شرایطی وجود داشته باشد که اشیاء همان کلاس به اشتراک گذاری یک یا چند مورد داده بپردازند. (استاتیک هعناصر داده). در چنین مواردی موارد را به عنوان اعلام کنید لجن مشترکو خصوصی،و سپس قبل از تایپ با کلمه کلیدی استاتیک ،مطابق شکل زیر:

private: static int shared_value؛

پس از اعلام کلاس ، باید عنصر را به عنوان یک متغیر جهانی خارج از کلاس اعلام کنید ، همانطور که در شکل زیر نشان داده شده است:

int class_name :: shared_value؛

برنامه زیر SHARE_IT.CPP یک کلاس را تعریف می کند سری کتاب ها،عنصر اشتراک گذاری page_count ،که برای همه اشیاء (کتاب) کلاس (سری) یکسان است. اگر برنامه مقدار این عنصر را تغییر دهد ، فوراً در کلیه اشیاء کلاس تغییر می یابد:

#عبارتند از

#عبارتند از

کلاس book_series

(عمومی: book_series (char *، char *، float)؛ void show_book (void)؛ void set_pages (int)؛ private: static int page_count؛ عنوان char)؛ نویسنده char [64]؛ قیمت float؛)؛

int book_series :: page__count؛

void book_series :: set_pages (صفحات int)

(page_count \u003d صفحات؛)

book_series :: book_series (char * عنوان، char * نویسنده، قیمت float)

(strcpy (book_series :: عنوان ، عنوان)؛ strcpy (book_series :: نویسنده ، نویسنده)؛ book_series :: قیمت \u003d قیمت؛)

void book_series :: show_book (اعتبار)

(فحش<< "Заголовок: " << title << endl; cout << "Автор: " << author << endl; cout << "Цена: " << price << endl; cout << "Страницы: " << page_count << endl; }

(برنامه برنامه نویسی book_series ("یادگیری برنامه نویسی در C ++" ، "جامسا" ، 22.95)؛ کلمه book_series ("یادگیری کار با Word برای ویندوز" ، "Wyatt" ، 19.95) ؛ word.set_pages (256) ؛ programming.show_book ()؛ word.show_book ()؛ cout<< endl << "Изменение page_count " << endl; programming.set_pages(512); programming.show_book(); word.show_book(); }

همانطور که می بینید کلاس اعلام می کند page_countمانند int staticبلافاصله پس از تعریف کلاس ، برنامه عنصر را اعلام می کند page_countبه عنوان یک متغیر جهانی. وقتی یک برنامه یک مورد را تغییر می دهد page_count ،این تغییر بلافاصله در تمام اشیاء کلاس آشکار می شود سری کتاب ها.

اشتراک اعضای کلاس

بسته به برنامه شما ، ممکن است موقعیت هایی وجود داشته باشد که شما نیاز به اشتراک گذاری داده های خاص در چندین نمونه از یک شی داشته باشید. برای انجام این کار ، چنین عنصری را استاتیک اعلام کنید. در مرحله بعد ، این عنصر را در خارج از کلاس به عنوان یک متغیر جهانی اعلام کنید. هرگونه تغییر برنامه شما در این عنصر ، بلافاصله در اشیاء این کلاس منعکس می شود.

استفاده از عناصر با ویژگی هااستاتیک عمومی اگر اشیاء وجود ندارند

همانطور که تازه آموخته اید ، هنگام اعلام یک عنصر کلاس به عنوان ایستااین عنصر توسط همه اشیاء این کلاس به اشتراک گذاشته می شود. با این حال ، موقعیت هایی وجود دارد که برنامه هنوز موضوع را ایجاد نکرده است ، اما باید از عنصر استفاده کند. برای استفاده از یک عنصر ، برنامه شما باید آنرا اعلام کند عمومیو ایستابه عنوان مثال ، برنامه زیر USE_MBR.CPP از این عنصر استفاده می کند page_countاز کلاس سری کتاب ها،حتی اگر اشیاء این کلاس وجود ندارند:

#عبارتند از

#عبارتند از

کلاس book_series

(عمومی: static int page_count؛ private: عنوان char؛ نویسنده char؛ قیمت شناور؛)؛

int book_series :: page_count؛

void main (void) (book_series :: page_count \u003d 256؛ cout<< "Текущее значение page_count равно " << book_series::page_count << endl; }

در این حالت ، از آنجا که کلاس عضو کلاس را تعریف می کند page_countمانند عمومی،برنامه می تواند به این عضو کلاس مراجعه کند ، حتی اگر اشیاء کلاس باشد سری کتاب هاوجود ندارد.

با استفاده از عملکردهای عنصر ثابت

برنامه قبلی استفاده از ایستاموارد داده به طور مشابه ، C ++ به شما امکان تعریف می دهد ایستاتوابع عضو (روش) اگر شما ایجاد کنید ایستابرنامه شما می تواند چنین متدی را فراخواند حتی اگر هیچ اشیایی ایجاد نشده باشد. به عنوان مثال ، اگر یک کلاس شامل روشی است که می تواند از داده های خارج از کلاس استفاده شود ، می توانید آن روش را انجام دهید ایستادر زیر کلاس است منو،که از توالی فرار درایور ANSI برای پاک کردن صفحه نمایش استفاده می کند. اگر درایور ANSI.SYS را روی سیستم خود نصب کرده اید ، می توانید از روش استفاده کنید صفحه_ روشنبرای تمیز کردن صفحه از آنجا که این روش به عنوان اعلام شده است استاتیک ،این برنامه حتی اگر اشیاء از نوع باشند می تواند از آن استفاده کند منووجود ندارد. برنامه CLR_SCR.CPP زیر از این روش استفاده می کند صفحه_ روشنبرای پاک کردن صفحه نمایش:

#عبارتند از

(عمومی: استاتیک void zel_screen (اعتبار) ؛ // در اینجا باید روش های دیگری نیز وجود داشته باشد: int number_of_menu_options؛)؛

void menu :: clear_screen (اعتبار)

(فحش<< "\033" << "}

زنگ

کسانی هستند که این خبر را قبل از شما می خوانند.
برای دریافت آخرین مقالات مشترک شوید.
پست الکترونیک
نام
نام خانوادگی
چگونه می خواهید The Bell را بخوانید
بدون اسپم