PDA

View Full Version : تفاوت Class و Struct



www2006
یک شنبه 26 شهریور 1385, 17:09 عصر
با سلام

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

mr_esmaily
یک شنبه 26 شهریور 1385, 21:56 عصر
سلام



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


....

www2006
سه شنبه 28 شهریور 1385, 15:12 عصر
با تشکر از توضیح شما ...
من از این نوشته این نتیجه را میگیرم که تفاوتی ( البته در حالتی که مطرح کرده ام ) با هم ندارند ... درسته ؟

shobair
سه شنبه 28 شهریور 1385, 15:27 عصر
با تشکر از توضیح شما ...
من از این نوشته این نتیجه را میگیرم که تفاوتی ( البته در حالتی که مطرح کرده ام ) با هم ندارند ... درسته ؟

سلام
زیباتره که از کلاس استفاده کنید. ضمناً شی گرائی فقط محدود به توابع داخل کلاس نمیشه. ارث بری و مخفی سازی رو از دست میدین اگر از کلاس استفاده نکنید.

شبیر

www2006
سه شنبه 28 شهریور 1385, 15:44 عصر
ارث بری و مخفی سازی رو از دست میدین اگر از کلاس استفاده نکنید.


به این نکتش اصلا توجه نکرده بودم ... ممنون

Pouria.NET
سه شنبه 28 شهریور 1385, 16:04 عصر
سلام. علاوه بر Inheritance و Polymorphism باید این نکته رو هم در نظر داشت که کلاسها Reference Type هستند و Structure ها Value Type .

www2006
سه شنبه 28 شهریور 1385, 17:15 عصر
باید این نکته رو هم در نظر داشت که کلاسها Reference Type هستند و Structure ها Value Type .

میشه بیشتر توضیح بدید ..؟

Armanprogrammer
پنج شنبه 30 شهریور 1385, 17:07 عصر
کلاس با struct خیلی فرق داره در حال حاضر از مهمترین چیزهایی که تو علم کامپیوتر وجود داره security یا امنیت که تو کلاس رعایت میشه همچنین بحث ورثه که خیلی مهمه که اینا شی گرایی رو تشکیل میده همچنین آقای puria.net تو struct ها referenece نیز وجود داره و این فرق اونا نیست و همچنین فرق class , structure وجود متد تو کلاسه و به نظر من باید به جای structure از کلاس استفاده کرد

Arash_j13
پنج شنبه 30 شهریور 1385, 22:34 عصر
شاید تو زبان ها دیگه کلاس و استراک باهم فرق داشته باشن ولی توی سی++ تنها فرقشون اینکه ادسترسی پیش فرض برای کلاس private و برای استراک public هست و این هم به خاطر سازگاری باسی به وجود اومده و گرنه هیچ تفاوتی با هم ندارن شما می تونید یه کلاس رو از یه استراکت مشتقی کنی برای یه استرکت چند ریخیتی رو پیدا سازی کنی کلا هر کاری بشه با یکی کرد با اون یکی هم می شه

Armanprogrammer
شنبه 01 مهر 1385, 16:28 عصر
شاید تو زبان ها دیگه کلاس و استراک باهم فرق داشته باشن ولی توی سی++ تنها فرقشون اینکه ادسترسی پیش فرض برای کلاس private و برای استراک public هست و این هم به خاطر سازگاری باسی به وجود اومده و گرنه هیچ تفاوتی با هم ندارن شما می تونید یه کلاس رو از یه استراکت مشتقی کنی برای یه استرکت چند ریخیتی رو پیدا سازی کنی کلا هر کاری بشه با یکی کرد با اون یکی هم می شه
دوست عزیز حرف شما درسته کلا فرق شی گرایی به private بودنشه و این فرق کوچیکی نیست و خیلی اساسیه و همچنین وراثت رو تو شی گرایی میتونیم ببینیم

mr_esmaily
شنبه 01 مهر 1385, 16:40 عصر
سلام

دوست عزیز حرف شما درسته کلا فرق شی گرایی به private بودنشه و این فرق کوچیکی نیست و خیلی اساسیه و همچنین وراثت رو تو شی گرایی میتونیم ببینیم


