目錄
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)鍵字
#include <iostream>?相當(dāng)于C語言中的 #include<stdio.h>
2. 命名空間
2.1?命名空間的定義
同一個(gè)作用域里面,是不能有同名變量的。
命名沖突,在C語言沒有很好的解決這個(gè)問題,但是CPP引入了namespace來解決這個(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只能放在全局】
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;
}
#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;
}
(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ù)概念
#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ù)重載概念
(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++中,函數(shù)1和函數(shù)2生成的符號(hào)表是不同的,所以C++就支持函數(shù)重載
?
?總而言之還是函數(shù)修飾后的名字不同,C語言中仍然是函數(shù)名,而C++中是【_Z+函數(shù)長度+函數(shù)名+類型首字母(如果是指針就多加一個(gè)P)】通過這里就理解了C語言沒辦法支持重載,因?yàn)橥瘮?shù)沒辦法區(qū)分。而C++是通過函數(shù)修飾規(guī)則來區(qū)分,只要參數(shù)不同,修飾出來的名字就不一樣,就支持了重載。
5.3?extern "C"
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)于什么也沒有】
?(第二種寫法)
?然后,右擊屬性->鏈接器->常規(guī)->附加庫目錄->找到靜態(tài)庫文件,最后右擊屬性->鏈接器->輸入->附加依賴項(xiàng)Stack_CPP.lib;即可
?文章來源地址http://www.zghlxwxcb.cn/news/detail-611741.html文章來源: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)!