یکی از مهمترین ویژگیهای ++C کارایی و سرعت آن است، اما این امر بخوبی میسر نخواهد شد مگر آنکه ما نیز به عنوان برنامهنویس نقش خود را به درستی ایفا کنیم.
امروز میخواهیم یکی از رایجترین اشتباهات برنامهنویسان ++C (بخصوص برنامهنویسانی که از زبان دیگری به این زبان روی آوردهاند) را به هنگام ایجاد کانستراکتور یک کلاس تشریح کنیم. فرض کنید کلاسی به نام شخص (Person) داریم که Member Variableهای آن عبارتند از: نام(firstname)، نام خانوادگی (lastname) و سن (age).
این کلاس را به صورت زیر مینویسیم:
class Person
{
private:
std::string firstname;
std::string lastname;
int age;
public:
Person (std::string pFirstname, std::string pLastname, int pAge)
{
firstname = pFirstname;
lastname = pLastname;
age = pAge;
}
};
شما کد را کامپیایل و اجرا میکنید، هیچ خطا یا هشداری داده نمیشود و کد هم به درستی و بدون کوچکترین مشکلی اجرا میشود. اما اگر این نمونه کد را به یک برنامهنویس خبره در زبان ++C نشان دهید به شما خواهد گفت این کد درست نیست.
اون موقع هست که از خودتون میپرسید وقتی کد داره به درستی اجرا میشه مشکل من کجاست؟
اجازه دهید از دیدگاه ماشین کد را بررسی کنیم تا ببینیم کجای کار ما اشتباه است.
پس از ایجاد یک شی از کلاس Person، کانستراکتور آن اجرا میشود. اکنون به محض رسیدن کد به } (براکت باز شده) متغیرهای محلی ما که از نوع string هستند با مقدار خالی مقدار دهی اولیه میشوند، سپس در خطوط بعد بلافاصله این متغیرها با مقادیر pFirstname و pLastname مجدداً مقداردهی میشوند. پس ما دوبار متغیرهای string خود را مقداردهی کردهایم. (در مورد متغیر int به دلیل اینکه با تعریف شدنشان مقداردهی اولیه نمیشوند مشکل مقداردهی مجدد را نداریم.)
فرض کنیم Initialize کردن یک شی از نوع string بسیار هزینه بر باشد (که البته در واقعیت و در مورد string اینگونه نیست) و با هر بار مقداردهی زمان زیادی تلف شود، پس چرا باید یکبار آنرا با مقدار خالی مقداردهی کنیم و بلافاصله مجدداً به آن مقدار دیگری بدهیم؟
این دقیقاً مشکل این کد است که اغلب توسط برنامهنویسانی که از زبان دیگری به این زبان کوچ کردهاند انجام میشود، چرا که در زبانهای دیگر تنها راه همین است.
شیوه صحیح مقداردهی اولیه Member Variableها در کانستراکتور یک کلاس استفاده از Initializer Syntax است. انجام اینکار بسیار ساده بوده و با استفاده از تک کاراکتر : بشکل زیر انجام میشود:
class Person
{
private:
std::string firstname;
std::string lastname;
int age;
public:
Person (std::string pFirstname, std::string pLastname, int pAge)
: firstname(pFirstname), lastname(pLastname), age(pAge)
{}
};
اکنون با اجرای کانستراکتور، بجای اینکه متغیرها ابتدا با مقدار خالی مقدار دهی شوند یک ضرب با مقداری که توسط پارامترهای تابع سازنده فراهم شده است مقداردهی میشوند و مشکل دوبار مقداردهی را نخواهیم داشت.
نتیجه گیری:
زمانی که مقداردهی یک کلاس هزینه بر باشد، استفاده از Initializer Syntax یکی از راههایی است که باعث میشود نرمافزار شما سریعتر عمل کند.
گرچه مقداردهی string چندان هزینهبر نیست، اما تمرین خوبی است که حتماً کدهای خود را با استفاده از این سینتکس بنویسید. ما در اینجا تنها مثال سادهای زدیم تا شما را با این قابلیت ++C و علت استفاده از آن آشنا کنیم.
اگر به سورس کدهای موجود در اینترنت نیز نگاه کنید، مطمعناً با کانستراکتورهایی که با استفاده از Initializer Syntax متغیرهای خود را مقداردهی میکنند بسیار زیاد برخورد خواهید کرد، چرا که شیوه صحیح مقداردهی اولیه Member Variableها توسط یک کانستراکتور در زبان ++C به این شکل است.