中國建設(shè)銀行重慶網(wǎng)站首頁網(wǎng)絡(luò)營銷策略實(shí)施的步驟
前言:
??C++是在C語言的基礎(chǔ)上不斷添加?xùn)|西形成的一門語言,在C語言的基礎(chǔ)上引入了面向?qū)ο蟮乃枷?。因此C++既是面向?qū)ο蟮恼Z言,也是面向過程的語言。因?yàn)镃++是以C語言為基礎(chǔ)的,所以基本上C++兼容所有的C語言。目前最常用的版本是C++98和C++11這兩個(gè)版本。
??因?yàn)镃語言是一個(gè)比較早期的語言,在許多方面是存在缺陷的,所以C++在C語言的基礎(chǔ)上加了許多東西,比如:命名空間、缺省參數(shù)、函數(shù)重載、引用、模板等。另外需要知道的一個(gè)概念是,語言的更新只能向前兼容,之前存在的東西有缺陷,只能通過打補(bǔ)丁來解決,而不能從根本上去解決問題。因?yàn)橛锌赡苓@一缺陷已經(jīng)被使用在了項(xiàng)目工程之中,如果改掉就會(huì)導(dǎo)致項(xiàng)目工程出現(xiàn)一些難以預(yù)料的BUG。
命名空間:
什么是命名空間?為什么要設(shè)置一個(gè)命名空間?
??變量、函數(shù)和類的名稱都存在于全局作用域中,在一個(gè)大一點(diǎn)的項(xiàng)目中,這些名稱就可能會(huì)存在沖突。命名空間的存在就是為了解決這一問題。命名空間可以對(duì)標(biāo)識(shí)符的名稱進(jìn)行本地化,從而達(dá)到避免命名沖突或名字污染的情況。命名空間的關(guān)鍵字是namesapce。
??命名空間相當(dāng)于定義了一個(gè)新的作用域,命名空間內(nèi)的所有內(nèi)容都局限在該命名空間中。但是命名空間并不影響內(nèi)容的聲明周期。
命名空間的定義:
namespace NS
{// 命名空間中可以定義變量/函數(shù)/類型int rand = 10;int Add(int left, int right){return left + right;}struct Node{struct Node* next;int val;};
}
//命名空間可以嵌套
namespace N1
{int a;int b;int Add(int left, int right){return left + right;}namespace N2{int c;int d;int Sub(int left, int right){return left - right;}}
}
//同一個(gè)工程中允許存在很多個(gè)相同名稱的命名空間,編譯器最后會(huì)合成到同一個(gè)命名空間中
namespace N1
{int Mul(int left, int right){return left * right;}
}
命名空間的使用:
namespace use1
{int a = 1;int b = 2;
}
namespace use2
{int c = 3;
}
//使用using將命名空間中某個(gè)成員引入
using use1::b;
//使用using namespace 命名空間名稱 引入
using namespace use2;
int main()
{//命名空間名稱及作用域限定符printf("%d\n", use1::a);printf("%d\n", b);printf("%d\n", c);return 0;
}
C++的輸入輸出:
//std是C++標(biāo)準(zhǔn)庫的命名空間名,C++標(biāo)準(zhǔn)的定義實(shí)現(xiàn)都放在這個(gè)命名空間中
//前期學(xué)習(xí)可以直接將std引入
using namespace std;int main()
{cout << "hello world" << endl;int a;double b;char c;//C++可以自動(dòng)識(shí)別變量的類型cin >> a;cin >> b >> c;cout << a << endl;cout << b << " " << c << endl;return 0;
}
??使用cout標(biāo)準(zhǔn)輸出對(duì)象(控制臺(tái))和cin標(biāo)準(zhǔn)輸入對(duì)象(鍵盤)時(shí),必須要包含頭文件以及按命名空間使用方法來使用std;
??cout和cin是全局的流對(duì)象,endl是特殊的C++符號(hào),表示換行輸出,他們都包含在頭文件中;
??<<是流插入運(yùn)算符,>>是流提取運(yùn)算符;
??使用C++輸入輸出更方便,不需要像printf/scanf輸入輸出時(shí)那樣,需要手動(dòng)控制格式。C++的輸入輸出可以自動(dòng)識(shí)別變量類型;
??cout和cin分別是ostream和istream類型的對(duì)象,>>和<<也涉及到運(yùn)算符的重載。
缺省參數(shù):
??缺省參數(shù)是聲明或定義函數(shù)時(shí)為函數(shù)的參數(shù)指定一個(gè)缺省值(默認(rèn)值),在調(diào)用該函數(shù)時(shí),如果沒有指定實(shí)參則采用該形參的缺省值,否則使用指定的實(shí)參。
#include <iostream>using namespace std;
//缺省參數(shù)不能在函數(shù)聲明和定義時(shí),同時(shí)出現(xiàn)
// 缺省值必須是常量或全局變量
//全缺省參數(shù)
void Func(int a = 10, int b = 20, int c = 30)
{cout << a << " ";cout << b << " ";cout << c << endl;
}
//半缺省參數(shù)
//半缺省參數(shù)必須從右到左依次給出,不能有間隔
void Func1(int a, int b = 20, int c = 30)
{cout << a << " ";cout << b << " ";cout << c << endl;
}int main()
{Func();//缺省參數(shù)必須從左到右連續(xù)使用,不能出現(xiàn)形如Func(1, , 2)的寫法Func(1);Func(1, 2);Func(1, 2, 3);return 0;
}
函數(shù)重載:
什么是函數(shù)重載?
??C++允許在同一作用域中聲明幾個(gè)功能類似的同名函數(shù),這些同名函數(shù)的形參列表不同(參數(shù)個(gè)數(shù)或類型或類型順序),常用來處理實(shí)現(xiàn)功能類似數(shù)據(jù)類型不同的問題。
#include <iostream>
using namespace std;
//參數(shù)類型不同
int Add(int left, int right)
{return left + right;
}
double Add(double left, double right)
{return left + right;
}
//參數(shù)個(gè)數(shù)不同
int Sub(int max, int min)
{return max - min;
}
int Sub(int max, int min1, int min2)
{return max - min1 - min2;
}
//類型順序不同
void func(char a, int b)
{cout << a << " " << b << endl;
}
void func(int a, char b)
{cout << a << " " << b << endl;
}
int main()
{cout << Add(1, 2) << endl;cout << Add(1.1, 1.2) << endl;cout << Sub(10, 1) << endl;cout << Sub(10, 1, 2) << endl;func('a', 3);func(5, 'b');return 0;
}
為什么C++能識(shí)別重載函數(shù),而C語言不行?
??因?yàn)镃語言編譯之后的結(jié)果,函數(shù)名并沒有修飾,我們?cè)诖a中寫的什么樣就是什么樣。但是C++的函數(shù)名是按照一定規(guī)則被修飾了的,不同的編譯器在不同的環(huán)境中修飾規(guī)則也是有區(qū)別的,所以C++能識(shí)別重載函數(shù),而C語言不能。
??如果兩個(gè)函數(shù)的函數(shù)名和參數(shù)是一樣的,返回值不同,是不能夠構(gòu)成重載的,因?yàn)檎{(diào)用時(shí)編譯器沒法區(qū)分。