1. C++關鍵字(C++98)
2. 命名空間
在C/C++中,變量、函數和后面要學到的類都是大量存在的,這些變量、函數和類的名稱將都存在于全局作用
域中,可能會導致很多沖突。使用命名空間的目的是對標識符的名稱進行本地化,以避免命名沖突或名字污
染,namespace關鍵字的出現就是針對這種問題的。
命名空間定義
可以放變量,也可以放函數
此時程序中有三個a
可以通過編譯
而我們打印一下,發現a是20
為什么?
因為近
訪問全局變量中的a
訪問命名空間里的a
命名空間可以嵌套
訪問N3里面的變量
如果在一個工程中出現了相同名字的命名空間,那么編譯器就把這些名字相同的命名空間合并到一起了
注意:一個命名空間就定義了一個新的作用域,命名空間中的所有內容都局限于該命名空間中
~~
命名空間的使用
1,直接在成員面前加N1::
2.using N1::a; 使用這種方法相當于把a作為全局變量
3.using namesapce N1 告訴編譯器,把當前N1這個命名空間里的全部內容當作全局變量
3. C++輸入&輸出
c中printf函數在打印時需要進行格式控制
以前是iostream.h 但為了和c語言區分 所以去掉.h。cout在系統中給定的一個名字叫做std的這個命名空間中
- 使用cout標準輸出(控制臺)和cin標準輸入(鍵盤)時,必須包含< iostream >頭文件以及std標準命名空
間。
注意:早期標準庫將所有功能在全局域中實現,聲明在.h后綴的頭文件中,使用時只需包含對應頭文件即可,
后來將其實現在std命名空間下,為了和C頭文件區分,也為了正確使用命名空間,規定C++頭文件不帶.h;舊
編譯器(vc 6.0)中還支持<iostream.h>格式,后續編譯器已不支持,因此推薦使用+std的方式。 - 使用C++輸入輸出更方便,不需增加數據格式控制,比如:整形–%d,字符–%c
4. 缺省參數
C++中函數的參數也可以配備胎
4.1 缺省參數概念
缺省參數是聲明或定義函數時為函數的參數指定一個默認值。在調用該函數時,如果沒有指定實參則采用該默
認值,否則使用指定的實參。
缺省參數分類
所有參數都帶有默認值
void TestFunc(int a = 10, int b = 20, int c = 30)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
只有一部分參數帶有默認值(從右往左給)
void TestFunc(int a, int b = 10, int c = 20)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
//a.h
void TestFunc(int a = 10);
// a.c
void TestFunc(int a = 20)
{}
// 注意:如果生命與定義位置同時出現,恰巧兩個位置提供的值不同,那編譯器就無法確定到底該用那個缺省
值。
注意:
1 半缺省參數必須從右往左依次來給出,不能間隔著給實參匹配從左往右
2. 缺省參數不能在函數聲明和定義中同時出現。(如果值不一樣會沖突,一般會在聲明中給出,)
3.缺省值必須是常量或者全局變量
4 C語言不支持(編譯器不支持)
5. 函數重載
自然語言中,一個詞可以有多重含義,人們可以通過上下文來判斷該詞真實的含義,即該詞被重載了。
比如:以前有一個笑話,國有兩個體育項目大家根本不用看,也不用擔心。一個是乒乓球,一個是男足。前者
是“誰也贏不了!”,后者是“誰也贏不了!”
5.1 函數重載概念
函數重載:是函數的一種特殊情況,C++允許在同一作用域中聲明幾個功能類似的同名函數,這些同名函數的形
參列表(參數個數 或 類型 或 順序)必須不同,常用來處理實現功能類似數據類型不同的問題
編譯期間,編譯器會推演實參的類型
參數類型一定只能是其中一個函數的全部類型
同一個作用域,同一個名字,參數列表不能一樣,否則不能重載,與返回值類型相同沒關系。
參數列表不同:個數,類型,類型的次序。
在c語言中不支持函數重載
為什么c中不支持函數重載?
編譯可以通過,這個函數連函數體都沒有怎么可能會編譯通過?
在編譯期間不會找函數具體的問題,因為編譯器看到有函數聲明,在當前文件沒有,但其他文件中可能有
在鏈接期間。編譯器找這個函數地址,找不到報錯。
我們可以看到,我們在寫函數時用的名字時Add,而編譯器在找這個函數時,重新修改了這個名字,把Add修改為_Add。
讓我們把文件改回成c++
編譯器把名字重新命名為~~?Add@@YAHHH@Z~~
我們再次調用兩個Add函數在c++環境下,我們可以看到報錯,
(?Add@@YAHHH@Z)
(?Add@@YANNN@Z)
編譯器重新給了兩個函數不同的名字
我們再看一個例子
**(?Add@@YAHHH@Z)
(?Add@@YANNN@Z)
(?Add@@YANHN@Z)**我們可以知道在VS編譯器中,H代表整形,N代表浮點型。
而在c中編譯器只是簡單的加了一個前綴_