C ++ 0xおよび初期化問題の解決

C ++ 0x Habréの記事はすでにC ++ 0x標準、特にラムダ式を扱っています。 C ++で行われるいくつかの変更と追加について書きたいと思いました。 そして、さらに苦労せずに、すぐにポイントに。


整数変数の初期化


C ++ 0xは、基本実数型を整数型にキャストする問題を解決します。 最も単純な例では、次のようになります。

クラシックC ++:

int a = 7.3; // int
void func( int );
func(5.6); //



C ++ 0xでは、{}に新しいコンストラクトを導入することで問題が解決します。

int x1 = {7.3}; // -
double d = 7;
int x2 {d}; // ,
char x3{7}; //
vector< int > vi = { 1, 2.3, 4, 5.6 }; // ,



コンストラクターの委任


C ++では、ほぼ同じアクションを実行するか、追加の関数を使用するには、2つのコンストラクターが必要です。

クラシックC ++:

class X
{
int a;
validate( int x)
{
if (0<x && x<=max) a=x;
else throw bad_X(x);
}

public :
X( int x) // int
{
validate(x);
}

X() // -
{
validate(42);
}

X( string s) // string
{
int x = lexical_cast< int >(s);
validate(x);
}
// ...
};



C ++ 0xでは、1つのコンストラクターを別のコンストラクターのコンテキストで宣言できます。

class X
{
int a;

public :

X( int x) // int
{
if (0<x && x<=max) a=x;
else throw bad_X(x);
}

X() :X{42} { } // -

X( string s) :X{lexical_cast< int >(s)} { } // string

// ...
}



ヌルポインター



標準C ++では、nullポインターは通常の0です。ライブラリーでは、#define NULL 0を見つけることができます。C++ 0xでは、特別なリテラルnullptrが導入されています。

使用例:

char * p = nullptr;
int * q = nullptr;
char * p2 = 0; // -

void f( int ); // int
void f( char *); // char*

f(0); // f(int) -
f(nullptr); // f(char*) -

void g( int );
g(nullptr); //: nullptr int
int i = nullptr; //



おわりに


もちろん、変更は表面的なものですが、言語をより安全で便利なものにします。そして最も重要なことは、ラムダ式ほど極端に見えないことです)。

続行するには...

プログイット

Source: https://habr.com/ru/post/J69313/


All Articles