C ++:名前空間、デフォルト関数、および関数のオーバーロード


1.名前空間

1.名前空間があるのはなぜですか?

大規模なプログラムでは、独立して開発された複数のライブラリがよく使用されます。これらのライブラリは、クラス、関数、テンプレートなど、多数のグローバル名を定義することがよくあります。アプリケーションが複数のライブラリを使用する場合、特定の名前が互いに競合することは避けられません。グローバル変数に複数のライブラリ名を入れると、名前空間が汚染されます。
名前空間は、名前の競合を防ぐためのより制御可能なメカニズムを提供します。名前空間はグローバル名前空間を分割し、各名前空間がスコープになります。

2.名前空間の定義方法

名前空間は2つの部分で構成されます。最初はキーワード名前空間で、次に名前空間の名前が続きます。名前空間名の後には、中括弧で囲まれた一連の宣言と定義が続きます。
以下に、名前空間の定義方法を簡単に紹介します。

//普通的命名空间
namespace N1
{
    
    
    int a;
    int Fun(int a,int b)
    {
    
    
        return a + b;
    }
}

注:名前空間スコープの後にセミコロンを追加する必要はありません。

//命名空间可以嵌套
namespace N2
{
    
    
    int a;
    int Fun(int a,int b = 0)
    {
    
    
        return a + b;
    }
    namespace N3
    {
    
    
        int b;
        int Fun(double a,int b)
        {
    
    
            return a + b;
        }
    }
}
//在同一个工程中允许存在多个相同的命名空间,编译器最后会合成同一个命名空间中
namespace N1{
    
    
    int Fun(int a,int b)
    {
    
    
        return a + b;
    }
}

namespace N2{
    
    
    int Fun(int a = 1,int b = 2)
    {
    
    
        return a + b;
    }
}

namespace N1{
    
    
    int Fun(double a, double b)
    {
    
    
        return a - b;
    }
}

注:名前空間は新しいスコープを定義し、名前空間のすべてのコンテンツはその名前空間に制限されます。

3.名前空間の使用

//加命名空间名称及作用域限定符
namespace N1
{
    
    
    int a = 10,b = 20;
    int Add(int left,int right)
    {
    
    
        return left + right;
    }
    int Sub(int left,int right)
    {
    
    
        return left - right;
    }
}
int main()
{
    
    
    printf("%d\n",N1 :: a);
    return 0;
}
//使用using将命名空间中的成员引入
namespace N1
{
    
    
    int a = 10,b = 20;
    int Add(int left,int right)
    {
    
    
        return left + right;
    }
    int Sub(int left,int right)
    {
    
    
        return left - right;
    }
}
using N1 :: b;
int main()
{
    
    
    printf("%d\n",N1 :: a);
    printf("%d\n",b);
    return 0;
}
//使用using namespace 命名空间名称引入
namespace N1
{
    
    
    int a = 10,b = 20;
    int Add(int left,int right)
    {
    
    
        return left + right;
    }
    int Sub(int left,int right)
    {
    
    
        return left - right;
    }
}
using namespace N1;
int main()
{
    
    
    printf("%d\n",N1 :: a);
    printf("%d\n",b);
    printf("%d\n",Add(10,20));
    return 0;
}

2、デフォルトのパラメータ

1.デフォルトのパラメータは何ですか?

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

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

using namespace std;
//全缺省参数
void Fun1(int a,int b)
{
    
    
    std::cout << "a = " << a << endl;
    std::cout << "b = " << b << endl;
}

//半缺省参数
void Fun2 (int a,int b = 20)
{
    
    
    std::cout << " a = " << a << endl;
    std::cout << " b = " << b << endl;
}

注:1。準デフォルトパラメータは、右から左に1回指定する必要があり、ランダムに割り当てることはできません。
2.デフォルトのパラメーターは、関数の宣言と定義に同時に表示することはできません。
3.デフォルト値は定数でなければなりません。
4. C言語はデフォルトパラメータをサポートしていません(コンパイラはサポートしていません)。

3、関数のオーバーロード

1.関数のオーバーロードとは何ですか?

関数のオーバーロードは関数の特殊なケースです。C++では、同じスコープで同様の関数を持つ同じ名前の複数の関数を宣言できます。同じ名前のこれらの関数の正式なパラメーターリスト(パラメーターの数、タイプ、または順序)は次のようになります。それらは通常使用されます。類似した機能であるが異なるデータの問題に対処します。
次にいくつかの例を示します。

using namespace std;
int Add(int a,int b)
{
    
    
    return a + b;
}

double Add(double a, double b)
{
    
    
    return a + b;
}

float Add(float a, float b)
{
    
    
    return a + b;
}

int main()
{
    
    
    Add(10,20);
    Add(10.0,20.0);
    Add(0.1f,0.3f);
    return 0;
}

2. C ++が関数のオーバーロードをサポートしているのに、C言語がオーバーロードをサポートしていないのはなぜですか?

C / C ++では、プログラムを実行するには、前処理、コンパイル、アセンブリ、およびリンクの4つの段階を経る必要があります。以下は、LinuxでCとC ++の2つのプログラムをコンパイルした結果です
。C++:
ここに画像の説明を挿入します

と
上記の2つの図から、g ++でコンパイルした後、関数名の変更が変更され、コンパイラーが変更された名前に関数パラメーターの型情報を追加していることがわかります。

C言語
ここに画像の説明を挿入します

ここに画像の説明を挿入します
Linuxでは、gccでコンパイルした後、関数名の変更は変更されていません。

要約すると、C ++はコンパイルプロセス中に、関数の名前付け3が関数のパラメーター(パラメーターの数、タイプ、または順序を含む)に依存し、C言語がコンパイルプロセスで同じことを処理することがわかります。

タイプが同じで戻り値が異なる場合、関数をオーバーロードできないのはなぜですか?

仮定を立てます:関数のオーバーロードは、戻り値の型と仮パラメーターの型に関連しています。
例:
ここに画像の説明を挿入します

コンパイル段階intAddが_Z3Addiiに書き換えられ、doubleAddが** _ Z3Addii **に書き換えられることがわかります。したがって、I-> int d-> doubleと推測すると、Zの後の数字3は戻り値の型を表します(これはコンパイラ関連と同じである)

したがって、関数の戻り値の型が考慮されない理由は、解析演算子または関数呼び出しが上位ステートメントと下位ステートメントから独立しているためです。関数のオーバーロードで戻り値の型が考慮されている場合、コンパイラーはどの関数を判別できません。呼び出す。

面接の質問

それらをリストアップするために、いくつかの簡単な
面接の質問があります。1。C言語で関数のオーバーロードをサポートできないのはなぜですか?
2. C ++でオーバーロードされた最下層はどのように処理されますか?
3.関数はC ++でC言語のスタイルで記述できますか?

おすすめ

転載: blog.csdn.net/xhuyang111/article/details/114362768