1 min. read

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 מביאה איתה מלא חידושים!
התכונה הזו נראת קטנה אבל אתחול אינדיקטיבי ייעזור לנו למנוע באגים באתחול שגוי!

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


אהבתם? מוזמנים להביע תמיכה כאן: כוס קפה