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

【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載)

這篇具有很好參考價(jià)值的文章主要介紹了【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

? ??【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間


目錄

一. 前言

二. 什么是C++

三. C++關(guān)鍵字初探

四. 命名空間

4.1 為什么要引入命名空間

4.2 命名空間的定義

4.3 命名空間使用

五. C++的輸入輸出

六. 缺省參數(shù)

6.1 缺省參數(shù)的概念

6.2 缺省參數(shù)的分類(lèi)

七. 函數(shù)重載?

7.1 函數(shù)重載的概念

7.2 函數(shù)重載的條件

7.3 C++支持函數(shù)重載的原因


一. 前言

? ? ? ? 舊坑未填,新坑又起。今天我們又要開(kāi)啟一個(gè)新的系列:C++深入淺出。振奮人心的C++學(xué)習(xí)終于來(lái)了【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間在本系列中,你能感受到C++相比C語(yǔ)言特有的魅力,盡管學(xué)習(xí)的過(guò)程中可能會(huì)充滿坎坷,但風(fēng)雨之后,仰望天空,即使沒(méi)有彩虹,也會(huì)是睛空。學(xué)完C++后,你甚至可以在C++中用短短幾行代碼就搞定C語(yǔ)言幾十上百行的代碼,是不是很神奇,這還只是C++其中的一個(gè)強(qiáng)大之處哦。所以,不要恐懼,讓我們一起懷著激動(dòng)的心情打開(kāi)C++的大門(mén)吧【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間

二. 什么是C++

【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間

????????C語(yǔ)言是結(jié)構(gòu)化和模塊化的語(yǔ)言,適合處理較小規(guī)模的程序。對(duì)于復(fù)雜的問(wèn)題,規(guī)模較大的
程序,需要高度的抽象和建模時(shí),C語(yǔ)言則不合適。為了解決軟件危機(jī), 20世紀(jì)80年代, 計(jì)算機(jī)
界提出了OOP(object oriented programming:面向?qū)ο?思想,支持面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言
應(yīng)運(yùn)而生。
????????1982年,Bjarne Stroustrup博士在C語(yǔ)言的基礎(chǔ)上引入并擴(kuò)充了面向?qū)ο蟮母拍?,發(fā)明了一
種新的程序語(yǔ)言。為了表達(dá)該語(yǔ)言與C語(yǔ)言的淵源關(guān)系,命名為C++。因此:C++是基于C語(yǔ)言而
產(chǎn)生的,它既可以進(jìn)行C語(yǔ)言的過(guò)程化程序設(shè)計(jì)(C++兼容C語(yǔ)言),又可以進(jìn)行以抽象數(shù)據(jù)類(lèi)型為特點(diǎn)的基于對(duì)象的程序設(shè)計(jì),還可以進(jìn)行面向?qū)ο蟮某绦蛟O(shè)計(jì)。

三. C++關(guān)鍵字初探

? ? ? ? 在C語(yǔ)言的學(xué)習(xí)過(guò)程中,我們前前后后一共學(xué)到了32個(gè)關(guān)鍵字。而C++作為C語(yǔ)言的擴(kuò)展,一共多達(dá)63個(gè)關(guān)鍵字,如下表所示:【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間

?注:這里稍微知道一下有這些關(guān)鍵字即可,后面學(xué)到具體應(yīng)用時(shí)再進(jìn)行細(xì)講【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間

四. 命名空間

4.1 為什么要引入命名空間

在寫(xiě)C語(yǔ)言代碼時(shí),你是否寫(xiě)過(guò)類(lèi)似這樣的代碼:

#include<stdio.h>
#include<stdlib.h>

int rand = 0;
int main()
{
	printf("%d", rand);
	return 0;
}

當(dāng)你Ctrl+F5興沖沖的編譯運(yùn)行時(shí),發(fā)現(xiàn)不解情的編譯器報(bào)出了重定義的錯(cuò)誤:

【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間

由于預(yù)處理階段會(huì)將頭文件進(jìn)行展開(kāi),而在我們的stdlib.h頭文件中存在著名為rand的隨機(jī)數(shù)函數(shù),而C語(yǔ)言是不允許在相同作用域下定義多個(gè)同名符號(hào)的,因此會(huì)報(bào)出重定義的錯(cuò)誤。

