まえがき: この記事の焦点は 1.
C++ の型インジケーター auto
2. auto によって実装されるスコープ
3. C++ が元の NULL を使用する代わりに nullptr を作成するのはなぜですか。
ワンオート
1. autoの意味と使い方
C++11 では、標準化委員会は auto の意味を次のように与えました: auto はもはやストレージ型インジケーターではありませんが、コンパイラーに指示する新しい型インジケーターとして機能します。auto で宣言された変数はコンパイラーによってコンパイルされる必要があります。取得によって導出。
#include<iostream>
using namespace std;
int main()
{
int a = 10;
auto b = 20;
auto c = 'x';
auto d = 1.1;
//typeid(变量名).name()能够显示变量的类型
cout << typeid(a).name() << endl;
cout << typeid(b).name() << endl;
cout << typeid(c).name() << endl;
cout << typeid(d).name() << endl;、
//auto e; 错误示范,auto变量必须在定义时初始化
return 0;
}
知らせ:auto を使用して変数を定義する場合は、変数を初期化する必要がありますコンパイラーはコンパイル段階で初期化式に基づいて auto の実際の型を推測する必要があるため、 auto は「型」宣言ではなく、型宣言の「プレースホルダー」です。コンパイラーはコンパイル段階でそれを使用します。 auto を変数の実際の型に置き換えます。
2. オート使用時の注意事項
1. 前述のように、変数を定義する際には初期化する必要があります。
2. 行を定義する場合、データは同じ型である必要があります。
3.autoは関数の引数として使用できませんが、
この点はパラメータが初期化されていないため、最初の点と関係します。
4.auto を直接使用して配列を宣言することはできません
3. 対象範囲(ハイライト)
C 言語の for ループのトラバーサルには、C++ のより便利な方法として range for があり、非常に便利です。
int main()
{
int arr1[] = {
1,2,3 };
//C语言写法
for (int i = 0; i < sizeof(arr1) / sizeof(int); i++)
{
cout << arr1[i] << " ";
}
cout << endl;
//C++写法
//1.依次取arr1中数据赋值给x
//2.自动判定结束
//3.自动迭代(编译时编译器替换成迭代器)
for (auto x: arr1)
{
cout << x << " ";
}
return 0;
}
検討の範囲
上記のコードを例として、次のコードを実行すると何が表示されると思いますか?
int main()
{
int arr1[] = {
1,2,3 };
for (auto x: arr1)
{
x = x*2;
}
for (auto x : arr1)
{
cout << x << " ";
}
return 0;
}
実行結果は次のとおりです. データに *2 がないことがわかります. これは、上記のコードは arr1 のデータを取得して x に代入するだけであるためです. x の変更は配列内のデータには影響しません。
では、変わりたい場合はどうすればいいのでしょうか?
答え: はい参照を使用するauto の後に & を追加すると、x が配列内のデータのエイリアスであることを意味するため、x を変更すると配列内のデータも変更されます
。ポインタは使用できませんこれは、ポインタの型が元のデータ型と一致しないためです。
この時点で、C++ の参照の使い方の賢さがわかります。
int main()
{
int arr1[] = {
1,2,3 };
for (auto& x: arr1) //auto后加上&,代表x是数组中数据的别名,这样改变x就会改变数组中的数据
{
x = x*2;
}
/*for (auto* x : arr1) //auto* 类型与arr1数据类型(int)不匹配
{
x = x * 2;
}*/
for (auto x : arr1)
{
cout << x << " ";
}
return 0;
}
Two.nullptr
前回の記事で、C言語には抜け穴が多く、NULLの欠点を補うためにnullptrが誕生したと述べました。
次の例では、関数のオーバーロードを通じて func 関数を構築しています。何が表示されると思いますか?
コード設計の当初の意図によれば、Func(0) は int を出力し、Func(NULL) は int* を出力する必要があります。
void Func(int x)
{
cout << "int" << endl;
}
void Func(int* x)
{
cout << "int*" << endl;
}
int main()
{
Func(0);
Func(NULL);
Func(nullptr);
}
実行結果は次のとおりです。
最初の関数を Func (NULL) が呼び出していることがわかりますが、これは期待された結果と異なります。
これは、C言語にはマクロ定義があり#define NULL 0
、リテラル定数0としてNULLが定義されているためです。
したがって、コードの堅牢性を確保するために、C++ では後に nullptr が作成されました。
記事末尾BB: ご不明な点がございましたら、お気軽にコメント欄にメッセージを残してください。記載内容に誤りがある場合は、コメント欄でご指摘ください。ブロガーが作成します。見たらすぐに修正。最後に、作成するのは簡単ではありませんが、友人に役立つ場合は、ブロガーに「いいね」や注目を与えたいと思います。