4.C++中的函數重載,C++調用C代碼,new/delete關鍵字,namespace(命名空間)

本章主要內容:html

  • 1)函數重載 
  • 2)C++調用C代碼 
  • 3)new/delete關鍵字實現動態內存分配
  • 4)namespace命名空間

你們都知道,在生活中,動詞和不一樣的名詞搭配一塊兒,意義都會大有不一樣,好比」玩」:ios

  • 遊戲
  • 卡牌
  • 足球

因此在C++,便出現了函數重載(JAVA,c#等語言都有函數重載)c#

1.函數重載(overload)數組

表示有多個相同的函數名(相似上面的」玩」),可是參數表不一樣(相似上面的名詞)函數

參數表不一樣主要有如下幾種post

  • 1) 參數個數不一樣
  • 2) 參數類型不一樣
  • 3) 參數順序不一樣

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裏的__cplusplusC++編譯器自帶的,extern "C"只有C++裏纔有定義.

因此經過__cplusplus宏判斷,可使main.cppCC++編譯器下都能編譯運行.

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關鍵字進行內存釋放,好比:

  • Type: 指數據類型,好比int,char,float
  • N:  指申請的數組個數大小

除了上圖例子外,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');

注意:

  • 釋放數組的空間時,必須使用delete[],而不是delete,避免內存泄漏
  • 使用new時,默認值爲隨機值,而對於new()時,則爲0,好比: int *p = new int();  //默認值爲0

 

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)的概念

  • 命名空間會將全局做用域分紅不一樣部分的命令空間,能夠將類,對象,函數等彙集在一個namespace
  • 不一樣命名空間中的標識符能夠同名
  • 命名空間能夠相互嵌套,也就是說A命令空間裏能夠再次定義B命令空間
  • C++,全局做用域也叫默認命名空間

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種新型類型轉換

相關文章
相關標籤/搜索