June 28, 2022

C++ - על מבנים ועל צורה חדשה לאתחול מבנים

C++ ידועה בתור שפה שניתן לאתחל ערכים בעשרות דרכים.
אחת מהן שהוסיפו בגרסא ה-20 היא ה- Aggregate Initialization, “אתחול מצטבר”.

דרך אתחול נפוצה היא להשתמש ב- { }.

1
2
3
4
5
6
7
8
9
10
11
struct Person
{
std::string Name;
int Age;
};

int main()
{
Person folder { "Bob", 6 };
return 1;
}

זה מתאחל את המבנה עם שם וגיל - שימו לב שלא יצרנו שום בנאי!
הבנאי נוצר עם סדר המשתנים כפי שהם מופיעים במבנה - זו הסיבה שאם אנחנו משנים את סדר המשתנים גם הסדר בבנאי יישתנה.

כדי להוריד את הסיכוי לבאגים וליצור קוד יותר ברור, בגרסה 20 של cpp הוסיפו צורה חדשה בעזרת שמות:

1
Person folder { .Name = "Bob", .Age = 6 };

כעת נוכל להשתמש בשמות כדי ליצור בצורה חד משמעית את המבנה.
במיוחד כאשר יש לנו מבנים שהם פחות נוחים לשימוש:

1
2
3
4
5
6
7
8
9
10
11
12
struct Configuration
{
bool ApplyChanges;
std::string ServerName;
bool IsExternal;
std::string Permissions;
};

// זה
Configuration config { .ApplyChanges = true, .ServerName="BobsWorld", .IsExternal = false, . Permissions="rw" };
// במקום זה:
Configuration config { true, "BobsWorld", false, "rw" }

עבור מתכנתי C#, בטח כבר זכרתם שזה קיים בשפה בזכות מאפיינים:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Person
{
public string Name { get; set;}
public int Age { get; set;}
}

public static void Main(string[] args)
{
Person f = new Person
{
Name = "Hello",
Age = 6
};
}

ב-cpp לא מאופיין להשתמש במאפיינים.
זו דוגמא פחות טובה:

1
2
3
4
5
6
7
8
9
10
11
12
13
class Person
{
public:

const std::string& GetName() const { return Name; }
void SetName(std::string value) { Name = value; }
int GetAge() const { return Age;}
void SetAge(int value) { Age = value; }

private:
const std::string Name;
const int Age;
};

עדיף להשתמש ב-const value:

1
2
3
4
5
6
7
struct Person
{
const std::string Name;
const int Age;
};

Person p { .Name = "Bob", .Age = 42 };

C++ 20 מביאה איתה מלא חידושים!
התכונה הזו נראת קטנה אבל אתחול אינדיקטיבי ייעזור לנו למנוע באגים באתחול שגוי!

תודה על הקריאה!

על הפוסט

הפוסט נכתב על ידי Ilya, רישיון על ידי CC BY-NC-ND 4.0.

שתפו את הפוסט

Email Facebook Linkedin Print

קנו לי קפה

#Software#Cplusplus#Programming