#include<stdio.h>
#include<stdlib.h>

int rand = 0; //前面已經(jīng)將rand全局定義為函數(shù),這里又定義為全局變量,顧重定義
int main()
{
	int rand = 0; //這里rand是局部變量,作用域不同,局部?jī)?yōu)先,因此不會(huì)報(bào)錯(cuò)
	rand(); //由于rand是局部?jī)?yōu)先,這里的rand是個(gè)局部變量,顧無(wú)法作為函數(shù)使用,報(bào)錯(cuò)
	printf("%d", rand);
	return 0;
}

在上面的代碼中,我們無(wú)論將rand定義成全局變量還是局部變量,都無(wú)法實(shí)現(xiàn)我們想要的效果,那怎么辦呢?將rand變量的名字換一個(gè)唄,得不到就不要強(qiáng)求啦【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間


但是在C++中,新增了命名空間來(lái)對(duì)標(biāo)識(shí)符的名稱進(jìn)行本地化,以避免命名沖突或名字污染,上面的問(wèn)題就被很好的解決了。

所以說(shuō),努力拓展提升自己,能力夠了自然也就得到了【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間

4.2 命名空間的定義

定義命名空間,需要使用到namespace關(guān)鍵字,后面跟命名空間的名字,然后接一對(duì){}即可。{}中的內(nèi)容即為命名空間的成員。命名空間內(nèi)的成員可以是變量,也可以是函數(shù)、類(lèi)型,甚至可以是另一個(gè)命名空間。

namespace Dream //namespace關(guān)鍵字 + 命名空間名稱
{
	//命名空間內(nèi)定義變量
	int a;
	int b = 10;

	//命名空間內(nèi)定義函數(shù)
	int add(int x,int y)
	{
		return x + y;
	}

	//命名空間內(nèi)定義類(lèi)型
	struct Stack
	{
		int* a;
		int top;
		int capacity;
	};

	//命名空間嵌套定義
	namespace other
	{
		int a;
		int b = 10;
	}

}

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

此外, 如果我們?cè)?span style="background-color:#f9eda6;">同一工程中定義了兩個(gè)相同名稱的命名空間(無(wú)論在哪個(gè)文件),編譯器最終會(huì)合并到同一個(gè)命名空間中【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間

//test1.cpp
namespace Dream
{
	int a = 5;
	int b = 10;
}

//test2.cpp
namespace Dream
{
	int Add(int x, int y)
	{
		return x + y;
	}
}

//上面兩個(gè)同名命名空間編譯器最終會(huì)進(jìn)行合并,結(jié)果如下:
namespace Dream
{
	int a = 5;
	int b = 10;

	int Add(int x, int y)
	{
		return x + y;
	}
}

4.3 命名空間使用

那么,定義了命名空間后,我們要如何使用它呢?如果我們直接對(duì)命名空間的成員進(jìn)行訪問(wèn),編譯器會(huì)報(bào)錯(cuò):

#include<stdio.h>
namespace Dream
{
	int b = 10;
}
int main()
{
	printf("%d", b); //報(bào)錯(cuò),b只在Dream作用域內(nèi)有效
	return 0;
}

【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間


?我們一般有一下三種使用方法:

1、變量名前加命名空間名稱及作用域限定符

namespace Dream
{
	int b = 10;
	namespace other
	{
		int b = 5;
	}
}

int main()
{
	printf("%d", Dream::b); //表示Dream命名空間內(nèi)的b,即輸出10
    printf("%d", Dream::other::b); //表示Dream命名空間內(nèi)的other命名空間內(nèi)的b,即輸出5
	return 0;
}

分析:兩個(gè)變量b雖然名稱相同,但被劃分到了兩個(gè)命名空間中,作用域不同,因此不會(huì)出現(xiàn)重定義的問(wèn)題。并且,通過(guò)在前面加上對(duì)應(yīng)的命名空間我們可以實(shí)現(xiàn)對(duì)這兩個(gè)變量b的訪問(wèn)。

2、使用using將命名空間中某個(gè)成員展開(kāi)

