C言語をベースにしたC++最適化

目次

1. 名前空間

1. 名前空間の定義

2. ネームスペースの使用

2. 入力と出力

3. デフォルトパラメータ

1. デフォルトパラメータの概念

2. デフォルトパラメータの分類

4. 関数のオーバーロード

5. 引用

1. 引用の概念

2.リファレンスの特徴

3. 参照とポインタの違い

6. インライン関数

7. 範囲ベースの for ループ


1. 名前空間

        名前空間は、識別子をローカライズし、名前の競合を回避するために使用されます。

1. 名前空間の定義

        名前空間を定義するには、namespace キーワードを使用し、その後に名前空間の名前、その後に {} のペアを続ける必要があります。ここで、{} は名前空間のメンバーです。

        (1) 名前空間で変数/関数/型を定義可能

//命名空间
namespace lbj
{
	//定义变量
	int rand = 10;
	//定义函数
	int Add(int left, int right)
	{
		return left + right;
	}
	//定义类型
	struct Node
	{
		struct Node* next;
		int val;
	};
}

        (2) 定義内で名前空間を入れ子にできる

//2.命名空间的嵌套
namespace lbj
{
	int a;
	int b;
	int Add(int left, int right)
	{
		return left + right;
	}
	namespace lbj_1
	{
		int c;
		int d;
		int Sub(int left, int right)
		{
			return left - right;
		}
	}
}

        (3) 同じプロジェクト内に同じ名前を持つ複数の名前空間が存在することが許可され、コンパイラは同じ名前を持つすべての名前空間を 1 つの名前空間に自動的にマージします。名前空間は新しいスコープを定義し、名前空間内のすべてはその名前空間に制限されます。

2. ネームスペースの使用

        ネームスペースを使用するには、次の 3 つの方法があります。

        (1)、名前空間名を追加し、修飾子を適用します。

lbj::a

        (2) using を使用して名前空間のメンバーを導入します

using lbj::a;

        (3) using 名前空間 + 名前空間名を使用して導入する

using namespace lbj;

2. 入力と出力

        C++ の入力と出力は cin と cout で、cin は標準入力オブジェクト、cout は標準出力オブジェクトです。使用する場合は、ヘッダー ファイル <iostream> をインクルードし、名前空間の使用方法に従って std を使用する必要があります。 。

        cin と cout は変数の型を自動的に識別できるため、形式を手動で制御する必要はありません。

#include<iostream>
using namespace std;
int main()
{
	int a;
	double b;
	char c;

	//可以自动识别变量类型
	cin >> a;
	cin >> b >> c;

	cout << a << endl;//endl表示换行输出
	cout << b << " " << c << endl;

	return 0;
}

3. デフォルトパラメータ

1. デフォルトパラメータの概念

        デフォルトパラメータは、関数を宣言または定義するときに、関数のパラメータのデフォルト値(つまり、デフォルト値)を指定します。この関数を呼び出すとき、実パラメータが指定されていない場合は仮パラメータのデフォルト値が使用され、それ以外の場合は指定された実パラメータが使用されます。

#include<iostream>
using namespace std;
void Func(int a = 0)
{
	cout << a << endl;
}
int main()
{
	Func();		//没有传参,使用参数的默认值(缺省值)
	Func(10);	//传参,使用指定的实参
	return 0;
}

2. デフォルトパラメータの分類

        (1) すべてのデフォルトパラメータ: すべてのパラメータにデフォルト値が設定されています

//全缺省参数
void Func(int a=1,int b=4,int c=7)

        (2) セミデフォルトパラメータ:一部のパラメータにはデフォルト値が設定されています

//半缺省参数
void Func(int a, int b, int c = 7)

        注: 準デフォルト パラメータは、右から左に隙間なく連続して指定する必要があります。デフォルト パラメータは、関数宣言と関数定義に同時に指定することはできません。通常、これらは関数定義ではなく関数宣言で設定されます。デフォルト値は定数またはグローバル変数である必要があります

4. 関数のオーバーロード

        C++ では、同様の関数を持つ同じ名前の複数の関数を同じスコープ内で宣言できます。同じ名前のこれらの関数には、異なる仮パラメータ リスト (パラメータまたはパラメータの型の数、またはパラメータの型の順序) があります。これは、次の目的でよく使用されます。同様の関数と異なるデータ型の問題を解決します。関数のオーバーロードとは、関数名は同じですが、パラメーターが異なることを意味します。

        パラメータのタイプが異なります。

//1.参数类型不同
int Add(int left, int right)
{
	return left + right;
}
double Add(double left, double right)
{
	return left + right;
}

        パラメータの数が異なります。

