زنگ.

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

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

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

مانند متغیرهای استاتیک، روش های استاتیک به هیچ شیء تک کلاس متصل نشوید. در اینجا یک مثال بالا است، اما در حال حاضر با یک روش استاتیک:

کلاس هر چیزی (خصوصی: Static int s_value؛ عمومی: static int getvalue () (بازگشت s_value؛) / روش استاتیک)؛ INT هر چیزی :: s_value \u003d 3؛ // تعریف متغیر عضو استاتیک کلاس int main () (STD :: cout<< Anything::getValue() << "\n"; }

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

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

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

ثانیا، روش های استاتیک می توانند به طور مستقیم با سایر اعضای استاتیک (متغیرها یا توابع) تماس بگیرند، اما نمی توانند ناامن باشند. این به خاطر این واقعیت است که اعضای غیر استاتیک متعلق به شیء کلاس هستند و روش های استاتیک - نه!

یک مثال دیگر

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

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

#عبارتند از.

idgenerator کلاس

خصوصی:

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

عمومی:

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

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

int idgenerator :: s_nextid \u003d 1؛

int idgenerator :: getnextid () (بازگشت s_nextid ++؛)

int main ()

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

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

بازگشت 0؛

نتیجه برنامه بالاتر است:

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

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

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

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

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

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

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

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

چیزی کلاس (عمومی: Static STD :: Vector s_mychars؛ ) STD :: بردار چیزی :: s_mychars \u003d ("O"، "A"، "U"، "من"، "e")؛ // تعیین متغیر استاتیک متغیر

کلاس چیزی

عمومی:

استاتیک STD :: بردار< char > s_mychars؛

sTD :: بردار< char > چیزی :: s_mychars \u003d ("O"، "A"، "U"، "من"، "e")؛ // تعیین متغیر استاتیک متغیر

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

#عبارتند از. #عبارتند از. کلاس چیزی (خصوصی: Static STD :: Vector s_mychars؛ عمومی: کلاس _Nested // تعیین کلاس سرمایه گذاری شده به نام _Nested (Public: _Nested () // designer _Nested initializes Member متغیر استاتیک ما (s_mychars.push_back (o ")؛ s_mychars.push_back (" a ")؛ s_mychars.push_back (" U ")؛ s_mychars.push_back (" من ")؛ s_mychars.push_back (" e ")؛))؛ // روش استاتیک برای خروجی S_MYCHARS STATIC VOID CTSOMETHING () (برای (AUTO CONST & ERAME: S_MYCARS) STD :: COUT<< element << " "; } private: static _nested s_initializer; // используем статический объект класса _nested для гарантии того, что конструктор _nested выполнится }; std::vector چیزی :: s_mychars؛ // تعیین عضو متغیری استاتیک ما :: _ چیزی تونیست :: s_initializer؛ // تعیین S_Initializer استاتیک ما، که باعث می شود تا طراح _nested را برای راه اندازی s_mychars int main () (چیزی :: getetomething ()؛ بازگشت 0؛)

#عبارتند از.

#عبارتند از.

کلاس چیزی

خصوصی:

استاتیک STD :: بردار< char > s_mychars؛

عمومی:

کلاس _Nested // تعیین کلاس سرمایه گذاری شده به نام _Nested

عمومی:

تو در تو () // طراح _Nested initializes عضو متغیر استاتیک ما

s_mychars. push_back (o ")؛

s_mychars. push_back ("a")؛

s_mychars. push_back ("u")؛

s_mychars. push_back ("من")؛

s_mychars. push_back ("e")؛

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

علاوه بر متغیرها و روش هایی که به طور مستقیم به شیء مربوط می شوند، C ++ به شما اجازه می دهد تا متغیرها و روش هایی را که به طور مستقیم به کلاس یا سایر اعضای استاتیک کلاس مرتبط هستند، تعیین کنید. متغیرهای استاتیک و روش ها به طور کلی در کل کلاس هستند. برای تعیین آنها، کلمه کلیدی استاتیک است.

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

#عبارتند از. حساب کلاس (Sublic: حساب (این مبلغ) (این مبلغ) (این مبلغ \u003d مجموع؛) static int getRate () (نرخ بازگشت؛) static void setrate (int r) (rate \u003d r؛) double getincome () (بازگشت بازگشت + مجموع * نرخ / 100؛) خصوصی: مبلغ دو برابر؛ نرخ استاتیک INT؛)؛ حساب Int :: نرخ \u003d 8؛ int main () (حساب حساب 1 (20،000)؛ حساب حساب 2 (50،000)؛ حساب :: setrate (5)؛ // reinstall مقدار 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; }

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

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

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

حساب Int :: نرخ \u003d 8؛

مقدار اولیه متغیر را تعیین کنید اختیاری است.

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

حساب :: GetRate () حساب 1.GetRate ()

برنامه دفتر کنسول:

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

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

#عبارتند از. حساب کلاس (عمومی: Const Static Int نرخ \u003d 8؛ حساب (مبلغ دو برابر) (این مبلغ \u003d مجموع \u003d مجموع؛) Double Getincome () (بازگشت مجموع + مجموع * نرخ / 100؛) خصوصی: دو برابر؛)؛ int main () (حساب حساب 1 (2000)؛ حساب حساب 2 (50،000)؛ STD :: Cout<< "Rate: " << account1.rate << "\tIncome: " << account1.getIncome() << std::endl; std::cout << "Rate: " << account2.rate << "\tIncome: " << account2.getIncome() << std::endl; return 0; }

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

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

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

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

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

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

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

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

به اشتراک گذاری عنصر داده

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

خصوصی: استاتیک 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)؛ خصوصی: static int page_count؛ عنوان Char؛ نویسنده Char [64]؛ قیمت شناور ؛؛ قیمت شناور ؛؛

int book_series :: صفحه__

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

(page_count \u003d صفحات؛)

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

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

void book_series :: show_book (void)

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

(برنامه نویسی Book_series ("برنامه نویسی یادگیری در C ++"، "Jamsa"، 22.95)؛ Word Book_series ("یادگیری برای کار با کلمه برای ویندوز"، "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بلافاصله برای تعریف کلاس، این برنامه یک عنصر را اعلام می کند page_Count.به عنوان یک متغیر جهانی. هنگامی که برنامه عنصر را تغییر می دهد page_Count،تغییر بلافاصله خود را در تمام اشیاء کلاس نشان می دهد سری کتاب ها.

به اشتراک گذاری عناصر کلاس

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

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

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

#عبارتند از.

#عبارتند از.

کلاس Book_series.

(عمومی: استاتیک int page_count؛ خصوصی: عنوان چار؛ نویسنده چار؛ قیمت شناور؛)؛

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 Esc-tequet برای تمیز کردن صفحه نمایش استفاده می کند. اگر سیستم شما یک راننده Ansi.sys داشته باشد، می توانید از این روش استفاده کنید clear_screen.برای تمیز کردن صفحه نمایش از آنجا که این روش به عنوان اعلام شده است استاتیک،این برنامه می تواند از آن استفاده کند، حتی اگر اشیاء شیء منو.وجود ندارد. برنامه CLR_SCR.CPP زیر از روش استفاده می کند clear_screen.برای تمیز کردن صفحه نمایش:

#عبارتند از.

(عمومی: استاتیک void clear_screen (void)؛ // باید سایر روش های خصوصی وجود داشته باشد: int number_of_menu_options؛)؛

منوی Void :: Clear_screen (Void)

(cout.<< "\033" << "}

زنگ.

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