本章主要內容:html
你們都知道,在生活中,動詞和不一樣的名詞搭配一塊兒,意義都會大有不一樣,好比」玩」:ios
因此在C++中,便出現了函數重載(JAVA,c#等語言都有函數重載)c#
1.函數重載(overload)數組
表示有多個相同的函數名(相似上面的」玩」),可是參數表不一樣(相似上面的名詞)函數
參數表不一樣主要有如下幾種post
1.1舉個栗子
學習
#include <stdio.h> int func(char *str) //func1 { printf("str=%s\n",str); } int func(int a) //func2 { printf("a=%d\n",a); } int func(int a,int b) //func3 { printf("a*b =%d\n",a*b); } int main() { char s[10]="hello"; func(s); func(10); func(5,5); }
輸出結果:url
str=hello a=10 a*b =25
經過上個栗子能夠看到,函數名相同,參數不一樣,而意義卻大有不一樣.spa
1.2那這些重載函數的入口地址是否相同指針
修改上面栗子的main()函數,以下圖所示:
能夠看到輸出結果,每一個函數的入口地址都不同(重載函數的入口地址,必須使用強制轉換來獲取)
也能夠經過nm命令來查看符號表,以下圖所示:
注意:
2.C++與C代碼相互調用
當C++想調用C裏的某個函數時,則使用extern 「C」
仍是舉個栗子,經過C++調用C裏面的add()函數
1) 首先建立3個文件
add.c代碼以下:
#include "add.h" int add(int a,int b) { return a+b; }
add.h代碼以下:
int add(int a,int b);
main.cpp代碼以下:
#include <stdio.h> #ifdef __cplusplus extern "C" //經過C方式來編譯add.h,也就是add()函數 { #include "add.h" } #endif int main() { printf("%d \n",add(1,3)); return 0; }
main.cpp裏的__cplusplus宏是C++編譯器自帶的,而extern "C"只有C++裏纔有定義.
因此經過__cplusplus宏判斷,可使main.cpp在C或C++編譯器下都能編譯運行.
2)編譯運行:
gcc -c add.c //生成add.o文件 g++ -o main main.cpp add.o //生成main可執行文件 ./main
3)輸出結果:
3. C++中的動態內存分配
3.1 回顧C:
在C語言中,你們都知道使用malloc()和free(),好比:
int *p = malloc(10*sizeof(int)); //申請10個int型空間 if(p) { ... ... free(p); }
從上面栗子,能夠看到C是經過庫函數完成內存分配的
3.2而在C++中,則經過new關鍵字進行內存申請,delete關鍵字進行內存釋放,好比:
除了上圖例子外,new關鍵字還能夠經過分配並初始化(相似calloc()函數)
例如:
int *p1= new int(1); //動態分配一個int空間給p1,並賦值爲1 float *p2=new float(2.0f); //2.0後面加f,表示2.0是個float類型 char *p3=new char('c');
注意:
3.3 以string爲例,建立string數組
#include <iostream> #include <string> using namespace std; int main() { string *p = new string[10]; for(int i=0;i<10;i++) p[i] = "123"; for(int i=0;i<10;i++) cout<<p[i]<<endl; delete[] p; }
3.3 二維指針示例
以string二維指針爲例:
#include <iostream> #include <string> using namespace std; int main() { string **p = new string*[4]; //建立行數 for(int i=0;i<4;i++) p[i] = new string[3]; //建立列數 for(int i=0;i<4;i++) for(int j=0;j<3;j++) { p[i][j]="123"; cout<<p[i][j] <<endl; } for(int i=0;i<4;i++) delete[] p[i] ; delete[] p; }
4.C++中的命名空間(namespace)
4.1回顧C:
你們都知道,在C語言中,當編譯多個C文件時,可能會遇到同名全局標識符的錯誤,這是由於C語言中的全部全局標識符都是共享同一個做用域
4.2因此C++中便提出命名空間(namespace)的概念
4.3命名空間(namespace)的使用
1)定義一個命名空間:
namespace name //定義一個命名空間,名爲name { int varialbe; //... ... }
2)使用整個命名空間name,並將該空間設爲當前默認命名空間:
using namespace name;
3)使用全局命名空間中的變量:
::varialbe; //因爲::前面沒有命名空間名字,因此使用全局變量
4)使用某個命名空間中的變量:
using name::variable //使用name空間裏的variable變量
4.4 舉個栗子
#include <stdio.h> namespace First //定義First命名空間 { int i = 0; } namespace Second //定義Second命名空間 { int i = 1;namespace Internal //在Second裏,再次定義一個Internal空間(實現嵌套) { struct Position { int x; int y; }; } } int main() { using namespace First; //使用First整個命名空間,成爲該main()的默認空間 using Second::Internal::Position; //使用Second->Internal空間裏的Position結構體 printf("First::i = %d\n", i); printf("Second::i = %d\n", Second::i); Position p = {2, 3}; printf("p.x = %d\n", p.x); printf("p.y = %d\n", p.y); return 0; }
輸出結果:
First::i = 0 Second::i = 1 p.x = 2 p.y = 3
下章接着來學習: 5.C++裏的4種新型類型轉換