עבור לתוכן
View in the app

A better way to browse. Learn more.

HWzone

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

שאלה פשוטה ב- C++

Featured Replies

פורסם

אני לומד עכשיו C++.

נתקלתי בדבר מוזר כזה:

http://cplus.eitan.ac.il/main.php?id1=3&id2=3&id3=3&id4=1

Sub(int a, int b, int c): 
Base1(a), Base2(b), z(c) {}

איך זה ייתכן שמכניסים ערך ל-z בצורה כזאת:

z(c)

הרי z הוא לא פונקציה. זה נכון בכלל מה שהם עשו? ובאיזה מקרים משימים ערך ל- z בצורה כזאת וממה זה שונה מ- z=c ?

פורסם

שאתה יוצר משתנה יש לו ערך התלחלתי שהוא לרוב ג'יבריש...

אתה יכול ליצור כל משתנה עם ( ערך התחלתי ) ועם קיים CTOR שמתאים לזה הוא ייצור אותו עם הערך הזה.

זה תכף גם למשתנים בסיסים כמו INT.

נגיד יש לך CLASS C ובתוכו משתנה CHAR * שיכיל בעתיד מחרוזת, ונגיד שאתה רוצה לאתחל אותו ל-NULL שלא יהיה לך בעיות איתו, אז אתה יכול לכתוב


class alon
{
alon () : pChar ( NULL ) {}
char *pChar;
};

מקווה שלא סיבכתי אותך.

\עריכה

חשוב לכתוב את הסדר של אתחול המשתנים לפי הסדר שהם כתובים ב-CLASS, יש קומפיילרים שלא אוהבים את זה אחרת :) ( לא קריטי לכתיבה ב-VISUAL STUDIO ).

פורסם
  • מחבר

נוקודתיים בעצם מחליפים { } ?

והמבנה שבה צריך לכתוב אחרי נקודתיים הוא שונה מאשר {}. והשמה למשתנים מתבצעת כמו קריאה לפונקציות?

פורסם

לא לא


class alon
{
private:
int a, b, c;
public:
alon ( int value ) : a ( value ), b ( 0 )
{
c = a - b;
}
};

אומר שאתה בונה CLASS שדורש שאתה בונה אותו ערך ( VALUE ), ושהוא מאותחל, הוא שם אותו ב-A.

ב-B הוא שם 0

ב-C הוא שם את החיסור שלהם, שיצא בעצם VALUE...

זה לא קשור לפונקציה... זה בעצם כמו =, זה רק משתמש ב-CTOR של המשתנה ולא ב-COPY CTOR, אתה תלמד את זה בהמשך... תחשוב על זה כהשמה של הערך ישירות (ישר שהוא נוצר )

פורסם

הקוד הבא:

class C
{
private:
int a;
public:
C(int value) : a(value)
{
}
};

כמעט זהה לקוד הבא:

class C
{
private:
int a;
public:
C(int value)
{
a = value;
}
};

מה בכל זאת ההבדל?

במקרה השני, ה-ctor קודם כל יוצר את C (ושם ב-a ערך ברירת מחדל, שהם פשוט מה שהיה קודם בזכרון, כלומר ערך לא מוגדר), ואחר כך שם ב-a את value.

במקרה הראשון, ה-ctor שם את value ב-a כבר בזמן שהאובייקט נוצר.

למה זה טוב?

נניח שיש לך את הקלאס הבא:

class myClass
{
private:
int x;
public:
myClass(int value)
{
x = value;
}
};

שים לב שלקלאס אין בנאי ברירת מחדל, כלומר אי אפשר להצהיר עליו ככה:

myClass a;

אלא חייבים ככה:

myClass a(5);

(כשכמובן במקום 5 יכול לבוא כל int)

עכשיו, נניח שיש לך קלאס כזה:

class OtherClass
{
private:
MyClass c;
public:
OtherClass(int value)
{
c = MyClass(value);
}
};

כלומר OtherClass מחזיק בתוכו אובייקט מטיפוס MyClass, והוא מאתחל אותו ב-ctor. קוד כזה לא יתקמפל. למה? כי הקומפיילר מנסה לאתחל את c באמצעות ה-ctor הדיפולטי שלו (לפני הכניסה בכלל ל-ctor של OtherClass) - אבל הוא לא יכול, כי אין כזה. לכן, חייבים לאתחל את c לפני שמאתחלים את OtherClass:

class OtherClass
{
private:
MyClass c;
public:
OtherClass(int value) : c(value)
{
}
};

קפיש?

פורסם
  • מחבר

תודה רבה על הסברים המושקעים.

אבל יש לי בעייה אחת המונעת ממני להבין. מה זה ctor?

ויש לי עוד שאלה private: רושמים כאשר ניתן לקרוא למשתנה / פונקציה רק מתוך פונקצית חבר מאותו ה- class?

ורושמים public: כשניתן לקרוא מכל מקום?

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.