国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

開(kāi)啟C++之旅(上):探索命名空間與函數(shù)特性(缺省參數(shù)和函數(shù)重載)

這篇具有很好參考價(jià)值的文章主要介紹了開(kāi)啟C++之旅(上):探索命名空間與函數(shù)特性(缺省參數(shù)和函數(shù)重載)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

之前淺顯的講解了數(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ò)

開(kāi)啟C++之旅(上):探索命名空間與函數(shù)特性(缺省參數(shù)和函數(shù)重載),c++學(xué)習(xí),c++,java,開(kāi)發(fā)語(yǔ)言,算法,opencv,機(jī)器學(xué)習(xí),linux

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ì){ }即可,{ }中即為命名空間的成員

  1. 命名空間的定義事例
namespace Test1
{
	// 命名空間中可以定義變量/函數(shù)/類型...
	int rand = 1;
	int Add(int left, int right)
	{
		return left + right;
	}

	struct ListNode
	{
		struct Node* next;
		int data;
	};
}
  1. 命名空間可以嵌套
namespace Test2
{
	int a = 0;
	namespace Test2_1
	{
		int a = 1;
	}
}
  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è):

  1. 命名空間限定:用于指定特定命名空間中的變量、函數(shù)或類。例如,std::cout 中的 std 是命名空間,cout 是該命名空間下的對(duì)象。
  2. 類作用域限定:用于指定類的成員函數(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;
}

成功輸出了:

開(kāi)啟C++之旅(上):探索命名空間與函數(shù)特性(缺省參數(shù)和函數(shù)重載),c++學(xué)習(xí),c++,java,開(kāi)發(fā)語(yǔ)言,算法,opencv,機(jī)器學(xué)習(xí),linux

  • 使用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;
}

開(kāi)啟C++之旅(上):探索命名空間與函數(shù)特性(缺省參數(shù)和函數(shù)重載),c++學(xué)習(xí),c++,java,開(kāi)發(fā)語(yǔ)言,算法,opencv,機(jī)器學(xué)習(xí),linux

  • 使用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;
}

開(kāi)啟C++之旅(上):探索命名空間與函數(shù)特性(缺省參數(shù)和函數(shù)重載),c++學(xué)習(xí),c++,java,開(kāi)發(fā)語(yǔ)言,算法,opencv,機(jī)器學(xué)習(xí),linux

  1. 使用cout標(biāo)準(zhǔn)輸出對(duì)象(控制臺(tái))和cin標(biāo)準(zhǔn)輸入對(duì)象(鍵盤)時(shí),必須包含< iostream >頭文件以及按命名空間的使用方法使用std。
  2. coutcin是全局的流對(duì)象,endl是特殊的C++符號(hào),表示換行輸出,他們都包含在包含< iostream >頭文件中。
  3. <<流插入運(yùn)算符,>>流提取運(yùn)算符。(cout<<就是流入到控制臺(tái) )
  4. 使用C++輸入輸出更方便,不需要像printf/scanf輸入輸出時(shí)那樣,需要手動(dòng)控制格式。C++的輸入輸出可以自動(dòng)識(shí)別變量類型。
  5. 實(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ù)分類

  1. **全缺省參數(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;
}
  1. 半缺省參數(shù)
void Function3(int a, int b = 2, int c = 3)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;
}

注意:

  1. 半缺省參數(shù)必須從右往左依次來(lái)給出,不能間隔
  2. 缺省參數(shù)不能在函數(shù)聲明和定義中同時(shí)出現(xiàn),有函數(shù)聲明一般選擇函數(shù)聲明
  3. 缺省值必須是常量或者全局變量

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)題。

  1. 函數(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;
}
  1. 函數(shù)參數(shù)個(gè)數(shù)不同
void f()
{
	cout << "f()" << endl;
}
void f(int a)
{
	cout << "f(int a)" << endl;
}
  1. 函數(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;
}

開(kāi)啟C++之旅(上):探索命名空間與函數(shù)特性(缺省參數(shù)和函數(shù)重載),c++學(xué)習(xí),c++,java,開(kāi)發(fā)語(yǔ)言,算法,opencv,機(jī)器學(xué)習(xí),linux

4.2C++支持重載的原理----名字修飾

在C/C++中,一個(gè)程序要運(yùn)行起來(lái),需要經(jīng)歷以下幾個(gè)階段:預(yù)處理、編譯、匯編、鏈接

開(kāi)啟C++之旅(上):探索命名空間與函數(shù)特性(缺省參數(shù)和函數(shù)重載),c++學(xué)習(xí),c++,java,開(kāi)發(fā)語(yǔ)言,算法,opencv,機(jī)器學(xué)習(xí),linux

鏈接器看到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í)符卻不同

  • 通過(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)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包