c++入門

c語言是結構化和模塊化的語言,適合處理較小規模的程序,不適合複雜編寫。

c++、 面嚮對象語言,c++98是c++第一個標準版本


命名空間
通過範圍限制,解決命名衝突。
對標識符的名稱進行本地化,以避免命名衝突或名字污染

命名空間定義
使用namespace關鍵字,後面跟命名空間的名字,然後接一對{}即可
::作用域限定符

int a=10;
namespace bit  
{
    int a=10;
}//現在不會有命名衝突,第一個a屬於全局作用域,第二個a屬於bit空間作用域
//命名空間可以嵌套使用
//命名空間也可以定義函數
//打印
printf("%d\n",a);
printf("%d"\n,bit::a);// 用兩個::使用!!!!
using bit::a;//使用using將命名空間中成員引入
using namespace bit //使用命名空間的名稱引入 不建議,會造成命名空間污染

命名空間可以合併
定義相同的命名空間,編譯器會自動合併

c++的輸入&輸出
使用cout標準輸出(控制檯),cin標準輸入(鍵盤) 必須包含iostream,與std標準命名空間!
c++沒有.後綴!!與c的頭文件進行區分
使用c++輸入輸出更方便,不需要增加數據格式控制,整型%d 字符%c

#include <iostream>                   //std標準命名空間
void testIO()
{
    int i=10;
    int a,b;
    printf("i:%d\n",i);
    std::cin>>i;
    std::cout<<i;     //cout理解成嘴巴  i相當於說的話,從嘴巴里流
                     //自動判斷數據類型
    std::cout<<i<<"hello world";
    std::cin>>i>>a>>b;  //依次從鍵盤輸入到i a b;
    std::cout<<"\n";//換行
    std::cout<<a<<std::endl//換行                 
}

缺省參數
沒有指定實參時,就執行默認值

void fun(int a=88)
{
    std::cout<<"fun(int)"<<std::endl;
}

int main()
{
    fun(10);
    fun();    
    return 0;
}

全缺省參數

void fun(int a=10,int b=10,int c=20)
{
    
}

半缺省參數

void fun1(int a,int b=10,int c=10)
{
    
}
void fun2(int a=10,int b,int c=30) //不合法!!!,從右邊一次給參數賦值b沒有值
//時a就不能有值

缺省參數,不能在函數聲明與定義中同時出現!
只能有一個地方有默認值!!!

void fun3(int a=10,int b=10);//聲明
void fun3(int a=10,int b=10)  //定義   非法!!!
{
    
}

函數重載
函數名相同,跟返回值類型無關,跟參數個數類型順序有關
函數名相同,參數不同:1,類型不同 2,順序不同 3,個數不同
c語言不支持函數重載,因爲函數名修飾規則
c語言不支持函數重載,給函數名加個下劃線,修飾比較簡單
c++中加入了類與域,重新修飾成一個複雜的名稱,不會產生混淆
c語言中底層函數名:_函數名
c++底層函數名: 前綴+函數名+參數

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

名字修飾
預處理 彙編 編譯 鏈接
預處理:去註釋,宏替換,頭文件展開
彙編:語法檢查 源代碼轉換成彙編代碼
編譯:彙編代碼---->轉換成機器碼
鏈接:機器碼整合到一起生成機器指令,生成可執行程序

extern "c"
加入extern “C”表示按c語言編譯規範去編譯

extern “C”
{
    c語言代碼
}//大括號裏面按c語言編譯

引用
引用不是定義一個變量,而是給已存在變量取了一個別名,編譯器不會爲引用變量開闢一個內存空間,它和它引用的變量共用同一塊內存空間
(類型)&引用變量名=引用實體

int a=10;
int& ra=a;//共用同一塊內存空間   定義引用類型
double& raa=a;//非法 a是int 不能double引用

引用特性
1.引用必須初始化
2.不同類型不能引用
3.指向一個實體後不會指向其他實體
4.一個變量可以有多個引用

常引用

const int a=8;
const int& ra=a;//常引用
const int& ra=100;//常引用

double d=2.0;
const int& rd=d;  //引用的是臨時變量的空間  臨時變量具有常性
//隱式轉換
int c=d;  //隱式變量轉換 內有臨時變量產生!!!

引用
1.做參數 函數傳指針,傳引用效果一樣
2.做返回值(生命週期不能結束!!)

int& Add(int a,int b)
{
    int c=a+b;
    return c;
}
int main()
{
    int& ret=Add(1,3);//執行函數晚,函數釋放,局部變量,生命週期結束!
    cout<<"Add(1,3):"<<ret<<endl;//
    //出現的是隨機值
}

傳值,傳引用效率比較
傳值只是拷貝,傳引用是本身
引用的底層層面:引用開闢新的空間,和指針的實現相同(彙編看)

引用與指針
1.引用必須初始化,指針沒有必要要求
2.沒有NULL引用,有NULL指針
3.一個變量可以有多個引用,一個引用只能引用一個變量
4.在sizeof的含義不同,引用結果爲引用類型的大小,指針始終是地址空間所佔字節個數
5.引用自加即引用實體的增加1,指針自加即指針向後偏移一個類型的大小
6.有多級指針,沒有多級引用。
7.指針需要顯式解引用,引用編譯器自己處理

內聯函數
以inline修飾的函數叫內聯函數(效率比較高),編譯的時候直接展開函數體,沒有函數棧針的開銷
相當於編譯的代碼變多了,空間換時間!

內聯函數特性
1.inline是一種空間換時間的做法,省去調用函數開銷,所以代碼很長或循環、遞歸的函數不適應作爲內聯函數。
2.inline函數的定義與聲明要放在一起!!防止報錯
3.inline對於編譯器而言只是一個建議,編譯器會自動優化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章