PDA

View Full Version : توابع static در C



behnia_k
چهارشنبه 05 تیر 1392, 09:01 صبح
با سلام
با مفهوم static در C++‎‎ كمي آشنا هستم. اگر يك يا چند فانكشن را در C به شكل استاتيك تعريف كنيم چه مفهومي دارد.




/*file.h*/

static int F1(int i)
{
return i + 10;
}

static int F2(int i)
{
return F1(i) + i * 10;
}

tdkhakpur
چهارشنبه 05 تیر 1392, 11:16 صبح
تا اونجایی که یادمه وقتی static به کار برده میشه به مفهم اینه که حافظه رزرو شده پایداره شده و تا آخر برنامه برای اون قسمت رزرو میشه.
در این مورد تست نشد اما به احتمال 90 درصد این کلمه برای پایدار کردن مقدار برگشتی برای int هست نه تابع.

حامد مصافی
چهارشنبه 05 تیر 1392, 14:04 عصر
توابع استاتیک در c و ++C کاملاً متفاوت هستند. در مثال شما این توابع فقط در محدوده همان فایل قابل دسترسی هستند و کامپایلر اجازه فراخوانی آنها از آبجکت (فایل)‌ دیگر را نخواهد داد.

brightening-eyes
شنبه 08 تیر 1392, 10:07 صبح
تو توابع استاتیک شما میتونی از متغیری که تو اون تابع تعریف شده استفاده کنی
در صورتی که اگه استاتیک نباشه کامپایلر نمیزاره و ارور میده
مثلا
static double f3(int argument, char text)
{
return (double) argument;
}
int main()
{
cout<<text<<f3(argument, text)<<"\n";
}

ولی باید بگم که زیاد مطمین نیستم
چون من توابع رو اصلا استاتیک تعریف نمیکنم.

omidshaman
شنبه 08 تیر 1392, 14:51 عصر
نه دوست عزیز این جوری که شما گفتین نیست یک مثال برای متغیر Static داخل یک فانکشن

#include <iostream>
using namespace std;
void draw()
{
static int strNum=1,spcNum=25;
for(int i=0;i<spcNum;i++)
cout<<' ';
for(int i=0;i<strNum;i++)
cout<<'*';
strNum +=2;
spcNum --;
cout<<endl;
}
int main()
{
for(int i=1;i<21;i++)
draw();
}

خروجی 106330
اگر تعریف می کردیم

static void draw(int num)
ّباز هم نتیجه همین بود فقط فرقش با قبلی همون جوری که اقای مصافی گفتن اینه که فقط توی همین فایل cpp میشه ازش استفاده کرد..

مثال برای متغیر و فانکشن static در کلاس



#include<iostream>

using namespace std;

class student
{
private :

static int stdCount ;
public:
student()
{
stdCount++;
}
static int studentCount()
{
return stdCount;
}
};
int student::stdCount=0;
int main()
{
student *s1=new student();
student *s2=new student();
student *s3=new student();
student *s4=new student();
cout<<student::studentCount();
}

behnia_k
دوشنبه 10 تیر 1392, 22:20 عصر
توابع استاتیک در c و ++C کاملاً متفاوت هستند. در مثال شما این توابع فقط در محدوده همان فایل قابل دسترسی هستند و کامپایلر اجازه فراخوانی آنها از آبجکت (فایل)‌ دیگر را نخواهد داد.

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

omidshaman
سه شنبه 11 تیر 1392, 21:04 عصر
با تشکر. با توجه به مطلبی که بیان کردید میتوان دو تابع همنام با آرگومانانهای یکسان و مقدار بازگشتی یکسان در دو فایل جداگانه داشت؟
بله در صورتی که یکیشون static باشه
برای انجام این کار از namespace ها هم می تونین استفاده کنین

حامد مصافی
چهارشنبه 12 تیر 1392, 14:03 عصر
با تشکر. با توجه به مطلبی که بیان کردید میتوان دو تابع همنام با آرگومانانهای یکسان و مقدار بازگشتی یکسان در دو فایل جداگانه داشت؟
بله


بله در صورتی که یکیشون static باشه
برای انجام این کار از namespace ها هم می تونین استفاده کنین

اگر 2 تای اونها هم static باشن مشکلی نیست. . اگه یکی از اونها هم static نباشه باز هم امکانش هست.
برای مثال اگر n تا تابع همنام با آرگومانهای یکسان و مقدار برگشتی یکسان در n تا فایل جداگانه باشند . n تا تابع هم میتونن همشون static باشن . و حداکثر فقط یکی از اونها میتونه static نیاشه !
اگر صحبت در مورد زبان ++C بود فرمایش شما درست می‌بود. اما در این تاپیک، خیر.

omidshaman
چهارشنبه 12 تیر 1392, 16:58 عصر
2
بله

اگر صحبت در مورد زبان ++C بود فرمایش شما درست می‌بود. اما در این تاپیک، خیر.
تابع static توی cوC++‎ عملکرد یکسانی داره دیگه...

