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

【C++初階】C++基礎(chǔ)(上)——C++關(guān)鍵字、命名空間、C++輸入&輸出、缺省參數(shù)、函數(shù)重載

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

目錄

1.?C++關(guān)鍵字

2. 命名空間

2.1?命名空間的定義

2.2?命名空間的使用

3. C++輸入&輸出

4.?缺省參數(shù)

4.1?缺省參數(shù)概念

4.2?缺省參數(shù)分類

5.?函數(shù)重載

5.1?函數(shù)重載概念

5.2 C++支持函數(shù)重載的原理——名字修飾(name Mingling)

5.3?extern "C"


???沒有堅(jiān)持的努力,本質(zhì)上并沒有多大的意義。


1.?C++關(guān)鍵字

C++總計(jì)63個(gè)關(guān)鍵字,C語言32個(gè)關(guān)鍵字

【C++初階】C++基礎(chǔ)(上)——C++關(guān)鍵字、命名空間、C++輸入&輸出、缺省參數(shù)、函數(shù)重載,筆記,C++,c++,開發(fā)語言

#include <iostream>?相當(dāng)于C語言中的 #include<stdio.h>

2. 命名空間

2.1?命名空間的定義

同一個(gè)作用域里面,是不能有同名變量的。

命名沖突,在C語言沒有很好的解決這個(gè)問題,但是CPP引入了namespace來解決這個(gè)問題。

使用 命名空間的目的是 對標(biāo)識(shí)符的名稱進(jìn)行本地化,以 避免命名沖突或名字 污染(一個(gè)命名空間就定義了一個(gè)新的作用域)

?::域作用限定符

命名空間可以定義變量

#include <iostream>
//這是一個(gè)命名空間,可以定義變量、函數(shù)、類型
namespace ky
{
	int a = 0;
	int c = 2;
}

int b = 0;
int c = 1;

int main()
{
	int b = 1;
	int a = 1;
	printf("%d\n", b);//b = 1,訪問局部變量
	printf("%d\n", ::b);//b = 0, 訪問全局變量//::域作用限定符
	printf("%d\n", a);//a = 1;
	printf("%d\n", ky::a);//a = 0;
	printf("%d\n", c);//1
	printf("%d\n", ::c);//1
	printf("%d\n", ky::c);//2
	return 0;
}

命名空間可以定義函數(shù)、類型

#include <iostream>
namespace yyqx
{
	//定義函數(shù)
	void f()
	{
		printf("void f()\n");
	}
	//定義結(jié)構(gòu)
	struct ListNode
	{
		int val;
		struct ListNode* next;
	};

}

namespace ky
{
	struct ListNode
	{
		int val;
		struct ListNode* next;
	};

}

int f = 0;
int main()
{
	printf("%d\n", f);//0
	printf("%p\n", yyqx::f);//結(jié)構(gòu)體的地址
	yyqx::ListNode* n1 = NULL;
	ky::ListNode*  n2 = NULL;
	return 0;
}

命名空間可以嵌套而且同名的命名空間是可以同時(shí)存在的,編譯器編譯時(shí)會(huì)將其合并。

代碼1展示:?

#include <iostream>

namespace yyqx
{
	int a = 1;
	namespace A
	{
		struct Node
		{
			int val = 0;
			struct Node* next= NULL;
		};
	}
	
}

namespace yyqx
{
	int b = 1;
	namespace B
	{
		struct Node
		{
			int val = 0;
			struct Node* next = NULL;
		};
	}
	
}

int main()
{
	struct yyqx::A::Node n1;
	struct yyqx::B::Node n2;

	return 0;
}

命名空間不影響生命周期,是全局變量還是全局變量,只是命名發(fā)生沖突時(shí),進(jìn)行隔離的作用?!久臻g只能放在全局】

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

2.2?命名空間的使用

(1)加命名空間名稱及作用域限定符

(2)使用using將命名空間中某個(gè)成員引入? ??

using yyqx::a;//代碼1//釋放yyqx命名空間里面的變量a
//釋放的是命名空間就加namespace,如果釋放的不是命名空間而是命名空間里的數(shù)據(jù),就不用加namespace

(3)使用using namespace 命名空間名稱引入

[我們經(jīng)常使用第二種,既不會(huì)容易發(fā)生沖突,又不會(huì)特別麻煩]

using namespace yyqx;//意思是把yyqx這個(gè)命名空間定義的內(nèi)容釋放出來
int main()
{
	struct A::Node n1;
	struct B::Node n2;

	return 0;
}
using namespace yyqx;//意思是把yyqx這個(gè)命名空間定義的內(nèi)容釋放出來
using namespace A;//第二層釋放
//因?yàn)锳在yyqx里面,所以上面兩行的內(nèi)容不能進(jìn)行交換
int main()
{
	struct Node n1;
	struct B::Node n2;

	return 0;
}

?這里代碼釋放A,就不能釋放B,否則就發(fā)生命名沖突(using相當(dāng)于沒有命名空間)

