目次
関数のオーバーロード
Quote
命名空间
C++输入输出:
ホームページ バックエンド開発 C#.Net チュートリアル C/C++の違いは何ですか?あまり知られていない比較方法

C/C++の違いは何ですか?あまり知られていない比較方法

Jul 24, 2018 pm 05:31 PM

C/C は、キーワード、ソースファイル、変数の定義や宣言箇所、関数、デフォルトパラメータの数から比較する必要があります。いつも迷っている場合は、この記事を読むと役立ちます。

C/C 以下の観点からの比較:

  1. キーワードの数:
    C 言語: C99バージョン、32 キーワード
    C: C98 バージョン、63 キーワード

  2. ソース ファイル:
    C ソース ファイル拡張子 .c、C ソース ファイル拡張子 。 cpp、ソース ファイルの作成時に何も指定しない場合、デフォルトは .cpp です。

  3. 変数の定義または宣言の場所:
    C 言語は次の場所で定義する必要があります。最初の行; C は必要ありません

  4. 関数:
    (1) 戻り値
    C 言語では、関数で指定されていない場合、戻り値の型を指定すると、デフォルトで int 型が返されます;
    C では、関数の戻り値の検出がより厳しくなります。関数が値を返さない場合は、void として指定する必要があります。
    (2 ) パラメータ リスト
    C 言語では、関数がパラメータ リストを指定しない場合、デフォルトで任意の数のパラメータを受け入れることができます。ただし、C では、厳密なパラメータ タイプ検出により、パラメータ リストのない関数はデフォルトで void になります。パラメータは受け入れられません。

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