حامد مصافی
چهارشنبه 12 تیر 1392, 19:59 عصر
صحبت من دقیقا درباره ی زبان (C (C99 بود .
به شرطی که این دو تابع از همدیگر مخفی بمانند. یعنی توابع در فایل‌های cpp تعریف شوند و در فایل h اعلان نشوند. که البته در این صورت فرقی ندارد استاتیک باشند یا نه. در واقع مسئله اساسی در این مورد این است که شما نمی‌توانید توابع استاتیک را در h اعلان کنید. به همین دلیل آنها در فایل‌های cpp و مخفی از یکدیگر باقی می‌مانند. فرض کنید در فایل m1.cpp یک تابع عادی تعریف و در m1.h اعلان شده است. اگر فایل m2.cpp سر‌آیند m1.h را include کند دیگر نمی‌تواند یک تابع دیگر با همان نام تابع استاتیک اول داشته باشد.



تابع static توی cوC++‎‎ عملکرد یکسانی داره دیگه...

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

omidshaman
چهارشنبه 12 تیر 1392, 20:51 عصر
به شرطی که این دو تابع از همدیگر مخفی بمانند. یعنی توابع در فایل‌های cpp تعریف شوند و در فایل h اعلان نشوند. که البته در این صورت فرقی ندارد استاتیک باشند یا نه. در واقع مسئله اساسی در این مورد این است که شما نمی‌توانید توابع استاتیک را در h اعلان کنید. به همین دلیل آنها در فایل‌های cpp و مخفی از یکدیگر باقی می‌مانند. فرض کنید در فایل m1.cpp یک تابع عادی تعریف و در m1.h اعلان شده است. اگر فایل m2.cpp سر‌آیند m1.h را include کند دیگر نمی‌تواند یک تابع دیگر با همان نام تابع استاتیک اول داشته باشد.
خیر، در پست‌های قبل اشاره کردم به این موضوع
من دارم می گم تابع static که خارج از کلاس تعریف شده توی c و C++‎‎ عملکرد یکسانی داره...(یعنی این سوالی که ایجاد کننده تاپیک پرسیده فرقی نداره c باشه یا C++‎‎ ) شما اینو قبول نداری؟!
تفاوت static توی c و C++‎‎ توی چیزای دیگست...
شما می گی این جمله برای C++‎ درست نیست؟



اگر 2 تای اونها هم static باشن مشکلی نیست. . اگه یکی از اونها هم static نباشه
باز هم امکانش هست.
برای مثال اگر n تا تابع همنام با آرگومانهای یکسان و مقدار
برگشتی یکسان در n تا فایل جداگانه باشند . n تا تابع هم میتونن همشون static باشن
. و حداکثر فقط یکی از اونها میتونه static نیاشه !

حامد مصافی
چهارشنبه 12 تیر 1392, 21:12 عصر
من دارم می گم تابع static که خارج از کلاس تعریف شده توی c و C++‎‎‎ عملکرد یکسانی داره...(یعنی این سوالی که ایجاد کننده تاپیک پرسیده فرقی نداره c باشه یا C++‎‎‎ ) شما اینو قبول نداری؟!
تفاوت static توی c و C++‎‎‎ توی چیزای دیگست...
شما می گی این جمله برای C++‎‎ درست نیست؟
دوست عزیز ماهیت static در ++C بر مبنای کپسوله‌سازی هست. در حالی که در c اصلا چنین چیزی نداریم.

اول اینکه لفظ خارج از کلاس رو در پست آخر به کار بردید. پس پست قبلی شما می‌تونست موجب گمراهی کاربران بشه که خواستم اصلاح کنم.
دوم اینکه در پست قبلی به namespace اشاره فرمودید که با توجه اینکه بحث بر سر زبان c هست باز هم این می‌تونست یک پاسخ اشتباه و باعث گمراهی بشه.
سوم گمان می‌کنم شما پست‌های بنده رو نمی‌خونید!

در مورد سوال و پست‌های دوستان نظرم رو به طور واضح عرض کردم.

omidshaman
چهارشنبه 12 تیر 1392, 21:37 عصر
سوم گمان می‌کنم شما پست‌های بنده رو نمی‌خونید!
چی بگم اخه !
اتفاقا دقیقا منم همین فکرو کردم که شما پست های منو نمی خونین!
به نظر شما اون پست اول شما بیشتر گمراه کنندست یا پست های من!؟

توابع استاتیک در c و ++C کاملاً متفاوت هستند. در مثال شما این توابع فقط در محدوده همان فایل قابل دسترسی هستند و کامپایلر اجازه فراخوانی آنها از آبجکت (فایل)‌ دیگر را نخواهد داد.
الان یک نفر که تازه وارده این جمله رو بخونه فکر می کنه توی C++‎‎ تابع static این کارو نمی کنه در حالی که دقیقا همین کارو می کنه ! (منظورم همون خارج از کلاس) درسته؟

ماهیت static در ++C بر مبنای کپسوله‌سازی هست
ماهیتش که همون ماهیت قدیمیه فقط همین استفاده در class هم بهش اضافه شده اولین باریه که جایی می خونم ماهیت static توی C++‎‎ بر مبنای کپسوله سازیه...
من مثالی هم که زدم توی C++‎‎ بود پس فکر نمی کنم گفتن namespace باعث گمراهی بشه. هر چند حرف شما درسته بهتر بود namespace رو نمی گفتم.
و این که این جمله برای C++‎ هم درسته

اگر 2 تای اونها هم static باشن مشکلی نیست. . اگه یکی از اونها هم static نباشه باز هم امکانش هست.
برای مثال اگر n تا تابع همنام با آرگومانهای یکسان و مقدار برگشتی یکسان در n تا فایل جداگانه باشند . n تا تابع هم میتونن همشون static باشن . و حداکثر فقط یکی از اونها میتونه static نیاشه
چون منظور ایشون هم تابع خارج از کلاس بوده