//2.参数个数不同
void f()
{
	cout << "f()" << endl;
}
void f(int a)
{
	cout << "f(int a)" << endl;
}

        パラメータのタイプの順序は異なります。

//3.参数类型的顺序不同
void f(int a, char b)
{
	cout << "f(int a, char b)" << endl;
}
void f(char a, int b)
{
	cout << "f(char a, int b)" << endl;
}

        C++ は関数のオーバーロードをサポートしていますが、C 言語は関数のオーバーロードをサポートしていません。これは、C++ では関数変更ルールを使用して、同じ名前の関数を区別するためです。関数のパラメーターが異なる限り、変更された名前も異なるため、オーバーロードはサポートされています。 , 一方、C 言語は同じ名前の関数を認識できないため、関数のオーバーロードはサポートされていません。同じ名前の 2 つの関数のパラメータが同じで、戻り値のみが異なる場合、それらはオーバーロードできません。関数のオーバーロードの鍵は戻り値ではなく、関数のパラメーターであることに注意してください。

5. 引用

1. 引用の概念

        参照は、既存の変数の別名です。参照変数とそれが参照するエンティティ変数はメモリ空間を共有するため、コンパイラは参照変数用に新しいメモリ空間を開く必要はありません。

        type +& + 参照変数名 = 参照エンティティ

void test()
{
    int a=10;
    int& ra=a;//引用变量ra是a的别名
}

2.リファレンスの特徴

        (1) 参照は定義時に初期化する必要があります。

        (2) 変数は複数の参照を持つことができます。

        (3) 参照がエンティティを参照すると、他のエンティティを参照することはできません。

        (4) 引用された権限はパンしたり縮小したりできますが、拡大することはできません。

        (5) 参照は関数のパラメータとして使用されており、仮パラメータを変更すると実パラメータも変更されます。参照は文法概念におけるエイリアスであり、参照するエンティティと同じ高速メモリ空間を共有しますが、基礎となる実装では、参照はポインタの形式で実装されます。

        (6) 戻り値として参照が使用されます。関数が戻っても、関数のスコープに加えて、戻り値のオブジェクトがまだ存在する (関数が 1 回だけ実行されている) 場合、戻り値に参照を使用できます。戻りオブジェクトがシステムに返された (関数が複数回実行された) 場合、値による戻りを使用する必要があり、参照による戻りは使用できなくなりました。

3. 参照とポインタの違い

        (1) リファレンスは変数のエイリアスであり、ポインタは変数のアドレスを格納します。

        (2) 参照は定義時にポインタではなく初期化する必要があります。

        (3) 参照がエンティティを参照した後は、他のエンティティを参照することはできず、ポインタはいつでも同じ型のエンティティを指すことができます。

        (4) null 参照はなく、null ポインタが存在します。

        (5) 参照自己インクリメントは、参照されるエンティティが 1 増加することを意味し、ポインタ自己インクリメントは、ポインタが型のサイズだけ後方にオフセットされることを意味します。

        (6) 参照はポインタよりも比較的安全に使用できます。

6. インライン関数

        inline で変更された関数は、インライン関数と呼ばれます。コンパイル時に、C++ は、インライン関数が呼び出される場所で関数本体を展開します。関数呼び出しのスタック フレームを確立するオーバーヘッドはありません。インライン関数は、プログラムの実行効率を向上させることができます。

        インラインは、スペースを時間と交換する方法です。コンパイル段階で、関数呼び出しが関数本体に置き換えられるため、呼び出しのオーバーヘッドが削減され、プログラムの実行効率が向上しますが、ターゲット ファイルが大きくなる可能性があります。

        インラインはコンパイラーに対する単なる提案および要求であり、コンパイラーはこの要求を無視することを選択できます。一般に、サイズが小さく、再帰的ではなく、頻繁に呼び出される関数はインライン化を使用します。

        インラインでは、接続エラーが発生するため、関数の宣言と定義を分離する (別のファイルを参照する) ことはお勧めしません。

7. 範囲ベースの for ループ

        範囲ベースの for ループは C++11 で導入されました。for ループの後の括弧はコロン ':' で 2 つの部分に分かれており、最初の部分は反復に使用される範囲内の変数、2 番目の部分は反復される範囲です。   

//基于范围的for循环
#include<iostream>
using namespace std;
void test_for()
{
	int arr[] = { 1,3,5,7,9 };
	for (auto& e : arr)
	{
		e *= 2;
	}
	for (auto e : arr)
	{
		cout << e << " ";
	}
	cout << endl;
}
int main()
{
	test_for();
	return 0;
}

         注: 範囲ベースの for ループの continue と Break は、通常のループと同様に使用されます。

おすすめ

転載: blog.csdn.net/libj2023/article/details/132791597