//1.实现缺省参数void Test(int a = 50){
    cout << a << endl;
}
int main(){    Test();    // 输出50
    Test(100); // 输出100}
ログイン後にコピー


(1) すべてのデフォルト パラメータ: すべてのパラメータにすべてのデフォルト値を指定します //コード

// 实现全缺省参数void Test(int a = 1,int b = 2,int c = 3)
{    cout << a << "" <<" "<< b << "" <<" "<< c << endl; 
}int main()
{
    Test();//1 2 3
    Test(100);//100 2 3
    Test(100, 200);//100 200 3
    Test(100, 200, 300);//100 200 300}
ログイン後にコピー

(2) 準デフォルトパラメータ: デフォルト値は右から左へのみ渡すことができると規定されています //コード

// 实现半缺省参数   注:缺省值只能从右往左传void Test1(int a = 1, int b = 2, int c = 3)
{    cout << a << "" << " " << b << "" << " " << c << endl;
}void Test2(int a , int b = 2, int c = 3)
{    cout << a << "" << " " << b << "" << " " << c << endl;
}void Test3(int a , int b , int c = 3)
{    cout << a << "" << " " << b << "" << " " << c << endl;
}void Test4(int a = 1, int b , int c = 3)//不能通过编译,因为它违背了缺省值只能从右往左依次来给这一规定{    cout << a << "" << " " << b << "" << " " << c << endl;
}void Test5(int a = 1, int b = 2, int c )//不能通过编译,因为它违背了缺省值只能从右往左依次来给这一规定{    cout << a << "" << " " << b << "" << " " << c << endl;
}void Test6(int a = 1, int b , int c )//不能通过编译,因为它违背了缺省值只能从右往左依次来给这一规定{    cout << a << "" << " " << b << "" << " " << c << endl;
}void Test7(int a , int b = 2, int c )//不能通过编译,因为它违背了缺省值只能从右往左依次来给这一规定{    cout << a << "" << " " << b << "" << " " << c << endl;
}int main()
{
    Test1();//1 2 3}
ログイン後にコピー

注:

a. 带缺省值的参数必须放在参数列表的最后面。
b. 缺省参数不能同时在函数声明和定义中出现,只能二者则其一,最好放在函数声明中。
c. 缺省值必须是常量或全局变量。
ログイン後にコピー

C 言語はサポートしていませんデフォルトパラメータ

関数のオーバーロード

  • 関数のオーバーロードとは、同じスコープ内の同様の関数を持つ同じ名前の複数の関数を宣言することを指します。これらの仮パラメータのリストは、同じ名前の関数 (それぞれの番号、型、型の順序) は異なっていなければなりません。

//函数重载void Add();void Add(int a);//行参个数不一样void Add(char b);//行参类型不同void Add(int a, char b);void Add(char a, int b);//行参类型的次序不同
ログイン後にコピー
  • 戻り値の型が異なるだけで、関数のオーバーロードを構成することはできません。

//仅仅返回值的类型不同,是不能构成函数重载的void Add(int a, int b)
{}int Add(int a, int b)
{    return a + b;
}int main()
{
    Add(1, 2);//因为这样会造成调用不明确,两函数都可以被调用
    return 0;
}
ログイン後にコピー
  • C 関数のオーバーロードがサポートされている理由: VS エディターは、関数パラメーターの型を下部の関数名にコンパイルするため、元の関数はname は別の一意の名前に変更されます。

int Add(int a, int b);    // ?Add@@YAHHH@Zchar Add(int a, int b);   // ?Add@@YADHH@Zchar Add(char a, char b); // ?Add@@YADDD@Z
ログイン後にコピー
  • C 言語が関数のオーバーロードをサポートしていない理由: 生成される新しい関数名は同じです。関数名の前に __

  • を追加するだけです。C 言語スタイルで関数をコンパイルするには、先頭に extern "c"

  • # を追加するだけです。
#
extern "C" int Add(char a, int b);
ログイン後にコピー

Quote

C 言語で関数にパラメータを渡すには、値渡しアドレス渡し#の 2 つの方法があります。

##値による受け渡し: 関数呼び出し中に、一時変数が生成されて仮パラメータに置き換えられ、最後に実際のパラメータの値が新しいパラメータに渡されます。割り当てられた一時変数、つまり仮パラメータ。
値渡しの利点: 関数の副作用は外部パラメーターに影響しません。
値渡しの欠点: パラメータを変更することで外部パラメータを変更することはできません。

参照の受け渡し: 関数呼び出し中に、一時変数が生成されて仮パラメータに置き換えられ、最後に実際のパラメータのアドレスが新しく割り当てられた一時変数に渡されます。
参照を渡す利点: スペースの節約、高効率、パラメータの変更により外部の実パラメータを変更できる。
ポインターを渡すことの欠点: ポインターは安全ではなく、関数の副作用が外部の実パラメーターに影響します。

C Medium:

参照: (1) 概念: 参照とは、変数を新規に定義することではなく、既存の変数を参照することです。別名を取得した後、コンパイラは参照変数にメモリ空間を割り当てず、参照変数と同じメモリ空間を共有します。
(2) 形式:
型&参照変数名 = 参照実体

//引用int main()
{    int a = 10;    int& ra = a;    printf("%p\n", a);    printf("%p\n", ra);//ra和a的地址相同,说明ra和a是同一个实体,他们共用同一块内存空间

    ra = 3;    printf("%d\n", a);//3
    return 0;
}
ログイン後にコピー

注:

   a. 引用在定义时,必须初始化。
   b. 一个变量可以被多次引用。
   c. 引用一旦引用了一个实体,就不能在引用其他实体。
   d. 引用变量的生命周期比实体的生命周期短。
ログイン後にコピー

(3) よく参照する

常引用int main()
{    const int a = 1;    //int& ra = a;//编译会出错,因为实体a是常量
    const int& ra = a;    double b = 12.34;    //int& rb = b;//编译会出错,因为类型不同
    const int& rb = b;    printf("rb=%d\n", rb);//rb=12
    b = 5.0;    printf("b=%f\n", b);//b=5.0
    printf("rb=%d\n", rb);//rb=12
    //b的值改变,但rb的值并没有随之改变,说明rb和b是两个不同的实体}
ログイン後にコピー

(4) 配列参照

//数组引用int a[10];//数组a的类型为 int[10]int(&ra)[10] = a;
ログイン後にコピー

(5) 参照シナリオ:

a. 実際のパラメータを変更するには、関数のパラメータとして参照を使用します。

void Swap(int* pLeft, int* pRight)
{    int temp = *pLeft;    *pLeft = *pRight;    *pRight = temp;
}

void Swap(int& left, int& right)
{    int temp = left;
    left = right;
    right = temp;
}
//如果用引用时不想改变实参的值,则给引用前加const
void Swap(const int& left, const int& right);int main()
{    int a = 10;    int b = 20;
    Swap(&a, &b);//通过传地址来改变实参    printf(" a=%d ", a);    printf(" b=%d\n", b);

    Swap(a, b);//通过引用来改变实参    printf(" a=%d ", a);    printf(" b=%d\n", b);
}
ログイン後にコピー

b. 関数の戻り値として参照変数を使用する //コード

情形1:int& FunTest()
{    int a = 10;    return a;
}int main()
{    int b = FunTest();//将函数的返回值赋给了b
    printf("b=%d\n", b);//b=10
    printf("b=%d\n", b);//b=10
    printf("b=%d\n", b);//b=10
    return 0;
}

情形2:int& FunTest2()
{    int a = 10;    return a;
}int main()
{    int& b=FunTest2();//将函数的返回值作为实体,
    printf("b=%d\n", b);//b=10
    printf("b=%d\n", b);//随机值
    printf("b=%d\n", b);//随机值
    return 0;
}

情形3:int& FunTest3(int& a)
{
    a = 10;    return a;
}int main()
{    int b;    int& rb = FunTest3(b);    printf("b=%d\n", b);//b=10
    printf("rb=%d\n", rb);//rb=10
    printf("rb=%d\n", rb);//rb=10
    printf("rb=%d\n", rb);//rb=10
    return 0;
}
注意:不能返回栈空间上的引用
ログイン後にコピー

値渡し、参照渡し、参照の効率の比較

//比较struct BigType
{    int array[10000];
};void FunTest(BigType bt)//传值或传址{}void FunTest(BigType& bt)//引用{}void TestFunTestRumTime()
{
    BigType bt;
    size_t Start = GetTickCount();    for (i = 0; i < 1000000; i++)
    {
        FunTest(bt);//传值或传引用
        FunTest(&bt);//传址
    }
    size_t End = GetTickCount();    printf("%d\n", End - Start);
}//此代码检测出传值最慢,而传址和引用速度快且用时差不多相同
ログイン後にコピー

参照とポインターには 2 つの違いがあります。違いは何ですか?

類似点:

  • リストの内容

  • 基盤となる処理メソッドは同じであり、どちらもポインターに基づいています。気がついた。

  • 最下層の参照変数に対応するポインタの型:

  • 参照変数エンティティの型* const

相違点:

  • 参照は初期化する必要がありますが、ポインターは必要ありません。

  • 通常の型のポインタは、いつでも同じ型の任意のオブジェクトを指すことができます。参照がエンティティを参照すると、他のエンティティを参照することはできません。

  • ポインタ: 次のアドレスを指し、参照: 値を与えます。

  • は sizeof で異なる意味を持ちます: 参照結果は参照型のサイズであり、ポインタは常にアドレス * スペースによって占有されているバイト数です。

  • ポインタは手動でアドレス指定する必要があり、参照はコンパイラによってアドレス指定されます。

  • 引用比指针使用起来相对安全。

命名空间

在C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称将都存在于全局命名空间中,会导致很多冲突,使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染。

  • 命名空间的定义

//命名空间namespace N1
{    int a = 30;    void FunTest()
    {        printf("N1::FunTest()\n");
    }
}//N1的命名空间int a = 20;void FunTest()
{    printf("::FunTest()\n");
}//在全局作用域中int main()
{    int a = 10;    printf("%d\n", a);    printf("%d\n", ::a);
    ::FunTest();    printf("%d\n", N1::a);
    N1::FunTest();    return 0;
}//命名空间的嵌套namespace N2
{    int a = 40;    void FunTest()
    {        printf("N2::FunTest()\n");
    }    namespace N3
    {        int a = 50;        void FunTest()
        {            printf("N2::N3::FunTest()\n");
        }
    }
}int main()
{
    N2::FunTest();
    N2::N3::FunTest();    return 0;
}// 在同一个工程里允许存在多个相同名称的命名空间,编译器最后会合成到同一个命名空间中namespace N1
{    int b = 70;    void Test()
    {        printf("N1::Test()\n");
    }
}
ログイン後にコピー
  • 说明
    a.一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。
    b.没有名称的命名空间只能在当前文件中使用,它里面定义的变量相当于工程里面的全局变量。

  • 命名空间的使用

//命名空间的使用namespace N1
{    int a = 1;    int b = 2;    int c = 3;    /*void FunTest1()
    {}
    void FunTest2()
    {}*/}//法二:using N1::b;//法三:using namespace N1;int main()
{    int a = 4;    //法一:
    printf("a=%d\n", N1::a);//a=1

    printf("b=%d\n", b);//b=2
    printf("c=%d\n", c);//c=3}
ログイン後にコピー

C++输入输出:

//代码

//C++输入输出#include <iostream>using namespace std;//std标准命名空间int main()
{    int a = 10;    double b = 3.14;    char c = &#39;c&#39;;    cout << a ;    cout << b << &#39;\n&#39;;    cout << c << endl;    cout << a << " " << b << " " << c << endl;    cin >> a ;    cin >> b >> c;    return 0;
}// cout:标准命名空间重输出流对象  <<输出操作符   // cin:标准命名空间重输入流对象   >>输入操作符
ログイン後にコピー

相关推荐:

C# 中的 == 和 equals()有什么区别  

C# 中的 == 和 equals()区别       

视频:C++视频教程

以上がC/C++の違いは何ですか?あまり知られていない比較方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C文字列におけるcharの役割は何ですか C文字列におけるcharの役割は何ですか Apr 03, 2025 pm 03:15 PM

Cでは、文字列でCharタイプが使用されます。1。単一の文字を保存します。 2。配列を使用して文字列を表し、ヌルターミネーターで終了します。 3。文字列操作関数を介して動作します。 4.キーボードから文字列を読み取りまたは出力します。

C言語でさまざまなシンボルを使用する方法 C言語でさまざまなシンボルを使用する方法 Apr 03, 2025 pm 04:48 PM

c言語のシンボルの使用方法は、算術、割り当て、条件、ロジック、ビット演算子などをカバーします。算術演算子は基本的な数学的操作に使用されます。割り当てと追加、下位、乗算、除算の割り当てには、条件操作に使用されます。ポインター、ファイル終了マーカー、および非数値値。

C言語で特殊文字を処理する方法 C言語で特殊文字を処理する方法 Apr 03, 2025 pm 03:18 PM

C言語では、以下などのエスケープシーケンスを通じて特殊文字が処理されます。\ nはラインブレークを表します。 \ tはタブ文字を意味します。 ESACEシーケンスまたは文字定数を使用して、Char C = '\ n'などの特殊文字を表します。バックスラッシュは2回逃げる必要があることに注意してください。さまざまなプラットフォームとコンパイラが異なるエスケープシーケンスを持っている場合があります。ドキュメントを参照してください。

マルチスレッドと非同期C#の違い マルチスレッドと非同期C#の違い Apr 03, 2025 pm 02:57 PM

マルチスレッドと非同期の違いは、マルチスレッドが複数のスレッドを同時に実行し、現在のスレッドをブロックせずに非同期に操作を実行することです。マルチスレッドは計算集約型タスクに使用されますが、非同期はユーザーインタラクションに使用されます。マルチスレッドの利点は、コンピューティングのパフォーマンスを改善することですが、非同期の利点はUIスレッドをブロックしないことです。マルチスレッドまたは非同期を選択することは、タスクの性質に依存します。計算集約型タスクマルチスレッド、外部リソースと相互作用し、UIの応答性を非同期に使用する必要があるタスクを使用します。

C言語のcharとwchar_tの違い C言語のcharとwchar_tの違い Apr 03, 2025 pm 03:09 PM

C言語では、charとwchar_tの主な違いは文字エンコードです。CharはASCIIを使用するか、ASCIIを拡張し、WCHAR_TはUnicodeを使用します。 Charは1〜2バイトを占め、WCHAR_Tは2〜4バイトを占有します。 charは英語のテキストに適しており、wchar_tは多言語テキストに適しています。 CHARは広くサポートされており、WCHAR_TはコンパイラとオペレーティングシステムがUnicodeをサポートするかどうかに依存します。 CHARの文字範囲は限られており、WCHAR_Tの文字範囲が大きく、特別な機能が算術演算に使用されます。

C言語でCharを変換する方法 C言語でCharを変換する方法 Apr 03, 2025 pm 03:21 PM

C言語では、charタイプの変換は、キャスト:キャスト文字を使用することにより、別のタイプに直接変換できます。自動タイプ変換:あるタイプのデータが別のタイプの値に対応できる場合、コンパイラは自動的に変換します。

C言語合計の機能は何ですか? C言語合計の機能は何ですか? Apr 03, 2025 pm 02:21 PM

C言語に組み込みの合計機能はないため、自分で書く必要があります。合計は、配列を通過して要素を蓄積することで達成できます。ループバージョン:合計は、ループとアレイの長さを使用して計算されます。ポインターバージョン:ポインターを使用してアレイ要素を指し示し、効率的な合計が自己概要ポインターを通じて達成されます。アレイバージョンを動的に割り当てます:[アレイ]を動的に割り当ててメモリを自分で管理し、メモリの漏れを防ぐために割り当てられたメモリが解放されます。

C言語でchar配列の使用方法 C言語でchar配列の使用方法 Apr 03, 2025 pm 03:24 PM

Char Arrayは文字シーケンスをC言語で保存し、char array_name [size]として宣言されます。アクセス要素はサブスクリプト演算子に渡され、要素は文字列のエンドポイントを表すnullターミネーター「\ 0」で終了します。 C言語は、strlen()、strcpy()、strcat()、strcmp()など、さまざまな文字列操作関数を提供します。

See all articles