تنها یک تفاوت دستوری بین کلاسها و ساختار ها وجود دارد , بنا به قرارداد اعضای یک ساختار بصورت پیشفرض عمومی هستند , حال آنکه اعضای یک کلاس خصوصی هستند.

بصورت پیشفرض , نه از روی اجبار ! خیلی راحت مثله یک کلاس میتوان یک داده و یا تابع عضو را بصورت خصوصی در یک ساختار تعریف کرد.

دوباره تمام پستهای بالا رو بخون , بعد پست بعدی ات رو بده .

Arash_j13
یک شنبه 02 مهر 1385, 06:20 صبح
دوست عزیز حرف شما درسته کلا فرق شی گرایی به private بودنشه و این فرق کوچیکی نیست و خیلی اساسیه و همچنین وراثت رو تو شی گرایی میتونیم ببینیم

خیلی هم فرق بزرگی نیست شما حتما نیاد از سطح دسترسی پیش فرض استفاده کنید خیلی راحت می تونید سطح دسترسی رو در ساختار private تعریف کیند بدون هیچ مشکلی

oVERfLOW
یک شنبه 02 مهر 1385, 11:19 صبح
اگه قرار باشه توی یه شیء فقط از داده استفاده بشه دیگه مخفی بودن چه معنایی می‌ده؟
یه کم فکر کنید بعدش پست بدید
مرسی...

Arash_j13
یک شنبه 02 مهر 1385, 12:08 عصر
چرا معنا می ده فرض کنید مخواید یه ابجکت برای ساعت بسازید که سه تا فیلد ساعت دقیقه و ثانیه داره و هیچ کار دیگه ای هم نمی خواد انجام بده
اما این فیلدها هر مقداری رو نمی تونه نگه داری کنه مثلا ساعت 100 یا دقیقه 800 بی معنیه پس باید داده ها رو از دسترس عموم خارج کرد و به کمک متد ها واسط در دسترس قرار داد که مقدار رو کنترل کنند
اصولا اگه طراحی ابجکت درست انجام بشه خیلی کم پیش می یاد که یه عضو داده ای به صورت عمومی طراحی بشه

oVERfLOW
یک شنبه 02 مهر 1385, 13:42 عصر
سلام

خوبید؟
اصلا خبر دارید موضوع تاپیک چیه؟

خداحافظ

Arash_j13
یک شنبه 02 مهر 1385, 21:27 عصر
سلام

فکر کنم شما بی خبر بودید


اگه قرار باشه توی یه شیء فقط از داده استفاده بشه دیگه مخفی بودن چه معنایی می‌ده؟
یه کم فکر کنید بعدش پست بدید
مرسی...

sh_roohani
دوشنبه 03 مهر 1385, 11:12 صبح
سلام،
متن زیر بخش مربوط به توضیح رابطه class و struct از کتاب The C++ Programming Language نوشته Bjarne Stroustrup است:


10.2.8 Structures and Classes [class.struct]
By definition, a struct is a class in which members are by default public; that is,

