ویژگی های جدید C++ 11:بخش دوم
override
جهت خوانایی برنامه از این پس هنگام تعریف توابع مجازی در کلاس های که از کلاس پایه مشتق شده اند با استفاده از override مشخص می گردانیم که این تابع به صورت مجازی تعریف شده است و در کلاس پایه یک کلاس مشابه تعریف شده است .همچنین به کامپایلر تفهیم می شود که در کلاس پاییه باید همچین تابعی به این صورت تعریف شده باشد و در غیر این صورت با ارور کامپایلر اشتباه را اعلان می کند .
به عنوان مثال در استاندارد قدیم
struct Base { virtual void some_func(float); }; struct Derived : Base { virtual void some_func(int); };
هیچ مشکلی ایجاد نمی کرد و هنگام فراخوانی کلاس Derived::some_func تابعی که در کلاس پایه تعریف شده است برخلاف انتظار برنامه نویس فراخوانی نخواهد شد و به صورت یک سربار گذاری در نظر گرفته خواهد شد.
که در استاندارد جدید این مشکل برطرف گردیده
struct Base { virtual void some_func(float); }; struct Derived : Base { virtual void some_func(int) override; // ill-formed - doesn't override a base class method };
Lambda
این نوع توابع که در اکثر زبان های مدرن امروزی موجود هستند می توانند ابزار جالبی برای برنامه نویسی و ایجاد توابع دم دستی باشد .در استاندارد جدید این نوع توابع که از نوع std::function هستند را می توان مورد استفاده قرار داد .
در مثال زیر یک تابع برای بدست اوردن سری فیبوناپی به این روش تعریف شده است
std::function<int(int)> lfib = [&lfib](int n) {return n < 2 ? 1 : lfib(n-1) + lfib(n-2);};
شیوه کلی تعریف به این صورت است
[capture](parameters)->return-type {body}
capture : مشخص کننده نام مورد نظر است
parameters : پارامتر های ورودی
return type: نوع بازگشتی
و دستورات بدنه نیز در داخل {} جای خواهند گرفت
مثال زیر نحوه استفاده از این نوع توابع را بازگو می کند که کل عناصر یک آرایه را به شکل بزرگ آن تبدیل می کند
int main() { char s[]="Hello World!"; int Uppercase = 0; //modified by the lambda for_each(s, s+sizeof(s), [&Uppercase] (char c) { if (isupper(c)) Uppercase++; }); cout<< Uppercase<<" uppercase letters in: "<< s<<endl; }