ورود

View Full Version : آموزش: ویژگی های C++‎‎‎‎‎‎‎‎‎‎‎‎‎‎11



sourcecode
چهارشنبه 03 اردیبهشت 1393, 19:41 عصر
خیلی وقت هست آخرین نسخه ++C با نام 11++C منتشره شده است .در این نسخه ویژگی های زیادی به این زبان اضافه شده که توی این تایپک قراره به معرفی این ویژگی ها بپردازیم .
قبل از شروع این را اضافه کنم که برای کامپایل کدها از کامپایلر gcc 4.8.1 در سیستم عامل فدورا استفاده می کنم .

در 11 C++‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎‎‎‎‎‎‎‎‎‎‎‎ شش نوع داده ایی معرفی شده است.که البته با بعضی هاشون قبلاً آشنایی ممکنه داشته باشید

long long و unsigned long long

در استاندارد قبلی ما نوع long را داشتیم که تعداد بایت های متغییری که از نوع این تعریف می شود در سیستم عامل های مختلف می توانست 32 یا 64 بیتی باشد.
اما نوع long long حداقل مقداری که می تواند داشته باشد 8 بایت (64 بیت) است.
مثال:برنامه زیر را در نظر بگیرید.
//================================================== ==========================
// Name : TestProject.cpp
// Author : Khoramsoft.com
//================================================== ==========================

#i​nclude <iostream>
#include <typeinfo>
using namespace std;

int main() {

long long a = 9223372036854775807ll;
long b= 9223372036854775807;
cout << "Type a = "<< typeid(a).name()
<< " Size a = " << sizeof(a)
<< " a= " << a << endl;

cout << "Type b = "<< typeid(b).name()
<< " Size b = " << sizeof(b)
<< " b= " << b << endl;
return 0;
}

خروجی:


Type a = x Size a = 8 a= 9223372036854775807
Type b = l Size b = 4 b= -1


eclipse یک هشدار در مورد overflow در مورد متغیر b نیز میدهد.

نوع دیگر C++‎‎‎‎‎‎‎‎‎‎‎‎‎‎11 نوع unsigned long long ‌که همانند سایر نوع های بدون علامت است .


char16_t و char32_t


برای استفاده از استاندارهای یونیکد 16 بیتی و 32 بیتی از این دو نوع جد می توانیم استفاده کنیم .

#include <iostream>
using namespace std;

int main() {

char16_t uch1 = u\'貇\';
char32_t uch2 = U\'م\';
cout << "size uch1= " << sizeof(uch1) << " "
<< "size uch1= " << sizeof(uch2) <<endl ;
cout << uch1 <<" " << uch2 << endl ;
return 0;
}


خروجی :



size uch1= 2 size uch1= 4
35975 1605

می دانیم که نوع char نیز می تواند یک نوع int باشد چرا؟ با توجه به همین موضوع وقتی از cout برای نمایش محتویات دو متغیر uch1 و uch2 استفاده می کنیم آنها را به صورت عدد در خروجی می بینیم.
قبل از مقدار دادن به متغیرهای نوع char16_t از u (کوچک) و متغیرهای نوع char32_t از U(بزرگ) استفاده می کنیم.
نکته:در استاندارد جدید برای استفاده از utf8 از همان نوع char استفاده می کنیم وقبل از رشته u8 را به کار می بریم.

char ch = u8"Game development";



auto
در بعضی از زبان های برنامه نویسی برای تعریف یک متغیر نیاز به اعلان صریح نوع آن متغیر نیست مانند زبان PHP به طور مثال :


$data = 64.05;

این متغیر با توجه به اینکه مقدار آن اعشاری است نوع آن توسط مفسر یا کامپایلر زبان PHP اعشاری در نظر گرفته می شود یا:


$MyString = "String";


