C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C ++のnullptrとは正確には何ですか?


このセクションでは、C++のnullptrを確認します。 nullptrは、ポインタリテラルを示します。これは、タイプstd::nullptr_tのprvalueです。 nullptrから任意のポインタ型および任意のメンバー型へのポインタのnullポインタ値への暗黙の変換プロパティがあります。この概念を理解するために、1つのプログラムを見てみましょう。

#include<iostream>
using namespace std;
int my_func(int N){ //function with integer type parameter
   cout << "Calling function my_func(int)";
}
int my_func(char* str) { //overloaded function with char* type parameter
   cout << "calling function my_func(char *)";
}
int main() {
   my_func(NULL); //it will call my_func(char *), but will generate compiler error
}

出力

[Error] call of overloaded 'my_func(NULL)' is ambiguous
[Note] candidates are:
[Note] int my_func(int)
[Note] int my_func(char*)

では、上記のプログラムの問題は何ですか? NULLは通常、(void *)0として定義されます。 NULLを整数型に変換することができます。したがって、my_func(NULL)の関数呼び出しはあいまいです。

NULLの代わりにnullptrを使用すると、次のような結果が得られます-

#include<iostream>
using namespace std;
int my_func(int N){ //function with integer type parameter
   cout << "Calling function my_func(int)";
}
int my_func(char* str) { //overloaded function with char* type parameter
   cout << "calling function my_func(char *)";
}
int main() {
   my_func(nullptr); //it will call my_func(char *), but will generate compiler error
}

出力

calling function my_func(char *)

NULLが予想されるすべての場所でnullptrを使用できます。 NULLと同様に、nullptrも任意のポインタ型に変換できます。ただし、これはNULLのような整数型に暗黙的に変換できるわけではありません。


  1. C++での範囲の追加

    サイズnの配列があり、それが0で初期化され、値kもあるとすると、k個の更新操作を実行します。各操作はトリプレットとして表されます:[startIndex、endIndex、inc]これはサブ配列A [startIndex ... endIndex](startIndexおよびendIndexを含む)の各要素をincでインクリメントします。 k個の操作がすべて実行された後、変更された配列を見つける必要があります。 したがって、入力が長さ=5、更新=[[1,3,2]、[2,4,3]、[0,2、-2]]のような場合、出力は[-2,0]になります。 、3,5,3] これを解決するには、次の手順に

  2. C++でのラインリフレクション

    2D平面上にn個の点があるとすると、指定された点を対称的に反射するy軸に平行な線があるかどうかを確認する必要があります。つまり、指定された線上にすべての点を反映した後に線が存在するかどうかを確認する必要があります。元のポイントのセットは、反映されたポイントと同じです。 したがって、入力がpoints =[[1,1]、[-1,1]]のような場合 その場合、出力はtrueになります これを解決するには、次の手順に従います- 1つのセットを定義します。 n:=ポイントのサイズ minVal:=inf maxVal:=-inf 初期化i:=0の場合、i <