PDA

View Full Version : داه های static و کلاس



suraty
جمعه 29 مهر 1390, 20:02 عصر
این عبارت صحیحه؟
شی فقط یکبار می تواند به داده های اختصاصی یا عمومی از نوع static مقدار اولیه بدهد.
اگه درسته دقیقا منظورش چیه؟
مثلا در مورد مثال زیر


#include"iostream.h"
#include"conio.h"
class class1{
static int c;
public:
void fun(int a){
c=a;
}
void show(){
cout<<c;
}
};
int class1::c;
int main(){
class1 ob1;
ob1.fun(1);
ob1.show();
class1 ob2;
ob2.fun(2);
ob2.show();
ob1.fun(3);
ob1.show();
ob2.show();
return 0;
}


یا این یکی:

#include"iostream.h"
#include"conio.h"
class class1{
static int c;
public:
class1(int a){
c=a;
cout<<c<<"\n";
}
};
int class1::c;
int main(){
class1 ob1(5);
ob1=10;
ob1=90;
return 0;
}

suraty
چهارشنبه 04 آبان 1390, 08:27 صبح
با توجه به این موضوع به نظر شما خروجی برنامه هایی که مثال زده ام چه می شود؟

developing
چهارشنبه 04 آبان 1390, 10:49 صبح
متغيرهاي ايستا ( static) به صورتي هستند كه در هر اجرا فقط يك نمونه از آنها در حافظه ايجاد مي شود.
به خاطر ويژگي بالا در هر بار اجرا فقط يك بار مقدار اوليه(دقت كنيد كه مقدار اوليه و نه تغيير) مي گيرند. اما مي توان در هر كجاي برنامه مقدار آنها را تغيير داد
اما نكته اينجاست كه چون يك نمونه از آنها در حافظه ايجاد مي گردد پس هر تغييري در آنها از طرف يك شي باعث ايجاد تغيير در متغير ايستاي معادل در ساير اشيايي مي شود كه يك نمونه از كلاس آنها مي باشد.
يعني اگر شما 10 شي از روي كلاس 1 ايجاد كنيد آنگاه:
در شي اول يك مقدار به متغير c انتساب كنيد در تمام 9 شي ديگر مقدار c تغيير خواهد كرد.
پس خروجي برنامه ي اول به صورت زير مي باشد.
1233
و برنامه ي دوم هم كه يك شي مي باشد و مشكلي نبايد باشد و خروجي زير را ايجاد مي كند:
5
10
90
مشكل شما اين است كه فكر مي كنيد متغرهاي ايستا ( static) فقط يك بار مقدار مي گيرند كه اين اشتباه است.
اين متغيرها يك بار مقدار اوليه مي گيرند و مي توان در هر جاي برنامه مقدار آنها را تغيير داد(اگر غير از اين بود كه به آنها متغير نمي گفتند و آنها را ثابت صدا مي كردند)
اما نكته اين است كه مقدار خود را حتي اگر از حوزه ي متغيري آنها خارج شويم حفظ مي كنند.

suraty
چهارشنبه 04 آبان 1390, 19:39 عصر
خیلی ممنون توضیحاتتون بسیار مفید و کارآمد بود.
فقط یک سوال. مقداردهی اولیه یعنی اولین باری که به متغیر مقدار می دهیم در هر جای برنامه یا مقداردهی اولیه یعنی وقتی شی را تعریف می کنیم.مثلا وقتی که می نویسم:

class1 ob1;

m.soleimani
چهارشنبه 04 آبان 1390, 21:43 عصر
خیلی ممنون توضیحاتتون بسیار مفید و کارآمد بود.
فقط یک سوال. مقداردهی اولیه یعنی اولین باری که به متغیر مقدار می دهیم در هر جای برنامه یا مقداردهی اولیه یعنی وقتی شی را تعریف می کنیم.مثلا وقتی که می نویسم:

class1 ob1;

به این کد نگاه کن :

#include <iostream>
using namespace std;
class Test
{
private:
static int siVar;
public:
static void set_siVar(int val)
{
siVar = val;
}

void get_siVar()
{
cout << siVar << endl;
}
};
int Test::siVar = 10;
int main()
{
Test tObj1;
tObj1.get_siVar();
tObj1.set_siVar(40);

///////////////////
Test tObj2;
tObj2.get_siVar();

system("pause");
return 0;
}

ببین توی مرتبه اول مقداری که به متغیر استاتیک دادیم 10 هست و شی اولی هم همین مقدار رو نشون میده و در ادامه به این متغییر توسط شی اول مقدار 40 داده شده؛ حالا بعد از این که یه شی تازه از این کلاس ساخته می‌شه مقداری که توسط شی اولی به متغییر داده رو به دست میاریم.

شاد و پیروز باشید./

suraty
پنج شنبه 05 آبان 1390, 11:49 صبح
این کد رو استادمون نوشته و گفته که خروجی زیر رو تولید میکنه. حالا از خطایی که داره بگذریم، مسئله اینه که تو خط بیستم مقدار 4 رو به متغیر استاتیک y اختصاص میده یا نه؟
به نظر من اختصاص میده چون مقداردهی اولیه نیست، تغییر مقداره.
خروجی:

567838


#include"iostream.h"
#include"conio.h"
class class1{
int x;
static int y;
public:
class1(int i,int j){
x=i;
y=j;
}
void show(){
cout<<x<<y;
} };
int class1::y;
int main(){
class1 ob1(5,6);
ob1.show();
class1 ob2(7,8);
ob2.show();
ob1(3,4);
ob1.show();
return 0;
}

developing
شنبه 07 آبان 1390, 12:22 عصر
با سلام

دوست عزيز در خط 20 شما نمي تونيد اون دستور رو بنويسيد چرا كه اين دستور در واقع دسترسي به سازنده ي كلاس هست كه فقط در موقع ساختن يك شي از كلاس به صورت خودكار فراخواني مي شود.
پس براي همچين مقدار دهي بايد يك تابع بنويسيد و بعد مقدار دهي كنيد. مثل:

class class1{
int x;
static int y;
public:
void valueassign(int a, int b)
{
x = a;
y = b;
}
class1(int i,int j){
x=i;
y=j;
}
void show(){
cout<<x<<y;
} };
int class1::y;
int main(){
class1 ob1(5,6);
ob1.show();
class1 ob2(7,8);
ob2.show();
//ob1(3,4);
ob1.valueassign(3,4);
ob1.show();
getch();
return 0;
}

اونوقت خروجي برنامه مثل شكل زير مي باشد و همونطور كه گفته شد به متغيرهاي ايستا هر جايي مي شود مقدار دهي كرد.

77181

suraty
شنبه 07 آبان 1390, 23:17 عصر
پس شما هم موافقید که شی ob1 به متغیر ایستای y یک بار مقدار 6 و یک بار مقدار 4 رو اختصاص میده.