using namespace yyqx::A;

這個(gè)代碼相當(dāng)于釋放A,但是并沒有釋放yyqx;

?using namespace std;//std 封C++庫的命名空間

3. C++輸入&輸出

#include <iostream>
using namespace std;

int main()
{
	int a = 0;
	cin >> a;// >>流提取運(yùn)算法,相當(dāng)于scanf
	cout << a;// << 流插入運(yùn)算法

	return 0;
}

【C++初階】C++基礎(chǔ)(上)——C++關(guān)鍵字、命名空間、C++輸入&輸出、缺省參數(shù)、函數(shù)重載,筆記,C++,c++,開發(fā)語言

#include <iostream>
using namespace std;

int main()
{
	int a = 0;
	double b = 0;
	cin >> a >> b;// >>流提取運(yùn)算法,相當(dāng)于scanf
	cout << a << " " << b << endl;// << 流插入運(yùn)算法 endl相當(dāng)于換行
	cout << a << ":" << b << '\n';
	cout << "hello world" << endl;
	return 0;
}

【C++初階】C++基礎(chǔ)(上)——C++關(guān)鍵字、命名空間、C++輸入&輸出、缺省參數(shù)、函數(shù)重載,筆記,C++,c++,開發(fā)語言

(1)endl相當(dāng)于換行'\n'

(2)<assert.h>在C++中也可以用,但是沒有命名空間,<cassert>就有命名空間了

(3)使用 cout 標(biāo)準(zhǔn)輸出對象 ( 控制臺(tái) )cin 標(biāo)準(zhǔn)輸入對象 ( 鍵盤 )時(shí),必須 包含 < iostream > 頭文件以及 按命名空間使用方法使用std
(4)C++的輸入輸出可以自動(dòng)識(shí)別變量類型。

(5)舊編譯器(vc 6.0)中還支持<iostream.h>格式,<iostream.h>格式?jīng)]有命名空間

4.?缺省參數(shù)

4.1?缺省參數(shù)概念

缺省參數(shù)是 聲明或定義函數(shù)時(shí)為函數(shù)的 參數(shù)指定一個(gè)缺省值。在調(diào)用該函數(shù)時(shí),如果沒有指定實(shí)參則采用該形參的缺省值,否則使用指定的實(shí)參。
#include <iostream>
using namespace std;

//缺省參數(shù)(默認(rèn)參數(shù))
void Test(int a = 0)
{
	cout << a << endl;
}

int main()
{
	Test();//沒有傳參時(shí),使用參數(shù)的默認(rèn)值a = 0
	Test(1);//傳參時(shí),使用指定的實(shí)參 a = 1;
}

4.2?缺省參數(shù)分類

(1)全缺省參數(shù)(全默認(rèn)參數(shù))

void Test(int a = 10, int b = 20, int c = 30)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;
}

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

void Test(int a , int b = 20, int c = 30)//必須從右向左缺省,并且是連續(xù)的
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;
}
1. 半缺省參數(shù)必須 從右往左依次來給出,不能間隔著給
2. 缺省參數(shù)不能在函數(shù)聲明和定義中同時(shí)出現(xiàn)(最好在聲明給;聲明不給,定義給也不可以)
3.缺省值必須是常量或者全局變量
4. C語言不支持(編譯器不支持)

5.?函數(shù)重載

5.1?函數(shù)重載概念

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

(1)參數(shù)類型不同

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

(2)參數(shù)個(gè)數(shù)不同

void f()
{
	cout << "f()" << endl;
}
void f(int a)
{
	cout << "f(int a)" << endl;
}

(3)參數(shù)類型順序不同

void f(int a, char b)
{
	cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
	cout << "f(char b, int a)" << endl;
}

C語言不支持同名函數(shù),CPP支持同名函數(shù)。要求:參數(shù)名相同,參數(shù)不同

代碼:

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

?上述代碼不是函數(shù)重載,因?yàn)楹瘮?shù)進(jìn)行調(diào)用的時(shí)候,并不知道要調(diào)用哪一個(gè)函數(shù)。(僅僅只有返回值不同是不能構(gòu)造函數(shù)重載的)函數(shù)重載要求參數(shù)不同。而跟返回值沒關(guān)系。

5.2 C++支持函數(shù)重載的原理——名字修飾(name Mingling)

C語言不支持重載,C++支持重載。C++是如何支持的?為什么C語言不支持?

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

預(yù)處理:頭文件展開、宏替換、條件編譯、去掉注釋

編譯:檢查語法、生成匯編代碼

匯編:把匯編代碼轉(zhuǎn)換成二進(jìn)制的機(jī)器碼

鏈接:找調(diào)用函數(shù)的地址,鏈接對應(yīng)上,合并到一起