? ? ? 但是如果命名空間中的某個(gè)變量需要在程序中頻繁的進(jìn)行使用,每次都要在前面加上命名空間未免顯得過(guò)于繁瑣,因此C++還允許我們使用using關(guān)鍵字將命名空間中某個(gè)成員展開(kāi)【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間

namespace Dream
{
	int a = 5;
	int b = 10;
}

using Dream::a;

//int a = 10;  //由于上方將變量a展開(kāi),a的作用域相當(dāng)于全局,這里如果再定義a會(huì)重定義
int main()
{
	a += 10; //引入了a,顧不需要再前面加上命名空間
	printf("%d\n", a);
	printf("%d", Dream::b); //而變量b沒(méi)有展開(kāi),故需加上命名空間
	return 0;
}

3、使用using naespace 將整個(gè)命名空間展開(kāi)

? ? ? 當(dāng)然,如果你愿意的話,你也可以將整個(gè)命名空間展開(kāi),這樣整個(gè)命名空間的東西都將暴露在全局。具體方式如下【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間

namespace Dream
{
	int a = 5;
	int b = 10;
}

using namespace Dream; //展開(kāi)后使用命名空間內(nèi)的變量就無(wú)需再加前綴
int main()
{
	a += 10;
	printf("%d\n", a);
	printf("%d", b);
	return 0;
}

????????下面,我們?cè)賮?lái)看看許多C++程序中經(jīng)常出現(xiàn)的寫(xiě)法就很清楚了:

#include<iostream>
using namespace std;
int main()
{
	return 0;
}
  • 第一條語(yǔ)句的作用是包含輸入輸出流,下面我們會(huì)進(jìn)行說(shuō)明,這里我們可以暫且將理解為C語(yǔ)言的#include<stdio.h>
  • 第二條語(yǔ)句是不是很熟悉啦,沒(méi)錯(cuò),就是用來(lái)展開(kāi)命名空間std的。std的英文全拼是Standard,即標(biāo)準(zhǔn)的意思。C++標(biāo)準(zhǔn)程序庫(kù)中的所有標(biāo)識(shí)符都被定義在這個(gè)命名空間中。顧這里將整個(gè)命名空間引入是為了后續(xù)更方便的使用C++標(biāo)準(zhǔn)程序庫(kù)的標(biāo)識(shí)符,如函數(shù)、類(lèi)型等等。

但是,雖然方便,但在實(shí)際工程中并不建議直接將整個(gè)命名空間展開(kāi)。原因是在大規(guī)模工程中,定義的變量太多,可能會(huì)出現(xiàn)定義的變量名與std命名空間的標(biāo)識(shí)符出現(xiàn)重復(fù)的情況,此時(shí)如果將std全部展開(kāi)就會(huì)出現(xiàn)重定義的BUG。


故比起將命名空間全部展開(kāi),我們更推薦使用第一種或者第二種使用方式。

?五. C++的輸入輸出

在學(xué)習(xí)C語(yǔ)言時(shí),我們寫(xiě)的第一個(gè)代碼就是hello world,那么在我們第一次接觸C++時(shí),是不是也應(yīng)該使用C++對(duì)美好的世界打個(gè)招呼呢?我們來(lái)試試C++是怎么實(shí)現(xiàn)輸入輸出的吧!【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間

#include<iostream>
using namespace std; //展開(kāi)std命名空間
int main()
{
	cout << "hello world!!!" << endl; //打印輸出
	return 0;
}

【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間

?下面我們來(lái)分析分析上面的代碼【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間


1、使用cout標(biāo)準(zhǔn)輸出對(duì)象(控制臺(tái))cin標(biāo)準(zhǔn)輸入對(duì)象(鍵盤(pán))時(shí),必須包含<iostream>頭文件
以及按命名空間使用方法使用std。是的,iostream也是一個(gè)頭文件噢。

2、cout和cin是全局的流對(duì)象,它們分別是ostream和istream類(lèi)型的對(duì)象。而endl是特殊的C++符號(hào),表示換行輸出,他們都包含在包含在<iostream>頭文件中。

3、<<是流插入運(yùn)算符,>>是流提取運(yùn)算符。它們是不是和我們C語(yǔ)言學(xué)到的左移和右移一模一樣?是的,這實(shí)際上是一種運(yùn)算符重載,我們后續(xù)會(huì)提到。

