記事ディレクトリ
C++ の利点
C++ は C 言語と比較して多くの利点があります。ここでは最初に例を示し、後ほど補足します。
名前空間の問題のトラブルシューティング
まずこのコードを見てください。
#include <stdlib.h>
#include <stdio.h>
int rand = 0;
int main()
{
printf("%d", rand);
return 0;
}
上記のコードはコンパイルされて合格しますか? 明らかにそうではありません。その理由は、rand 関数がヘッダー ファイル stdlib に含まれているため、変数を定義するときに rand を変数として使用できなくなっているためです。
将来エンジニアリング プロジェクトを作成する場合、特定のヘッダー ファイルをインクルードした後、コード内の多くの変数が使用できなくなるなど、C 言語の制限の一部を反映して、このような状況が頻繁に発生するでしょう。
C++ では、この問題を C 言語に基づいて非常によく改善しており、名前空間の概念を導入し、特定の空間内で変数に名前を付けることで、この問題をうまく解決できます。
ネームスペースの定義は非常に自由で、変数、関数、構造体、さらにはネストされた定義も定義できます。
namespace zbh
{
//定义变量
int test = 0;
//定义函数
int Add(int x, int y)
{
return x + y;
}
//定义结构体
struct MyStruct
{
int a;
int b;
};
//命名空间可以嵌套
namespace free
{
int print1()
{
return 1;
}
}
}
名前空間はどのように使用されますか? C++ は名前空間の独立性をどのように保証しますか?
- 変数を使用する場合は別途指定してください
- 前の定義では、名前空間内の関数または変数が使用されています。
- 直接展開する
#include <stdio.h>
namespace zbh
{
//定义变量
int test = 0;
//定义函数
int Add(int x, int y)
{
return x + y;
}
//定义结构体
struct MyStruct
{
int a;
int b;
};
//命名空间可以嵌套
namespace free
{
int print1()
{
return 1;
}
}
}
using zbh::Add;
int main()
{
printf("%d\n", zbh::test);
printf("%d\n", Add(1,2));
printf("%d", zbh::free::print1());
}
上記の名前空間の定義は省略することもでき、main 関数の前に追加するだけです。
using namespace zbh;
以下の関数内で直接利用することができ、関数名前空間の独立性が実現されます。
上記は2023.7.17の学習収入です
デフォルトパラメータ
C++ では、関数パラメータのデフォルト パラメータが定義されています。関数パラメータのメンバーに初期値を割り当てた場合、後続の呼び出しのプロセスで関数にパラメータを渡さない場合、関数は次の値を使用することがわかります。デフォルトのパラメータ
具体例としては以下のようなものが挙げられます
#include <iostream>
using namespace std;
void f(int a = 10, int b = 20, int c = 30)
{
cout << a << " " << b << " " << c << endl;
}
int main()
{
f();
f(1);
f(1, 2);
f(1, 2, 3);
return 0;
}
実行結果は次のとおりです。
このような操作の実際の効果は何ですか? ?
シーケンス テーブルを定義する際に、動的に開発されたシーケンス テーブルを使用します。そのため、初期化フェーズ中のいくつかのステップを最適化するためにデフォルトのパラメーターを使用できますか?
まずはC言語の実装過程のメソッドを見てみよう
#include <stdio.h>
#include <stdlib.h>
typedef int SLDataType;
typedef struct Seqlist
{
SLDataType* a;
int size;
int capacity;
};
void SeqlistInit(Seqlist* s)
{
s->a = (SLDataType*)malloc(sizeof(SLDataType) * 4);
s->size = 0;
s->capacity = 4;
}
このような実装では実際には容量を書き込みきってしまうので、どれだけ大きなシーケンステーブルをオープンしても、まず容量4のシーケンステーブルをオープンしてから容量を拡張することになり、容量拡張に使用するreallocが消費されてしまいます。
しかし、デフォルトのパラメータを使用してこの関数を実装すると、多くの部分を最適化できると仮定します。
#include <iostream>
using namespace std;
typedef int SLDataType;
typedef struct Seqlist
{
SLDataType* a;
int size;
int capacity;
}Seqlist;
void SeqlistInit(Seqlist* s,int capacity=4)
{
s->a = (SLDataType*)malloc(sizeof(SLDataType) * capacity);
s->size = 0;
s->capacity = capacity;
}
int main()
{
Seqlist sq,sl;
SeqlistInit(&sl);
SeqlistInit(&sq, 100);
return 0;
}
モニタリングを呼び出して、次のことが確認できることを観察します。
デフォルトのパラメータを使用すると、必要な容量を自由に決定できるようになりました。