日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

C++超詳細(xì)梳理基礎(chǔ)知識_C 語言

作者:JDSZGLLL ? 更新時間: 2022-08-16 編程語言

命名空間的使用

來源

在了解命名空間的原理和使用之前,我們先要理解,命名空間是為了解決什么問題。

C++是在C的基礎(chǔ)上發(fā)展而形成的一種語言,完全兼容C的語法,也加入了許多新的規(guī)則和語法來解決C的缺陷。

命名空間就是為了解決C語言中的重復(fù)命名的問題。

首先我們來看看這么一個代碼:

#include<stdio.h>
int main()
{
	int scanf = 20;
	printf("%d", scanf);
	return 0;
}

我們都知道scanf在C之中是一個函數(shù)名,但詭異的是我們在主函數(shù)中聲明scanf是有效的并且輸出結(jié)果是20.

在這個程序內(nèi)的scanf就是表示是一個int型整數(shù),這是根據(jù)就近原則或者說是局部優(yōu)先原則確定的。

接下來我們看看另一個程序:

#include<stdio.h>
int main()
{
	int scanf = 20;
	scanf("%d", &scanf);
	printf("%d", scanf);
	return 0;
}

在我們想要scanf作為函數(shù)使用時出現(xiàn)了問題,兩者之間命名沖突。

在C語言中我們被告誡不要讓變量名與函數(shù)名沖突,但是在C++中有沒有合適的解決方法呢?

命名空間的使用

我們先來書寫一個在C++中最為簡單的程序:

#include<iostream>
using namespace std;
int main()
{
	cout << "hello  world" << endl;
	return 0;
}

這里我們就看到了namespace命名空間,但是現(xiàn)在它是用來干什么的我們還不清楚,首先我們先來了解一下它。

一個命名空間就定義了一個新的作用域,命名空間中的所有內(nèi)容都局限于該命名空間中。

讓我們從代碼方面來看看命名空間到底是什么:

#include<iostream>
using namespace std;
namespace  N1
{
	int printf = 30;
	int strlen = 20;
}
int main()
{
	cout << "hello  world" << endl;
	cout << N1::printf << endl;
	return 0;
}

我們聲明了一個命名空間N1,在內(nèi)部聲明了兩個int類型的變量,通過作用域限定符::我們就可以調(diào)用命名空間中的變量。

并且命名空間中也可以嵌套命名空間:

namespace  N1
{
	int printf = 30;
	int strlen = 20;
	namespace  N2
	{
		int a = 0;
	}
}

通過上面的解釋,我們明白了,命名空間適用于將聲明的名稱之間相互隔離,防止命名沖突。比如說,我們調(diào)用N1::printf時,::將范圍限定在N1這個命名空間之中,而不會與函數(shù)名printf沖突,反之亦然。

那么一開始我們看到的那個程序是什么意思呢?

我們先來看另一個版本的程序:

int main()
{
	std::cout << "hello  world" << std::endl;
	//cout << N1::printf << endl;
	return 0;
}

顯然std也是一個命名空間,通過作用域限定符調(diào)用命名空間std內(nèi)的內(nèi)容。

那么一開始的

using namespace std;

是用來干嘛的呢?

using的作用是把命名空間中的內(nèi)容在全局空間中展開,命名空間中的變量就成為了全局變量,調(diào)用時就不需要命名空間名加上作用域限定符了。

實際上命名空間有三種使用方式,各有優(yōu)劣。

不展開

也就是

std::cout << "hello  world" << std::endl;

的方式,要使用命名空間中的名稱,就要使用::來限定命名空間,完全避免了沖突,在大工程中使用。缺點就是在日常練習(xí)中書寫代碼較為繁瑣。

部分展開

使用using將命名空間中成員引入,將一些我們常用的符號在全局中展開,就可以大大簡化代碼,是在第一個方法和第三個方法之間取一個折中。

using std::cout;
using std::endl;
int main()
{
	cout << "hello  world" << endl;
	//cout << N1::printf << endl;
	return 0;
}

全展開

使用using namespace 命名空間名稱引入:

using namespace std;
int main()
{
	cout << "hello  world" << endl;
	//cout << N1::printf << endl;
	return 0;
}