4、使用C++輸入輸出更方便,不需要像printf/scanf輸入輸出時(shí)那樣需要手動(dòng)控制格式,即%d、%f等等。C++的輸入輸出可以自動(dòng)識(shí)別變量類(lèi)型。


注意:早期標(biāo)準(zhǔn)庫(kù)將所有功能在全局域中實(shí)現(xiàn),聲明在.h后綴的頭文件中,使用時(shí)只需包含對(duì)應(yīng)頭文件即可,后來(lái)將其實(shí)現(xiàn)在std命名空間下,為了和C語(yǔ)言頭文件區(qū)分,也為了正確使用命名空間,規(guī)定C++頭文件不帶.h,這就是為什么<iostream>也是頭文件的原因。舊編譯器(vc 6.0)中還支持<iostream.h>格式,后續(xù)編譯器已不支持,因此推薦使用<iostream>+std的方式。


六. 缺省參數(shù)

6.1 缺省參數(shù)的概念

? ? ??缺省參數(shù)是聲明或定義函數(shù)時(shí)為函數(shù)的參數(shù)指定一個(gè)缺省值(默認(rèn)值)。在調(diào)用該函數(shù)時(shí),如果沒(méi)有指定實(shí)參則采用該形參的缺省值,否則使用指定的實(shí)參。具體形式如下:

#include<iostream>
using namespace std;

void Func(int a = 0) //給定缺省值0
{
	cout << a << endl;
}

int main()
{
	Func(); // 沒(méi)有傳參時(shí),使用參數(shù)的默認(rèn)值
	Func(10); // 傳參時(shí),使用指定的實(shí)參
	return 0;
}

6.2 缺省參數(shù)的分類(lèi)

? ? ? ?缺省參數(shù)分為全缺省參數(shù)半缺省參數(shù)

? ? ? ?全缺省參數(shù)

? ? ? ?即所以參數(shù)都帶有缺省值【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間

void Func(int a = 10, int b = 20, int c = 30)
{
    cout<<"a = "<<a<<endl;
    cout<<"b = "<<b<<endl;
    cout<<"c = "<<c<<endl;
}
int main()
{
	Func(); 
	Func(10); 
    Func(20,30,40); 
	return 0;
}

? ? ? ?半缺省參數(shù)

? ? ? ??即部分參數(shù)都帶有缺省值【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間

void Func(int a, int b = 10, int c = 20) //除了a其余參數(shù)都有缺省值
{
    cout<<"a = "<<a<<endl;
    cout<<"b = "<<b<<endl;
    cout<<"c = "<<c<<endl;
}

int main()
{
	Func();  //錯(cuò)誤調(diào)用,第一個(gè)參數(shù)沒(méi)有缺省值,需要傳參
	Func(10); //第一個(gè)參數(shù)傳入10,其余參數(shù)用缺省值
    Func(20,30,40); //全部用指定的實(shí)參
	return 0;
}

????????注意事項(xiàng)

  • 規(guī)定半缺省參數(shù)必須從右往左依次給出,不能間隔著給。示例如下:
    //錯(cuò)誤寫(xiě)法,必須從右往左不間斷
    void Func(int a = 10, int b, int c) {};
    void Func(int a = 10, int b = 20, int c) {};
    void Func(int a = 10, int b, int c = 30) {};
    
    //正確寫(xiě)法
    void Func(int a, int b, int c = 30) {};
    void Func(int a, int b = 20, int c = 30) {};
  • 缺省參數(shù)不能在函數(shù)聲明和定義中同時(shí)出現(xiàn)。其目的是為了防止我們?cè)诼暶骱投x中給出了不同的缺省值,從而導(dǎo)致歧義。

    //錯(cuò)誤的寫(xiě)法
    //test.h
    void Func(int a = 10);
    // a
    test.cpp
    void Func(int a = 20)
    {}
  • 缺省值必須是常量或者全局變量

  • C語(yǔ)言不支持帶缺省參數(shù)的函數(shù)(編譯器不支持)


七. 函數(shù)重載?

