之前淺顯的講解了數(shù)據(jù)結(jié)構(gòu)的部分內(nèi)容:數(shù)據(jù)結(jié)構(gòu)專欄
那么今天我們迎來(lái)了新的起點(diǎn):C++的探索之旅
1.命名空間
1.1引入命名沖突
在c中:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//定義一個(gè)全局變量
int rand = 1;
int main()
{
srand(time(0));
printf("%d\n", rand);
return 0;
}
嚴(yán)格的編譯器會(huì)直接報(bào)錯(cuò):
rand我們都知道是產(chǎn)生隨機(jī)數(shù)的函數(shù),現(xiàn)在我定義了一個(gè)全局變量rand,顯然是有命名沖突
所以c++就提供了解決方案
1.2命名空間
想必學(xué)過(guò)c的大家第一次接觸c++看到:
using namespace std;
都會(huì)想這是什么??大多老師都會(huì)讓說(shuō):你們先記著這是固定的,以后會(huì)懂(結(jié)果到了期末考完也什么都沒(méi)說(shuō))
namespace
是 C++ 中的關(guān)鍵字,用于創(chuàng)建命名空間,它是用來(lái)避免命名沖突并組織代碼的一種機(jī)制。通過(guò)命名空間,可以將一系列的變量、函數(shù)、類等內(nèi)容封裝在其中,以便更好地組織代碼
1.2.1命名空間的定義
定義命名空間,需要使用到
namespace
關(guān)鍵字,后面跟命名空間的名字,然后接一對(duì){ }
即可,{ }
中即為命名空間的成員
- 命名空間的定義事例
namespace Test1 { // 命名空間中可以定義變量/函數(shù)/類型... int rand = 1; int Add(int left, int right) { return left + right; } struct ListNode { struct Node* next; int data; }; }
- 命名空間可以嵌套
namespace Test2 { int a = 0; namespace Test2_1 { int a = 1; } }
- 同一個(gè)工程中允許存在多個(gè)相同名稱的命名空間,編譯器最后會(huì)合成同一個(gè)命名空間中(合并成一個(gè))
一個(gè)工程中的test.h和上面test.cpp中兩個(gè)N1會(huì)被合并成一個(gè)命名空間
一個(gè)命名空間就定義了一個(gè)新的作用域,命名空間中的所有內(nèi)容都局限于該命名空間中
1.2.2命名空間的使用
雙冒號(hào)
::
在 C++ 中是作用域解析運(yùn)算符,它用于指定特定范圍內(nèi)的命名空間或類的成員。它的主要作用有兩個(gè):
- 命名空間限定:用于指定特定命名空間中的變量、函數(shù)或類。例如,
std::cout
中的std
是命名空間,cout
是該命名空間下的對(duì)象。- 類作用域限定:用于指定類的成員函數(shù)或靜態(tài)成員變量。在類的定義或類外部,雙冒號(hào)可以用于訪問(wèn)類的靜態(tài)成員
命名空間的使用有三種方式:
- 加命名空間名稱及作用域限定符
namespace Test1
{
// 命名空間中可以定義變量/函數(shù)/類型...
int rand = 1;
int Add(int left, int right)
{
return left + right;
}
}
int main()
{
// 使用作用域限定符號(hào)直接訪問(wèn)命名空間中的成員
printf("%d\n", Test1::rand);
return 0;
}
成功輸出了:
- 使用using將命名空間中某個(gè)成員引入
namespace Test2
{
int b = 0;
namespace Test2_1//這里命名空間嵌套
{
int a = 1;
}
}
using Test2::b;
int main()
{
printf("%d\n", b);
printf("%d\n",Test2:: Test2_1::a);//這樣訪問(wèn)a
return 0;
}
- 使用using namespace 命名空間名稱引入
這就是我們經(jīng)常看到的using namespace std;
使用后使用std命名空間時(shí)就不需要加上std::
,可以直接用了
2.c++的輸入與輸出
#include<iostream>
// std是C++標(biāo)準(zhǔn)庫(kù)的命名空間名,C++將標(biāo)準(zhǔn)庫(kù)的定義實(shí)現(xiàn)都放到這個(gè)命名空間中
//(直接 using namespace std有點(diǎn)不安全)
using namespace std;
int main()
{
int a = 0;
cin >> a;
cout << a << endl;
cout << "Hello world!!!" << endl;
return 0;
}
- 使用
cout
標(biāo)準(zhǔn)輸出對(duì)象(控制臺(tái))和cin
標(biāo)準(zhǔn)輸入對(duì)象(鍵盤)時(shí),必須包含< iostream >頭文件
以及按命名空間的使用方法使用std。cout
和cin
是全局的流對(duì)象,endl
是特殊的C++符號(hào),表示換行輸出,他們都包含在包含< iostream >頭文件
中。<<
是流插入運(yùn)算符,>>
是流提取運(yùn)算符。(cout<<
就是流入到控制臺(tái) )- 使用C++輸入輸出更方便,不需要像printf/scanf輸入輸出時(shí)那樣,需要手動(dòng)控制格式。C++的輸入輸出可以自動(dòng)識(shí)別變量類型。
- 實(shí)際上cout和cin分別是ostream和istream類型的對(duì)象,>>和<<也涉及運(yùn)算符重載等知識(shí)(挖個(gè)坑,以后詳細(xì)介紹)
3.缺省參數(shù)
3.1概念
缺省參數(shù)是聲明或定義函數(shù)時(shí)為函數(shù)的參數(shù)指定一個(gè)缺省值。在調(diào)用該函數(shù)時(shí),如果沒(méi)有指定實(shí)參則采用該形參的缺省值,否則使用指定的實(shí)參
void Function1(int a = 0)
{
cout<<a<<endl;
}
int main()
{
Func(); // 沒(méi)有傳參時(shí),使用參數(shù)的默認(rèn)值
Func(10); // 傳參時(shí),使用指定的實(shí)參
return 0;
}
3.2缺省參數(shù)分類
- **全缺省參數(shù)(函數(shù)聲明或定義中都指定默認(rèn)值)
void Function2(int a = 1, int b = 2, int c = 3)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
- 半缺省參數(shù)
void Function3(int a, int b = 2, int c = 3)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
注意:
- 半缺省參數(shù)必須從右往左依次來(lái)給出,不能間隔給
- 缺省參數(shù)不能在函數(shù)聲明和定義中同時(shí)出現(xiàn),有函數(shù)聲明一般選擇函數(shù)聲明
- 缺省值必須是常量或者全局變量
4.函數(shù)重載
學(xué)過(guò)Java的同學(xué)必然不陌生
4.1概念
函數(shù)重載:是函數(shù)的一種特殊情況,C++允許在同一作用域中聲明幾個(gè)功能類似的同名函數(shù),這些同名函數(shù)的形參列表==(參數(shù)個(gè)數(shù)或類型或類型順序)==不同,常用來(lái)處理實(shí)現(xiàn)功能類似數(shù)據(jù)類型不同的問(wèn)題。
- 函數(shù)參數(shù)類型不同
int Add(int a, int b)
{
return a + b;
}
double Add(double a, double b)
{
return a + b;
}
int main()
{
cout<<Add(10, 20)<<endl;
cout<<Add(10.1, 20.2);
return 0;
}
- 函數(shù)參數(shù)個(gè)數(shù)不同
void f()
{
cout << "f()" << endl;
}
void f(int a)
{
cout << "f(int a)" << endl;
}
- 函數(shù)參數(shù)類型順序不同(也可認(rèn)為屬于類型不同)
void f(int a, char b)//先int后char
{
cout << "f(int a,char b)" << endl;
}
void f(char b, int a)//先char后int
{
cout << "f(char b, int a)" << endl;
}
4.2C++支持重載的原理----名字修飾
在C/C++中,一個(gè)程序要運(yùn)行起來(lái),需要經(jīng)歷以下幾個(gè)階段:預(yù)處理、編譯、匯編、鏈接
鏈接器看到Test.o調(diào)用某個(gè)函數(shù),但是沒(méi)有函數(shù)的地址,就會(huì)到Func.o的符號(hào)表中找函數(shù)的地址,然后鏈接到一起。而使用哪個(gè)名字去找呢?這里每個(gè)編譯器都有自己的函數(shù)名修飾規(guī)則
c語(yǔ)言鏈接函數(shù)地址時(shí)(找函數(shù))是靠函數(shù)名,所以不允許重名函數(shù)
c++中編譯器需要為每個(gè)函數(shù)生成一個(gè)唯一的標(biāo)識(shí)符來(lái)標(biāo)記函數(shù)的地址。在 Linux 下,這些標(biāo)識(shí)符是通過(guò)一種名為名字修飾(Name Mangling)的方式來(lái)生成的:
_Z + 函數(shù)名字符個(gè)數(shù) + 函數(shù)名 + 每個(gè)參數(shù)類型首字母
所以重載函數(shù)雖然函數(shù)名相同,但是在鏈接函數(shù)地址時(shí)所依靠的標(biāo)識(shí)符卻不同文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-790137.html
- 通過(guò)這里就理解了C語(yǔ)言沒(méi)辦法支持重載,因?yàn)橥瘮?shù)沒(méi)辦法區(qū)分。而C++是通過(guò)函數(shù)修飾規(guī)則來(lái)區(qū)分,只要參數(shù)不同,修飾出來(lái)的名字就不一樣,就支持了重載。
- 如果兩個(gè)函數(shù)函數(shù)名和參數(shù)是一樣的,返回值不同是不構(gòu)成重載的,因?yàn)檎{(diào)用時(shí)編譯器沒(méi)辦法區(qū)分
今天步入c++的學(xué)習(xí)啦,就先到這里?。?!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-790137.html
到了這里,關(guān)于開(kāi)啟C++之旅(上):探索命名空間與函數(shù)特性(缺省參數(shù)和函數(shù)重載)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!