這個方法是有問題的,相當(dāng)于一夜回到解放前。好不容易搞個命名空間隔離了,結(jié)果一行代碼全給展開了,直接在全局空間聲明,完全沒有防止命名沖突的作用,只在日常練習(xí)中使用。

函數(shù)重載

函數(shù)重載的規(guī)則

自然語言中,一個詞可以有多重含義,人們可以通過上下文來判斷該詞真實的含義,即該詞被重載了。

比如:以前有一個笑話,國有兩個體育項目大家根本不用看,也不用擔(dān)心。一個是乒乓球,一個是男足。前者是“誰也贏不了!”,后者是“誰也贏不了!”

函數(shù)重載是函數(shù)的一種特殊情況,C++允許在同一作用域中聲明幾個功能類似的同名函數(shù),這些同名函數(shù)的形參列表(參數(shù) 個數(shù) 或 類型 或 順序)必須不同,常用來處理實現(xiàn)功能類似數(shù)據(jù)類型不同的問題。

比如下面的相加函數(shù):

int Add(int left, int right)
{
return left+right;
}
double Add(double left, double right)
{
return left+right;
}
long Add(long left, long right)
{
return left+right;
}
int main()
{
Add(10, 20);
Add(10.0, 20.0);
Add(10L, 20L);
return 0;
}

雖然函數(shù)名相同,但是所帶參數(shù)的類型不同,所以在調(diào)用的時候能夠調(diào)用不同的函數(shù)定義,讓函數(shù)的使用更加靈活。

這里要特別注意的是函數(shù)重載的規(guī)則:同名函數(shù)的形參列表(參數(shù) 個數(shù) 或 類型 或 順序)必須不同。

short Add(short left, short right)
{
return left+right;
}
int Add(short left, short right)
{
return left+right;
}

那么兩個同名函數(shù),算不算是函數(shù)重載呢,顯然他們的形式參數(shù)的個數(shù) ,類型以及 順序都是一樣的,只是返回類型不同,不構(gòu)成重載函數(shù)。

C++如何實現(xiàn)函數(shù)重載

我們都知道C是沒有函數(shù)重載這個功能的,那么C++是怎么實現(xiàn)的呢?

其實是通過C++的函數(shù)名修飾來實現(xiàn)函數(shù)重載的。

大家這里可能有一些迷糊,這需要我們對代碼的編譯過程有一定的了解:

C和C++的區(qū)別在于,在編譯的符號匯總中,C語言是使用函數(shù)的原名進(jìn)行匯總的,導(dǎo)致了一個名稱只能對應(yīng)一個函數(shù),所以不能進(jìn)行函數(shù)重載。

但是在C++中,符號匯總起來的是經(jīng)過修飾的函數(shù)名,即使原名稱一樣,由于參數(shù) 個數(shù) 或 類型 或 順序不同,經(jīng)過修飾后的符號名也不同,比如說:

int Add(int left, int right)
{
return left+right;
}
 
double Add(double left, double right)
{
return left+right;
}
 
long Add(long left, long right)
{
return left+right;
}

比如說這三個函數(shù)經(jīng)過函數(shù)名修飾之后就變成了——Addii、Adddd、Addll。于是我們在后續(xù)的使用中就可以很好地區(qū)分這三個函數(shù)了,即使在我們看來這三個函數(shù)名是一樣的,但是在計算機(jī)看來這三個完全就是三個不一樣的函數(shù)。

引用

引用可以說就是給變量取別名。是怎么實現(xiàn)的呢?

#include<iostream>
int main()
{
	int a = 0;
	int b = 0;
	int& c = a;
	c = 10;
	return 0;
}

其中 int& c = a; 就是把c作為a的別名,這時c和a指向的內(nèi)存空間是同一塊。

當(dāng)改變c的值時,a中的值同時改變。

但是,在使用過程中也有一些需要注意的事項——

1.引用類型必須和引用實體是同種類型的

2.引用在定義時必須初始化

int a;
int& b = a;

3.一個變量可以有多個引用

int a = 0;
int& b = a;
int& c = a;
int$ d = c;

4.引用一旦引用一個實體,再不能引用其他實體

#include<iostream>
int main()
{
	int a = 0;
	int b = 0;
	int& c = a;
	int& c = b;
	c = 10;
	return 0;
}

原文鏈接:https://blog.csdn.net/JDSZGLLL/article/details/125384782

欄目分類
最近更新