7.1 函數(shù)重載的概念

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

假設(shè)我們要寫(xiě)一個(gè)Add函數(shù)實(shí)現(xiàn)兩個(gè)整型以及兩個(gè)浮點(diǎn)型的相加,在C語(yǔ)言中,我們應(yīng)該這么寫(xiě):

//C語(yǔ)言寫(xiě)法
int iAdd(int x, int y)
{
	return x + y;
}
double dAdd(double x, double y)
{
	return x + y;
}
int main()
{
	iAdd(1, 2);
	dAdd(1.0, 2.0);
	return 0;
}

由于實(shí)參的類(lèi)型不同,我們需要寫(xiě)兩個(gè)Add函數(shù)分別實(shí)現(xiàn)整形和浮點(diǎn)型的相加,并且為了避免重定義,兩個(gè)函數(shù)名必須不同,難道這不覺(jué)得很別扭嗎【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間

C++引入了函數(shù)重載,我們就能很舒服的使用相同名稱來(lái)定義這兩個(gè)參數(shù)不同的函數(shù):

//C++寫(xiě)法,兩個(gè)Add函數(shù)構(gòu)成函數(shù)重載
int Add(int x, int y)
{
	return x + y;
}

double Add(double x, double y)
{
	return x + y;
}

int main()
{
	Add(1, 2);
	Add(1.0, 2.0);
	return 0;
}

7.2 函數(shù)重載的條件

? ? ? ?C++構(gòu)成函數(shù)重載的條件是形參列表必須不同。形參列表不同分為以下三種:

? ? ? ? 1、參數(shù)個(gè)數(shù)不同

#include<iostream>
using namespace std;
//2、參數(shù)個(gè)數(shù)不同
void Fun(int x)
{
	cout << "void Fun(int x)" << endl;
}
void Fun()
{
	cout << "void Fun()" << endl;
}

int main()
{
	Fun(1); //調(diào)用第一個(gè)
	Fun(); //調(diào)用第二個(gè)
}

【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間

? ? ? ? 2、參數(shù)類(lèi)型不同

#include<iostream>
using namespace std;
//2、參數(shù)類(lèi)型不同
int Add(int x, int y)
{
	cout << "int Add(int x, int y)" << endl;
	return x + y;
}
double Add(double x, double y)
{
	cout << "double Add(double x, double y)" << endl;
	return x + y;
}

int main()
{
	Add(1, 2); //調(diào)用第一個(gè)
	Add(1.0, 2.0); //調(diào)用第二個(gè)
}

【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間

? ? ? ? 3、參數(shù)順序不同

#include<iostream>
using namespace std;
//3、參數(shù)順序不同
void Fun(int x , double y)
{
	cout << "void Fun(int x , double y)" << endl;
}
void Fun(double x, int y)
{
	cout << "void Fun(double x, int y)" << endl;
}

int main()
{
	Fun(1,2.0); //調(diào)用第一個(gè)
	Fun(2.0,1); //調(diào)用第二個(gè)
}

【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間

注意:是參數(shù)類(lèi)型的順序不同,而不是變量名順序不同,即以下寫(xiě)法不構(gòu)成函數(shù)重載:

//變量名順序不同不構(gòu)成函數(shù)重載,形參的名稱只是標(biāo)識(shí),本質(zhì)上還是同一個(gè)函數(shù)
void Fun(int x , double y){};
void Fun(int y , double x){};

?? ? ? ? 4、缺省函數(shù)的重載

? ? ? ? ?此外,帶缺省參數(shù)的函數(shù)也可以構(gòu)成函數(shù)重載,編譯并不會(huì)報(bào)錯(cuò),但使用上可能會(huì)出現(xiàn)一些很尷尬的問(wèn)題,舉例如下【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間

#include<iostream>
using namespace std;
//4、缺省函數(shù)的重載
void Fun(int x, double y = 1.0)
{
	cout << "void Fun(int x , double y = 1.0 )" << endl;
}
void Fun(int x)
{
	cout << "void Fun(int x)" << endl;
}
int main()
{
	Fun(1, 2.0); //這里會(huì)調(diào)用第一個(gè)函數(shù)沒(méi)問(wèn)題
	Fun(1); //此時(shí)既可以調(diào)用第一個(gè)函數(shù),也可以調(diào)用第二個(gè)函數(shù),存在歧義,會(huì)報(bào)錯(cuò)
}

