C++起始(关键字,命名空间,缺省参数,函数重载(c语言为什么不支持函数重载))
1. C++關(guān)鍵字(C++98)
2. 命名空間
在C/C++中,變量、函數(shù)和后面要學(xué)到的類都是大量存在的,這些變量、函數(shù)和類的名稱將都存在于全局作用
域中,可能會(huì)導(dǎo)致很多沖突。使用命名空間的目的是對(duì)標(biāo)識(shí)符的名稱進(jìn)行本地化,以避免命名沖突或名字污
染,namespace關(guān)鍵字的出現(xiàn)就是針對(duì)這種問題的。
命名空間定義
可以放變量,也可以放函數(shù)
此時(shí)程序中有三個(gè)a
可以通過編譯
而我們打印一下,發(fā)現(xiàn)a是20
為什么?
訪問全局變量中的a
訪問命名空間里的a
命名空間可以嵌套
訪問N3里面的變量
如果在一個(gè)工程中出現(xiàn)了相同名字的命名空間,那么編譯器就把這些名字相同的命名空間合并到一起了
注意:一個(gè)命名空間就定義了一個(gè)新的作用域,命名空間中的所有內(nèi)容都局限于該命名空間中
~~
命名空間的使用
1,直接在成員面前加N1:: 2.using N1::a; 使用這種方法相當(dāng)于把a(bǔ)作為全局變量 3.using namesapce N1 告訴編譯器,把當(dāng)前N1這個(gè)命名空間里的全部內(nèi)容當(dāng)作全局變量3. C++輸入&輸出
c中printf函數(shù)在打印時(shí)需要進(jìn)行格式控制
以前是iostream.h 但為了和c語言區(qū)分 所以去掉.h。cout在系統(tǒng)中給定的一個(gè)名字叫做std的這個(gè)命名空間中
間。
注意:早期標(biāo)準(zhǔn)庫將所有功能在全局域中實(shí)現(xiàn),聲明在.h后綴的頭文件中,使用時(shí)只需包含對(duì)應(yīng)頭文件即可,
后來將其實(shí)現(xiàn)在std命名空間下,為了和C頭文件區(qū)分,也為了正確使用命名空間,規(guī)定C++頭文件不帶.h;舊
編譯器(vc 6.0)中還支持<iostream.h>格式,后續(xù)編譯器已不支持,因此推薦使用+std的方式。
4. 缺省參數(shù)
C++中函數(shù)的參數(shù)也可以配備胎
4.1 缺省參數(shù)概念
缺省參數(shù)是聲明或定義函數(shù)時(shí)為函數(shù)的參數(shù)指定一個(gè)默認(rèn)值。在調(diào)用該函數(shù)時(shí),如果沒有指定實(shí)參則采用該默
認(rèn)值,否則使用指定的實(shí)參。
缺省參數(shù)分類
所有參數(shù)都帶有默認(rèn)值
void TestFunc(int a = 10, int b = 20, int c = 30)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
只有一部分參數(shù)帶有默認(rèn)值(從右往左給)
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)
{}
// 注意:如果生命與定義位置同時(shí)出現(xiàn),恰巧兩個(gè)位置提供的值不同,那編譯器就無法確定到底該用那個(gè)缺省
值。
注意:
1 半缺省參數(shù)必須從右往左依次來給出,不能間隔著給實(shí)參匹配從左往右
2. 缺省參數(shù)不能在函數(shù)聲明和定義中同時(shí)出現(xiàn)。(如果值不一樣會(huì)沖突,一般會(huì)在聲明中給出,)
3.缺省值必須是常量或者全局變量
4 C語言不支持(編譯器不支持)
5. 函數(shù)重載
自然語言中,一個(gè)詞可以有多重含義,人們可以通過上下文來判斷該詞真實(shí)的含義,即該詞被重載了。
比如:以前有一個(gè)笑話,國有兩個(gè)體育項(xiàng)目大家根本不用看,也不用擔(dān)心。一個(gè)是乒乓球,一個(gè)是男足。前者
是“誰也贏不了!”,后者是“誰也贏不了!”
5.1 函數(shù)重載概念
函數(shù)重載:是函數(shù)的一種特殊情況,C++允許在同一作用域中聲明幾個(gè)功能類似的同名函數(shù),這些同名函數(shù)的形
參列表(參數(shù)個(gè)數(shù) 或 類型 或 順序)必須不同,常用來處理實(shí)現(xiàn)功能類似數(shù)據(jù)類型不同的問題
編譯期間,編譯器會(huì)推演實(shí)參的類型
參數(shù)類型一定只能是其中一個(gè)函數(shù)的全部類型
同一個(gè)作用域,同一個(gè)名字,參數(shù)列表不能一樣,否則不能重載,與返回值類型相同沒關(guān)系。
參數(shù)列表不同:個(gè)數(shù),類型,類型的次序。
在c語言中不支持函數(shù)重載
為什么c中不支持函數(shù)重載?
編譯可以通過,這個(gè)函數(shù)連函數(shù)體都沒有怎么可能會(huì)編譯通過?
在編譯期間不會(huì)找函數(shù)具體的問題,因?yàn)榫幾g器看到有函數(shù)聲明,在當(dāng)前文件沒有,但其他文件中可能有
在鏈接期間。編譯器找這個(gè)函數(shù)地址,找不到報(bào)錯(cuò)。
我們可以看到,我們?cè)趯懞瘮?shù)時(shí)用的名字時(shí)Add,而編譯器在找這個(gè)函數(shù)時(shí),重新修改了這個(gè)名字,把Add修改為_Add。
讓我們把文件改回成c++
編譯器把名字重新命名為~~?Add@@YAHHH@Z~~
我們?cè)俅握{(diào)用兩個(gè)Add函數(shù)在c++環(huán)境下,我們可以看到報(bào)錯(cuò),
(?Add@@YAHHH@Z)
(?Add@@YANNN@Z)
編譯器重新給了兩個(gè)函數(shù)不同的名字
我們?cè)倏匆粋€(gè)例子
**(?Add@@YAHHH@Z)
(?Add@@YANNN@Z)
(?Add@@YANHN@Z)**我們可以知道在VS編譯器中,H代表整形,N代表浮點(diǎn)型。
而在c中編譯器只是簡單的加了一個(gè)前綴_
總結(jié)
以上是生活随笔為你收集整理的C++起始(关键字,命名空间,缺省参数,函数重载(c语言为什么不支持函数重载))的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成都大熊猫繁育基地停车
- 下一篇: c++起始(名词修饰,extern “C