C++ の基本文法 - 型インジケーター auto および null ポインター nullptr

まえがき: この記事の焦点は 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: ご不明な点がございましたら、お気軽にコメント欄にメッセージを残してください。記載内容に誤りがある場合は、コメント欄でご指摘ください。ブロガーが作成します。見たらすぐに修正。最後に、作成するのは簡単ではありませんが、友人に役立つ場合は、ブロガーに「いいね」や注目を与えたいと思います。
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_73390155/article/details/132225688