با سلام
میخواستم بپرسم که کاربرد static کجاهاست؟
با تشکر
موضوعات مشابه:
با سلام
میخواستم بپرسم که کاربرد static کجاهاست؟
با تشکر
موضوعات مشابه:
توکل بخدا
http://DeepLearning.ir
اولین و تنها مرجع یادگیری عمیق ایران
هرکس از ظن خود شد یار من
از درون من نجست اسرار من
مثلا توی c#
در کلاس Console شما وقتی میخواین چیزی رو تو محیط کنسول پرینت کنین میگین
Console.WriteLine() ... در حالی که هیچ شی ای از کلاس Console نساخته بودین . پس متد WriteLine یک متد static هست.که همچین امکانی رو به شما میده ...
یا متد
که اگه استاتیک نبود باید از اون شئ ساخته میشدکد:int P = Math.Sqrt(16);
کد:Math Pouya = new Math(); int P = Pouya.Sqrt(16);
نگفتید برای چه زبانی میخواید اما عموما اینطور هست
متن پنهان
خود کلمه static اگه بعنوان یک لغت تشریحی در نظر گرفته بشه اشاره به مدت زمان حیات مکانهای اختصاص داده شده در حافظه در سی++ داره .(مثل: متغییر - شی و... ) . برای همین با این تعریفی که من کردم - ما با چند دسته بندی متفاوت از چگونگی اختصاص حافظه برای ذخیره سازی هامون در سی++ مواجه هستیم که در زیر این دسته بندی ها رو میبینین .
- static
- dynamic (heap)
- auto (stack)
.یک طرح کلی از نحوه پیاده سازی دسته بندی هایی که در بالا بهش اشاره کردم در حافظه معمولی رو میتونید در پایین ببینین که این دسته بندی ها شامل تمام فضای آدرس حافظه مجازی هستن. این هم یعنی اینکه از پایین ترین آدرس حافظه مجازی تا بالاترین آدرس حافظه مجازی از این دسته بندی ها تبعیت میکنه .
text (کد برنامه ما)
static (داده های مقدار دهی شده و نشده )
heap
(فضای آدرس دهی مجازی که قابل استفاده توسط هیپ و استک هست)
stack
که همونطور که در طرح بالا مشخص هست استک و هیپ بسمت هم رشد میکنند .طرحی که شما اینجا مشاهده میکنید یک طرح نمایشی هست که شما به این درک برسید که ما با چه چیزی سرو کار داریم و اتفاقات دقیقا به چه صورتی می افتن .
پس بطور خلاصه یک مکان static اشاره به جایی از حافظه داره که در تمام مدت زمان حیات برنامه وجود داره و تا انتهای کار برنامه از بین نمیره .این رو هم اضافه کنم که متغییرهای گلوبال همگی از نوع استاتیک هستند (همون متغییرها یا اشیائی که قبل از شروع تابع main() تعریف میکنید).
و سایر مکانها مثل مکانهای مورد استفاده دراستکها با فراخونی توابع ایجاد میشن و بعد با تمام شدن کار تابع مربوطه -و خروج از اون -از بین میرن . فضای ذخیره سازی استفاده شده در هیپ ها(Heap) هم با استفاده از کلمات کلیدی new ایجاد ( اختصاص داده میشه ) و بعد با استفاده از کلمات کلیدی delete یا delete[] برای استفاده در مورد آرایه ها از بین میرن .
دقت کنید که استفاده از کلمه کلیدی static بصورت زیر
void f()
{
static int x = 37;
}
به این معنا نیست که این متغییر همه جای برنامه توسط همه توابع یا اشیاء قابل استفاده است ! بلکه داره اشاره میکنه که این مکان از حافظه ( متغییر x) در تمام مدت حیات برنامه وجود داره هرچند که x خارج از تابع f() قابل دسترسی و استفاده نباشه.
-----------
1.زمانی که بخواید شی ای که تولید میکنید بین تمامی اشیاء دیگه به اشتراک گذاشته بشه
2.این شی یا متغیر شما در تمام طول اجرا برنامه تون وجود داشته باشه - البته اینم باید بگم الزاما متغییری که در تمام مدت برنامه وجود داشته باشه به معنای این نیست که توسط همه هم قابل دسترسه ! مثلا
void f()
{
static int x = 47;
}
متغییر استاتیک x تا زمانی که برنامه در حال اجراست وجود داره ! اما خارج از تابع f قابل دسترس نیست . اینم بگم که متغییرهای استاتیک در زبان سی محدود به فایل هستن یعنی در همون فایلی که تعریف شدن قابل استفاده هستن .
3.در کلاسها مثلا استفاده از پیشوند static باعث میشه - همونطور که پویا جان اشاره کردن - متغیرها -توابع یا حتی کلاسهایی تولید بشن که برای استفاده از اونها نیازی به نمونه سازی از کلاستون نباشه - به این نوع کلاسها اصطلاحا Utility Class گفته میشه . - توابعی که استاتیک تعریف میشن میتونن از متغیرهای استاتیک فقط استفاده کنن )
4.زمانی که بخوایید مقدار دهی اولیه به متغییر یا شی تون تنها یک بار صورت بگیره (number of times دارای مقدار 100 خواهد بود بعد از اجرای این حلقه )
for(int x = 0; x < 10; x++)
{
for(int y = 0; y < 10; y++)
{
static int number_of_times = 0;
number_of_times++;
}
}
یا در مثال زیر شما میتونید تعداد نمونه هایی که از یک کلاس ساخته میشه رو بدست بیارید :
class User
{
private:
int id;
static int user_Count;
public:
static int next_User_Number()
{
user_Count++;
return user_Count;
}
user()
{
id = user::user_Count++; //یا, id = user.next_User_Number();
}
};
int user::next_id = 0;//در سی++ما در بخش کد بصورت مقابل میاییم متغییر استاتیک رو مقدار دهی میکنیم .
5.شما بخوایید همیشه آخرین مقدار ارسالی یک تابع رو داشته باشید میتونید از یک متغییر استاتیک استفاده کنید .
ویرایش توسط Hossein : 25th April 2012 در ساعت 03:45 PM دلیل: ویرایش متن
توکل بخدا
http://DeepLearning.ir
اولین و تنها مرجع یادگیری عمیق ایران
هرکس از ظن خود شد یار من
از درون من نجست اسرار من
علاقه مندی ها (Bookmarks)