天天看點

C++基礎文法學習1

1.命名空間 namespace 

為什麼要使用命名空間:一個中大型軟體往往由多名程式員共同開發,會使用大量的變量和函數,不可避免地會出現變量或函數的命名沖突。當所有人的代碼都測試通過,沒有問題時,将它們結合到一起就有可能會出現命名沖突。

::作用域限定符 用來限定變量的所屬域

2.c++中可以使用 for(int i = 0; i <10; i++)循環,C語言中會文法報錯,此時i不算被定義,之後不可使用

3.register關鍵字請求“編譯器”将局部變量存儲于寄存器中

                C語言中無法取得register變量位址

在C++中依然支援register關鍵字

             1、C++編譯器有自己的優化方式,不使用register也可能做優化

             2、C++中可以取得register變量的位址

        C++編譯器發現程式中需要取register變量的位址時,register對變量的聲明變得無效。

C++中若對register變量取位址,則該變量不再是寄存器變量,系統自動為其配置設定位址,變為普通變量

4.未初始化的全局變量為0,為初始化的局部變量為垃圾值,C語言中可以對全局變量重複定義,C++中不可以對全局變量進行重複定義

5.結構體加強在c++中結構體相當于是一種資料類型,如struct Test{};,定義時可以寫成Test t;

6.函數參數:C語言中print()可以接受任意個參數,print(void)沒有參數

                       c++中,傳回值必須要有類型,即函數必須有類型,形參有無void都一樣,都不能傳入參數

7.新增bool型,bool a = true a則為1,bool型的值隻能是0或1

8.條件表達式:C語言中 :

int a = 1, b = 2;

int c = (a > b) ? a : b;

此時條件表達式的傳回值是一個常量2,而不是b這個變量,是以條件表達式不能是左值,因為常量不能被指派

可以通過 (a > b) ? &a : &b來傳回一個位址來作為左值

c++中條件表達式可以作為左值,傳回的是變量本身

9.c++中,const int a = 1, a是一個常量,存在與編譯器的符号表中,不占用記憶體,

int *p = (int*)&a 作業系統則會配置設定四個位元組來存放1,但是與a無關,a是一個常量,用1來替換

const與define的差別:兩者作用域不同

const int a = 1  //a是一個局部變量,函數内部有效

#define b 1 //宏,代碼從這一行向下都有效

10.c++中的引用

引用可以看作一個已定義變量的别名

引用的文法:Type& name = var;  

#include <stdio.h>

int main()

{

    // 定義一個int型變量a,在記憶體中占4個位元組,

    // 變量名 a 就代表了這一塊記憶體,或者說 a 是這塊記憶體的别名

    int a = 10;

    // 定義了一個引用變量 b ,它是 a 的别名,和 a 代表同一塊記憶體空間

    // 對 b 的操作 和 對 a 的操作是一樣的

    int& b = a;

    // 改變 b 等于改變了 a

    b = 20;

    printf ("%d, %d\n", a, b);

    // a 與 b 代表同一塊記憶體空間

    printf ("%p, %p\n", &a, &b);

    return 0;

}

普通引用在聲明時必須用其它的變量進行初始化

普通引用一定要初始化,相當于給a這段記憶體取了别名叫b

11.int a[10] = {0}; a是一個常指針,不能改變,a++是不成立的

c++中 char &a;a為常指針,占4個位元組

引用隻能引用一次,即int &a = b後,不能出線對a的其他指派

12.引用的意義

#include <stdio.h>

void swap1 (int &a, int &b)

{

    int tmp = a;

    a = b;

    b = tmp;

}

void swap2 (int *a, int *b)

{

    int tmp = *a;

    *a = *b;

    *b = tmp;

}

int main()

{

    int a = 10;

    int b = 20;

    swap2 (&a, &b);

    swap1 (a, b);

    printf ("%d, %d\n", a, b);

    return 0;

}

1)引用作為其它變量的别名而存在,是以在一些場合可以代替指針

2)引用相對于指針來說具有更好的可讀性和實用性

13.const

const int *p;  就近原則,const離*近,是以不能改變*p,及不能改變其值

int *const p;const離p近,p不能改變

const int* const p;兩者都不能變

14.不能傳回局部變量的引用,與傳回局部變量的位址類似,函數運作結束後,參數空間都會被釋放

15.常引用:

①不能用常量初始化引用(常量不占記憶體)

②const int &b = 1;常引用可用常量來初始化,系統配置設定4個位元組,存入1,常引用不能修改

③可用變量初始化常引用

16.預設參數

一旦使用了預設參數,之後的參數必須使用預設參數,否則産生歧義

占位參數,留個位置,減少改動

int add(int x, int y, int = 0, int = 0)

17.函數重載

①參數個數不同

②參數類型不同

③參數順序不同

傳回值不能構成重載,重載函數遇到預設參數可能出現歧義

18.面向對象程式設計:抽象 封裝 繼承 多态