由于缺省函數(shù)的重載很容易引發(fā)歧義,顧我們一般不也會(huì)這么寫(xiě)【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間??

7.3 C++支持函數(shù)重載的原因

????????可能會(huì)有很多小伙伴會(huì)疑惑:為什么C++支持函數(shù)重載,而C語(yǔ)言不支持函數(shù)重載呢?、

????????在C/C++中,一個(gè)程序要運(yùn)行起來(lái),需要經(jīng)歷以下幾個(gè)階段:預(yù)處理、編譯、匯編鏈接
【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間

【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間

我們發(fā)現(xiàn),每個(gè).c文件都會(huì)生成屬于自己的符號(hào)表。main.c文件中sum函數(shù)只是聲明,故在符號(hào)表中并沒(méi)有sum函數(shù)的地址。而sum.c文件中的sum函數(shù)是定義,故在符號(hào)表中存在著sum函數(shù)的地址。當(dāng)鏈接器進(jìn)行鏈接時(shí),就會(huì)將兩張符號(hào)表進(jìn)行合并,此時(shí)符號(hào)表中既有main函數(shù)的地址,也有sum函數(shù)的地址,程序便可以正常運(yùn)行。【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間


但是,如果兩個(gè)文件中的sum函數(shù)都是定義呢?如下:?【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間

由于兩個(gè)符號(hào)表中的sum函數(shù)都是有效地址,進(jìn)行符號(hào)表合并后,符號(hào)表就會(huì)出現(xiàn)上面的相同符號(hào)不同地址的情況,會(huì)引發(fā)符號(hào)表的歧義,此時(shí)我們就不知道該去哪個(gè)地方找sum函數(shù)了,會(huì)報(bào)重定義的錯(cuò)誤。【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間

?這就是為什么C語(yǔ)言不能定義同名函數(shù)的原因:重定義會(huì)引發(fā)符號(hào)表的歧義


那就有人會(huì)想:C語(yǔ)言不行,那憑什么放到C++就可以呢,搞特殊?【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間

首先要說(shuō)明的是,上面的兩個(gè)Add函數(shù)放到C++依然不構(gòu)成函數(shù)重載,因?yàn)樗鼈兊念?lèi)型相同。那C++為什么類(lèi)型不同就允許同名函數(shù)的存在呢?這是因?yàn)镃++引入了函數(shù)名修飾規(guī)則,函數(shù)在符號(hào)表中除了名稱,還一并將參數(shù)類(lèi)型代入修飾。

不同的編譯器下的函數(shù)名修飾規(guī)則可能有所不同,由于VS的函數(shù)名修飾規(guī)則過(guò)于復(fù)雜,下面我們采用Linux下的g++來(lái)進(jìn)行演示【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間

源代碼清單

int Add(int x,int y)
{
    return x + y;
}

double Add(double x,double y)
{
    return x + y;
}

int main()
{
    return 0;
}

采用gcc編譯(C語(yǔ)言)

為了正確進(jìn)行編譯,將第一個(gè)Add函數(shù)改為Add1,第二個(gè)改為Add2。編譯后查看匯編代碼如下:

【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間

【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間

采用g++編譯(C++)

【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間

【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間

Linux系統(tǒng)下的g++編譯器將函數(shù)修飾后變成【_Z+函數(shù)長(zhǎng)度+函數(shù)名+類(lèi)型首字母】的形式,形參的個(gè)數(shù)、順序以及類(lèi)型不同都會(huì)使得修飾后的函數(shù)名不同【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載),C++深入淺出,c++,開(kāi)發(fā)語(yǔ)言,筆記,函數(shù)重載,缺省參數(shù),命名空間


