C++入門學習_01

C++基礎學習_01ios

基礎知識:1.命名空間,2.IO流(輸入輸入),3.參數缺省,4.函數重載
函數

1.命名空間學習

  做用:對標識符的名稱進行本地化,避免命名衝突spa

  定義:namaspace space_name { 空間成員}3d

     空間成員能夠是定義變量,也能夠是定義函數code

  特色:可獨自命名,可進行空間嵌套,可分段定義blog

  注意:分段定義時,容許命名空間的名稱相同,可是空間成員不能相同,由於編譯器會將命名空間名稱相同的合併到一塊兒,空間成員若有相同則會產生重定義ci

  使用:做用域限定符---" :: ''作用域

     1>空間名稱 做用域限定符 空間成員編譯器

     2>使用using 將命名空間的成員引入

      using space_name :: space_number; ---將space_name空間中指定的空間成員展開到當前的做用域中

     3>使用using namespace 空間名稱   // 將空間名稱引入

      using namespace space_name; ---將space_name空間中全部的空間成員都展開到當前的做用域中<不推薦使用,容易產生命名衝突>

  使用說明:使用using 會將命名空間中的空間成員展開到當前做用域

       若當前做用域爲全局域,則能夠全局範圍使用

       若當前做用域爲局部域,則只能在局部範圍使用

// 單獨使用
namespace a1{
    int a = 10;
    int Add(int x, int y){
        return x + y;
    }
}
// 分段使用
namespace a1{
    int b = 10;
    int Sub(int x, int y){
        return x - y;
    }
}
// 嵌套使用
namespace a2{
    int a = 10;
    int Add(int x, int y){
        return x + y;
    }
    namespace a3{
        int c = 20;
        int Sub(int x, int y){
            return x - y;
        }
    }
}
int main(){
    // 命名空間的使用
    a1::b;
    a1::Sub(10, 20);
    return 0;
}

2.IO流(輸入輸出)

  使用cout標準輸出(控制檯)與cin標準輸入(鍵盤)時,必須包含頭文件<iostream>和std標準命名空間;

  頭文件:#include<iostream>

  輸出流  cout

    int a = 10;

    int b = 20;

    std::cout << "a = " << a << "\n";

    std::cout << "b = " << b << "\n";

  輸入流  cin

    char a;  int b;  double c;

    std::cin >> a >> b >> c

    能夠分開流入,也能夠直接流入

  能夠看出cout、cin都須要std::引用,因此它們屬於std命名空間中的空間成員,能夠在全局域中直接展開

  eg  usinf std::cout;

    cout << "Hello world\n";

    cin >>a >>b >> c;

3.缺省參數

  定義:在定義或聲明一個函數時,爲形參設置一個默認值,若是沒有進行傳參,函數將會默認使用提早設置好的形參默認值

  

using std::endl;

void func(int a = 10){
    cout << a << endl;
}

int main(){
    cout << "未傳形參值\n";
    func();
    cout << "傳形參值\n";
    func(20);
    return 0;
}

  根據參數默認值是否徹底設置,能夠分爲:全缺省參數和半缺省參數

  須要注意:

    1.半缺省參數必須從右往左給出,不能間隔給出

    2.缺省參數不能在函數聲明和定義中同時出現

    3.缺省參數值必須是常量或全局變量

using std::endl;

// 全缺省參數
void func_1(int a = 10, int b = 20, int c = 30){
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    cout << "c = " << c << endl;
}

// 半缺省參數
void func_2(int a, int b = 20, int c = 30){
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    cout << "c = " << c << endl;
}

4.函數重載

  1-函數重載(搞很差就會函數重定義)

    同名函數的形參列表必須不一樣:參數類型不一樣 或 參數個數不一樣 或 參數順序不一樣

    <1>void fun_1(int a);

    <2>void fun_1(int a, int b);

    <3>int fun_1(int a, int b);

    <1><2>構成函數重載,<3>與<2>構成函數重定義

    說明:函數修飾符不影響函數重載,也就是說函數重載只看形參列表的區別

  2-函數名修飾規則 以Linux系統下顯示結果進行說明

   函數名修飾時,<從左往右>以參數類型的第一個字符開頭進行修飾

  

  3-extern "C"  通常用於C/C++混合編譯時聲明

    告訴編譯器,將該函數按照C語言編譯規則進行編譯

  

// 用於聲明函數風格爲C風格
extern "C" int Add(int x, int y){
    printf("x + y = ");
    return x + y;
}

int main(){
    Add(1, 2);
    return 0;

 

思考幾個問題:

  1.什麼狀況下兩個函數才能造成函數重載?

    函數名相同,而形參列表不一樣。不一樣之處在於:類型不一樣 或 個數不一樣 或 順序不一樣

  2.C語言爲何不支持函數重載?

    C語言編譯器底層對函數名稱修飾過於簡單,只是進行函數名下劃線處理,不會造成函數重載,只會是重定義

  3.C++中函數重載底層是怎麼處理的?

    利用函數的形參類型、個數、順序的不一樣,使用每一個形參的類型的首個字符進行組合造成「修飾符」

    利用三者的不一樣,能夠組合成不一樣的「修飾符」,來對函數名進行修飾,使之不會發生函數名衝突

  4.C++中可否將一個函數按照C風格來編譯?

    能夠,必須對函數進行 extern "C" 聲明

相關文章
相關標籤/搜索