struct s {... is simply shorthand for

class s { public : ...
The access specifier private : can be used to say that the members following are private, just as
public : says that the members following are public. Except for the different names, the following
declarations are equivalent:

class Date1 {
int d ,m , y ;
public :
Date1 (int dd , int mm , int yy);
void add_year (int n ); // add n years
};
struct Date2 {
private:
int d ,m , y ;
public:
Date2 (int dd , int mm , int yy );
void add_year (int n ); // add n years
};
Which style you use depends on circumstances and taste. I usually prefer to use struct for classes
that have all data public. I think of such classes as ‘‘not quite proper types, just data structures.’’
Constructors and access functions can be quite useful even for such structures, but as a shorthand
rather than guarantors of properties of the type (invariants, see §24.3.7.1).
It is not a requirement to declare data first in a class. In fact, it often makes sense to place data
members last to emphasize the functions providing the public user interface. For example:

class Date3 {
public:
Date3 (int dd , int mm , int yy );
Section 10.2.8 Structures and Classes 235
void add_year (int n ); // add n years
private :
int d ,m , y ;
};
In real code, where both the public interface and the implementation details typically are more
extensive than in tutorial examples, I usually prefer the style used for Date3 .
Access specifiers can be used many times in a single class declaration. For example:

class Date4 {
public :
Date4 (int dd , int mm , int yy );
private :
int d ,m , y ;
public:
void add_year (int n ); // add n years
};
Having more than one public section, as in Date4 , tends to be messy. So does having more than
one private section. However, allowing many access specifiers in a class is useful for machinegenerated
code.

oVERfLOW
دوشنبه 03 مهر 1385, 15:12 عصر
http://barnamenevis.org/forum/showpost.php?p=267318&postcount=1

Armanprogrammer
دوشنبه 03 مهر 1385, 15:27 عصر
اگه قرار باشه توی یه شیء فقط از داده استفاده بشه دیگه مخفی بودن چه معنایی می‌ده؟
یه کم فکر کنید بعدش پست بدید
مرسی...
آقای محترم حرف شما در مورد یک کلاس درسته ولی شما وراثت و نادیده گرفتین شاید داده ای داشته باشیم که بخوایم فقط برای child ها استفاده بشه

هم دانشگاهی
پنج شنبه 21 بهمن 1389, 18:59 عصر
سلام دوستان !

من تمام این تاپیک رو خوندم اما . . .

هنوز هم درست نفهمیدم که چرا با وجود struct از class استفاده میشه ؟!؟!؟:گیج:

آخه اینها که همشون یکی هستند ( فقط پیش فرض ساختار public و پیش فرض کلاس private )

غیر از اینه ؟!؟!؟!؟!

هم دانشگاهی
جمعه 22 بهمن 1389, 08:18 صبح
کسی نبود کمک من کنه ؟!؟!؟!؟:افسرده:

r00tkit
جمعه 22 بهمن 1389, 18:09 عصر
یه بار دیگه سوال رو بپرس تا جواب بدیم از اول نمی شه خوند

هم دانشگاهی
جمعه 22 بهمن 1389, 19:51 عصر
همون سوال منو میخوندی دیگه :


هنوز هم درست نفهمیدم که چرا با وجود struct از class استفاده میشه ؟!؟!؟:گیج:

آخه اینها که همشون یکی هستند ( فقط پیش فرض ساختار public و پیش فرض کلاس private )

غیر از اینه ؟!؟!؟!؟!

Salar Ashgi
جمعه 22 بهمن 1389, 23:09 عصر
باید خدمتتون عرض بشه که Struct یک حالت خیلی خلاصه شده از Class هست در حالیکه یک Class امکانایی بسی بیشتر از Struct دارد .
یک ساختار در واقع بیشتر برای این تعریف میشود که مثلا یک نوع داده ای دلخواه مثلا نوع داده ای دانشجو ( که متشکل از یکسری نوع های داده ای
از جمله : آرایه جهت نگهداری اسم ، متغیر جهت نگهداری معدل و ...) تعریف بشود . حال آنکه یک Class مفهومی بالاتر از این را دارد :


تمامی اصول و روابط شی گرایی برای کلاسها طراحی شده اند از جمله : Polymorphism , Inheritance , Operator Overloading , ...
یک Struct بیشتر شبیه یک نوع داده ای است که متشکل از یکسری نوع های داده ای دیگر است ولی یک Class در بردارنده Object ای است با کلی ویژگی
و ...

پیشنهاد میکنم حتما به کتاب مراجعه کرده تا به تفصیل متوجه این تفاوت بشوید ، هرچند که این موضوع چندبار هم در تالار بحث شده است .

موفق باشید ./

هم دانشگاهی
شنبه 23 بهمن 1389, 06:04 صبح
آخه خب ارث بری هم که روش کار میکنه ! داخلش میشه متد ( تابع ) هم تعریف کرد !

پس فرقش با class چیه ؟!

واقعا نمیفهمم !

هم دانشگاهی
شنبه 23 بهمن 1389, 14:06 عصر
شما که جواب نمیدین ب؟ لااقل این رو بگین :

آیا میشه از یک struct مشتق گرفت ؟