?總結(jié)提煉

  1. 在linux下,采用gcc編譯完成后,函數(shù)名字沒(méi)有發(fā)生改變。
  2. 在linux下,采用g++編譯完成后,函數(shù)名字的修飾發(fā)生改變,編譯器將函數(shù)參數(shù)類(lèi)型信息添加到修改后的名字中。
  3. C語(yǔ)言沒(méi)辦法支持重載是因?yàn)橥瘮?shù)沒(méi)辦法區(qū)分。而C++是通過(guò)函數(shù)修飾規(guī)則來(lái)區(qū)分,只要參數(shù)不同,修飾出來(lái)的名字就不一樣,顧支持重載。
  4. 如果兩個(gè)函數(shù)僅僅是返回值不同是不構(gòu)成重載的,因?yàn)檎{(diào)用時(shí)編譯器沒(méi)辦法區(qū)分。

以上,就是本期的全部?jī)?nèi)容啦??

制作不易,能否點(diǎn)個(gè)贊再走呢??文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-644047.html

到了這里,關(guān)于【C++深入淺出】初識(shí)C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(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)文章

  • 在瘋狂三月之后,深入淺出分析AIGC的核心價(jià)值 (上篇)|【AI行研&商業(yè)價(jià)值分析】

    在瘋狂三月之后,深入淺出分析AIGC的核心價(jià)值 (上篇)|【AI行研&商業(yè)價(jià)值分析】

    Rocky Ding WeThinkIn 【AI行研商業(yè)價(jià)值分析】欄目專(zhuān)注于分享AI行業(yè)中最新熱點(diǎn)/風(fēng)口的思考與判斷。也歡迎大家提出寶貴的優(yōu)化建議,一起交流學(xué)習(xí)?? 大家好,我是Rocky。 2023年3月21日,微軟創(chuàng)始人比爾·蓋茨在其博客文章《The Age of AI has begun》中表示, 自從1980年首次看到圖形用

    2024年02月09日
    瀏覽(88)
  • 深入淺出C++ ——線程庫(kù)

    深入淺出C++ ——線程庫(kù)

    ??在C++11之前,涉及到多線程問(wèn)題,都是和平臺(tái)相關(guān)的,比如windows和linux下各有自己的接口,這使得代碼的可移植性比較差。C++11中最重要的特性就是對(duì)線程進(jìn)行支持了,使得C++在并行編程時(shí)不需要依賴第三方庫(kù),而且在原子操作中還引入了 原子類(lèi) 的概念。要使用標(biāo)準(zhǔn)庫(kù)中

    2024年02月03日
    瀏覽(98)
  • 深入淺出C++——C++的類(lèi)型轉(zhuǎn)換

    在C語(yǔ)言中,如果 賦值運(yùn)算符左右兩側(cè)類(lèi)型不同 ,或者形參與實(shí)參類(lèi)型不匹配,或者 返回值類(lèi)型與接收返回值類(lèi)型不一致 時(shí),就需要發(fā)生類(lèi)型轉(zhuǎn)化。 C語(yǔ)言中總共有兩種形式的類(lèi)型轉(zhuǎn)換: 隱式類(lèi)型轉(zhuǎn)換:編譯器在編譯階段自動(dòng)進(jìn)行轉(zhuǎn)換,不能轉(zhuǎn)就編譯失敗。 顯式類(lèi)型轉(zhuǎn)換:

    2024年02月07日
    瀏覽(94)
  • 深入淺出C++ ——C++11

    深入淺出C++ ——C++11

    ????1998年是C++標(biāo)準(zhǔn)委員會(huì)成立的第一年,本來(lái)計(jì)劃以后每5年視實(shí)際需要更新一次標(biāo)準(zhǔn),C++國(guó)際標(biāo)準(zhǔn)委員會(huì)在研究C++ 03的下一個(gè)版本的時(shí)候,一開(kāi)始計(jì)劃是2007年發(fā)布,所以最初這個(gè)標(biāo)準(zhǔn)叫C++07。但是到06年的時(shí)候,官方覺(jué)得2007年肯定完不成C++ 07,而且官方覺(jué)得2008年可能也

    2024年02月02日
    瀏覽(35)
  • 【C++深入淺出】類(lèi)和對(duì)象下篇

    【C++深入淺出】類(lèi)和對(duì)象下篇

    ? ? ? ? 老樣子,先來(lái)回顧一下上期的內(nèi)容:上期我們著重學(xué)了C++類(lèi)中的六大 默認(rèn)成員函數(shù) ,并自己動(dòng)手實(shí)現(xiàn)了一個(gè) 日期類(lèi) ,相信各位對(duì)C++中的類(lèi)已經(jīng)有了一定程度的了解。本期就是類(lèi)和對(duì)象的最后一篇啦,終于要結(jié)束咯,吧唧吧唧 ? ? ? ? 話不多說(shuō),開(kāi)吃咯?。?! 2.1

    2024年02月08日
    瀏覽(103)
  • 【C++】模板初階 【 深入淺出理解 模板 】

    【C++】模板初階 【 深入淺出理解 模板 】

    如何實(shí)現(xiàn)一個(gè)通用的交換函數(shù)呢? 使用函數(shù)重載雖然可以實(shí)現(xiàn) ,但是有一下幾個(gè)不好的地方: 重載的函數(shù) 僅僅是類(lèi)型不同 ,代碼復(fù)用率比較低, 只要有新類(lèi)型出現(xiàn)時(shí),就需要用戶自己增加對(duì)應(yīng)的函數(shù) 代碼的可維護(hù)性比較低,一個(gè)出錯(cuò)可能所有的重載均出錯(cuò) 那能否 告訴編

    2024年02月05日
    瀏覽(84)
  • 【C++深入淺出】日期類(lèi)的實(shí)現(xiàn)

    【C++深入淺出】日期類(lèi)的實(shí)現(xiàn)

    目錄 一. 前言? 二. 日期類(lèi)的框架 三. 日期類(lèi)的實(shí)現(xiàn) 3.1 構(gòu)造函數(shù) 3.2 析構(gòu)函數(shù) 3.3 賦值運(yùn)算符重載 3.4 關(guān)系運(yùn)算符重載 3.5 日期 +/-?天數(shù) 3.6 自增與自減運(yùn)算符重載 3.7 日期 - 日期 四. 完整代碼? ? ? ? ? 通過(guò)前面兩期類(lèi)和對(duì)象的學(xué)習(xí),我們已經(jīng)對(duì)C++的類(lèi)有了一定的了解。本期我

    2024年02月07日
    瀏覽(91)
  • 【C++】深入淺出STL之string類(lèi)

    【C++】深入淺出STL之string類(lèi)

    文章篇幅較長(zhǎng),越7萬(wàn)余字,建議電腦端訪問(wèn) 本文我們就要來(lái)說(shuō)一說(shuō)STL中的string類(lèi),這也是我們?cè)趯?xiě)C++代碼的時(shí)候使用最多的 首先要來(lái)談的一點(diǎn)就是為什么要學(xué)習(xí)string類(lèi) string 意為字符串,那回憶一下我們?cè)贑語(yǔ)言階段所學(xué)習(xí)的字符串,是以 \\\'\\0\\\' 結(jié)尾的一些字符的集合,為了操

    2024年02月15日
    瀏覽(89)
  • 【C++】深入淺出STL之vector類(lèi)

    【C++】深入淺出STL之vector類(lèi)

    文章篇幅較長(zhǎng),越3萬(wàn)余字,建議電腦端訪問(wèn) 大家好,在上一文中,我們重點(diǎn)介紹了 STL中的string類(lèi),明白了如何去操作字符串。 本文我們將要來(lái)介紹的是STL中的vector類(lèi) vector的文檔介紹 vector是表示可變大小數(shù)組的序列容器。 就像數(shù)組一樣,vector也采用的連續(xù)存儲(chǔ)空間來(lái)存儲(chǔ)元

    2024年02月13日
    瀏覽(85)
  • 【重學(xué)C++】02 脫離指針陷阱:深入淺出 C++ 智能指針

    【重學(xué)C++】02 脫離指針陷阱:深入淺出 C++ 智能指針 大家好,今天是【重學(xué)C++】系列的第二講,我們來(lái)聊聊C++的智能指針。 在上一講《01 C++如何進(jìn)行內(nèi)存資源管理》中,提到了對(duì)于堆上的內(nèi)存資源,需要我們手動(dòng)分配和釋放。管理這些資源是個(gè)技術(shù)活,一不小心,就會(huì)導(dǎo)致內(nèi)

    2024年02月05日
    瀏覽(91)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包