(1)實(shí)際項(xiàng)目通常是由多個(gè)頭文件和多個(gè)源文件構(gòu)成,【當(dāng)前a.cpp中調(diào)用了b.cpp中定義的Add函數(shù)時(shí)】,編譯鏈接,a.o的目標(biāo)文件中沒有Add的函數(shù)地址,因?yàn)锳dd是在b.cpp中定義的,所以Add的地址在b.o中。那么怎么辦呢?

(2)?所以鏈接階段就是專門處理這種問題, 鏈接器看到 a.o 調(diào)用 Add ,但是沒有 Add 的地址,就會(huì)到 b.o 的符 號(hào)表中找 Add 的地址,然后鏈接到一起
//函數(shù)1
void f(int a, double b)
{
	printf("%d %lf\n", a, b);
}
//函數(shù)2
void f(double b, int a)
{
	printf("%lf %d\n", b, a);
}

鏈接的時(shí)候,有符號(hào)表和函數(shù)調(diào)用指令。?

C語言中,函數(shù)1和函數(shù)2,生成的符號(hào)表,都是f,所以會(huì)發(fā)生沖突,所以會(huì)發(fā)生錯(cuò)誤,C語言就不支持函數(shù)重載

【C++初階】C++基礎(chǔ)(上)——C++關(guān)鍵字、命名空間、C++輸入&輸出、缺省參數(shù)、函數(shù)重載,筆記,C++,c++,開發(fā)語言

?但是在C++中,函數(shù)1和函數(shù)2生成的符號(hào)表是不同的,所以C++就支持函數(shù)重載

【C++初階】C++基礎(chǔ)(上)——C++關(guān)鍵字、命名空間、C++輸入&輸出、缺省參數(shù)、函數(shù)重載,筆記,C++,c++,開發(fā)語言

?【C++初階】C++基礎(chǔ)(上)——C++關(guān)鍵字、命名空間、C++輸入&輸出、缺省參數(shù)、函數(shù)重載,筆記,C++,c++,開發(fā)語言

?總而言之還是函數(shù)修飾后的名字不同,C語言中仍然是函數(shù)名,而C++中是【_Z+函數(shù)長度+函數(shù)名+類型首字母(如果是指針就多加一個(gè)P)】通過這里就理解了C語言沒辦法支持重載,因?yàn)橥瘮?shù)沒辦法區(qū)分。而C++是通過函數(shù)修飾規(guī)則來區(qū)分,只要參數(shù)不同,修飾出來的名字就不一樣,就支持了重載

5.3?extern "C"

在C語言中,extern "C"?可以添加在函數(shù)聲明的前面,也可以extern "C"后添加一個(gè)花括號(hào),然后把函數(shù)聲明括起來
在函數(shù)前加 extern "C",作用是告訴編譯器,將該函數(shù)按照C 語言規(guī)則來編譯。

C語言是可以調(diào)用C++和C語言的靜態(tài)庫和動(dòng)態(tài)庫的。C++是可以調(diào)用C++和C語言的靜態(tài)庫和動(dòng)態(tài)庫的。

C++調(diào)用C靜態(tài)庫:(雖然C++兼容C,為什么需要用到extern "C"呢?因?yàn)楹瘮?shù)的命名修飾是不一樣的,所以想調(diào)用C的函數(shù)的時(shí)候,符號(hào)表找不到我們想要的內(nèi)容)

extern "C"
{
    #include "../../Stack_C/Stack_C/stack.h"
}

然后,右擊屬性->鏈接器->常規(guī)->附加庫目錄->找到靜態(tài)庫文件,最后右擊屬性->鏈接器->輸入->附加依賴項(xiàng)Stack_C.lib;即可

C語言調(diào)用C++:(C中沒有extern "C",只有C++有)

在C++的文件中,函數(shù)前面添加EXTERN_C(這個(gè)是隨意定義的),然后前面再寫一個(gè)條件編譯(__cplusplus是C++中)[兩個(gè)杠]

【(第一種寫法)條件編譯:當(dāng)在C++中,函數(shù)前面經(jīng)過宏替換就是extern "C",在C語言中,就相當(dāng)于什么也沒有】

【C++初階】C++基礎(chǔ)(上)——C++關(guān)鍵字、命名空間、C++輸入&輸出、缺省參數(shù)、函數(shù)重載,筆記,C++,c++,開發(fā)語言

?(第二種寫法)

【C++初階】C++基礎(chǔ)(上)——C++關(guān)鍵字、命名空間、C++輸入&輸出、缺省參數(shù)、函數(shù)重載,筆記,C++,c++,開發(fā)語言

?然后,右擊屬性->鏈接器->常規(guī)->附加庫目錄->找到靜態(tài)庫文件,最后右擊屬性->鏈接器->輸入->附加依賴項(xiàng)Stack_CPP.lib;即可

?文章來源地址http://www.zghlxwxcb.cn/news/detail-611741.html

?

到了這里,關(guān)于【C++初階】C++基礎(chǔ)(上)——C++關(guān)鍵字、命名空間、C++輸入&輸出、缺省參數(shù)、函數(shù)重載的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包