نوع این متغیر رشته ایی در نظر گرفته می شود .اگر به دو مثال قبل توجه کرده باشید برای تعیین یک متغیر در PHP قبل از هر متغیر از علامت $ استفاده شده است.(هرچند به شخصه چنین ویژگی رو به صورت استفاده گسترده مانند زبان PHP نمی پسندم چون سردرگمی زیادی در کدها به وجود می آید.ولی در زبان C++‎‎‎‎‎‎‎‎‎‎‎‎‎‎ به خوبی میشه از این ویژگی در کنار سایر نوع ها بهره برد.) در استاندارد جدید ++C نیز علاوه بر نوع های داده ایی صریح موجود این ویژگی نیز به زبان افزوده شده است که متغیری تعریف کنیم که کامپایلر با توجه به محتویات آن نوع را مشخص کند برای این ویژگی از کلمه کلیدی auto استفاده می کنیم
مثال:

#include <iostream>
#include <typeinfo>
using namespace std;

int main() {

auto a = 5 ;
auto str = "khoramsoft.com";
auto p = 3.14 ;
auto MyPI = &a ;
auto MyPD = &p ;
cout << "type a = " << typeid(a).name() << endl ;
cout << "type str = " << typeid(str).name() << endl ;
cout << "type p = " << typeid(p).name() << endl ;
cout << "type MyPI = " << typeid(MyPI).name() << endl ;
cout << "type MyPD = " << typeid(MyPD).name() << endl ;
return 0;
}


خروجی :
type a = i
type str = PKc
type p = d
type MyPI = Pi
type MyPD = Pd

همانطور که می بینید کامپایلر برای هر متغیر با توجه به مقدار متغیر نوع آن را مشخص کرده است.

int= i
const char*= PKc
double*= Pd
int*= Pi
نکته1:کلمه کلیدی auto قبلاً در زبان ++C وجود داشته و در استاندارد جدید بکارگیری آن به شکل قدیم توسط کامپایلر خطا گرفته می شود.

auto int a = 4 ;


نکته2:با توجه به اینکه نوع متغیری که با auto تعریف می شود توسط مقدار متغیر تعیین می شود بنابراین بایستی متغیر در همان ابتدا مقدار دهی اولیه گردد.

auto p ;

هر دو مثال بالا توسط کامپایلر خطا گرفته می شوند.

decltype
decltype در واقع همانند auto نوع جدید محسوب نمی شوند بلکه کلمات کلیدی هستند که اختیاراتی در مورد نوع های مختلف به ما می دهند.
به مثال های قبلی نگاه کنید.هربار که می خواهیم نوع یک متغیر را بررسی و نمایش دهیم از typeid استفاده می کنیم اما کار خاصی نمی توانیم با نوع به دست آمده یک متغیر انجام دهیم اما در ++C جدید با استفاده از decltype می توانیم علاوه بر تعیین نوع یک متغیر از آن نیز استفاده کنیم و متغیرهایی بر حسب نوع متغیرهای دیگر تعریف کنیم.
مثال:

//================================================== ==========================
// Name : TestProject.cpp
// Author : Khoramsoft.com
//================================================== ==========================

#i​nclude <iostream>
#include <typeinfo>

using namespace std;

int main() {

auto str = "khoramsoft.com";
decltype(str) a = "Game development";

cout<< "Type str= " << typeid(str).name() << " " << "Type a= " << typeid(a).name() << endl ;

return 0;
}


خروجی:
Type str= PKc Type a= PKc

یک مثال جالب:

//================================================== ==========================
// Name : TestProject.cpp
// Author : Khoramsoft.com
//================================================== ==========================

#i​nclude <iostream>
#include <typeinfo>

using namespace std;

double f(double a , int b)
{
return a*b;
}

int main() {

auto Myint = 5 ;
decltype(f(5.7,6)) b = 6 ;
decltype((Myint)) a = Myint ;


cout<< "Type Myint= " << typeid(Myint).name() << " " << "Type a= " << typeid(a).name() << endl ;
cout<< "Type b= " << typeid(b).name() << endl ;
cout<< "Myint= " << Myint << " "
<< "b= " << b << " "
<< "a= " << a << endl ;

b++ ;
Myint = 11 ;

cout<< "Myint= " << Myint << " "
<< "b= " << b << " "
<< "a= " << a << endl ;
return 0;
}


خروجی :
Type Myint= i Type a= i
Type b= d
Myint= 5 b= 6 a= 5
Myint= 11 b= 7 a= 11

منبع (http://www.forum.khoramsoft.com/thread-837.html)