天天看點

面試中常見的C語言與C++差別的問題(一)

C語言是一種結構化語言,其偏重于資料結構和算法,屬于過程性語言

C++是面向對象的程式設計語言,其偏重于構造對象模型,并讓這個模型能夠契合與之對應的問題。其本質差別是解決問題的思想方法不同

雖然在文法上C++完全相容C語言,但是兩者還是有很多不同之處。下面将詳細講解C和C++不同之處的常見考題

關鍵字static在C和C++差別

C和C++中都有關鍵字static關鍵字,那麼static關鍵字在C和C++中的使用有什麼差別?請簡述之。

分析問題:在C中,用static修飾的變量或函數,主要用來說明這個變量或函數隻能在本檔案代碼塊中通路,而檔案外部的代碼無權通路。并且static修飾的變量存放在段存儲區。主要有以下兩種用途。

1. 定義局部靜态變量

局部靜态變量存儲在靜态存儲區,在程式運作期間都不會釋放,隻在聲明時進行初始化,而且隻能初始化一次,如果沒有初始化,其自動初始化為0或空字元。具有局部變量的“記憶性”和生存周期“全局性”特點。

局部變量的“記憶性”是指在兩次函數調用時,第二次調用開始時,變量能夠保持上一次調用結束數的值。如下例:

#include <stdio.h>
//20210520 公衆号:C語言與CPP程式設計
void staticShow()
{
    static int a=10;
    printf("a=%d\n",a);
    a += 10;
}
int  main()
{
    for(int i=0;i<4;i++)
    {
   staticShow();
    }
    return 0;
}      

運作結果

面試中常見的C語言與C++差別的問題(一)

利用生存周期的“全局性”,可以改善函數傳回指針的問題,局部變量的問題在于當函數退出時其生存周期結束。而利用static修飾的局部變量卻可以延長其生存期。如下所示:

#include <stdio.h>
#include <string.h>
//202105205  公衆号:C語言與CPP程式設計
char *p = NULL;
char *helloToStr(char *b)
{
    static char a[50];
    a[0]='H';
    a[1]='E';
    a[2]='L';
    a[3]='L';
    a[4]='O';
    strcpy(a+5,b);
    p=a;
    return a;
};
int main(void)
{
    printf("%s\n",helloToStr("yang"));
   
    strcpy(p+5,"song");
    printf("%s\n",p);
    strcpy(p+5,"zhang");
    printf("%s\n",p);
    strcpy(p+5,"wang");
    printf("%s\n",p);
    return 0;
}      
面試中常見的C語言與C++差別的問題(一)

2.限定通路區域

被static修飾的變量、函數隻能被同一檔案内的代碼段通路。在此static不再表示存儲方式,而是限定作用範圍。如下所示:

//Test1.cpp
static int a;
int b;
extern void fun1()
{
    ......
}
static void fun1()
{
    ......
}
//Test2.cpp
extern int a;        //錯誤,a是static類型,無法在Test2.cpp檔案中使用
extern int b;       //使用Test1.cpp中定義的全局變量
extern void fun1();    //使用Test1.cpp中定義的函數
extern void fun2();    //錯誤,無法使用Test1.cpp檔案中static函數      

在C++中除了上述的兩種常用方法外還有另外一種使用方法:定義靜态成員變量和靜态成員函數。靜态成員變量或靜态成員函數表示其不屬于任何一個類執行個體,是類的所有類執行個體所共有的。如下所示:

#include <iostream.h>
#include <string.h>
class A
{
public:
    static int a;
    static int geta();
    int b;
    int getb();
};
int A::a=100;
int A::geta()
{
    return a;
}
int A::getb()
{
    return b;
}
int  main(void)
{
    A m,n;
    m.b=90;
    cout<<m.geta()<<endl;
    cout<<m.getb()<<endl;
    cout<<m.a<<endl;
    n.a=33;
    n.b=44;
    cout<<m.geta()<<endl;
    cout<<m.getb()<<endl;
    cout<<m.a<<endl;
    return 0;
}      
面試中常見的C語言與C++差別的問題(一)

答案

在C中static用來修飾局部靜态變量和外部靜态變量、函數。而C++中除了上述功能外,還用來定義類的成員變量和函數,即靜态成員和靜态成員函數。

注意:程式設計時static的記憶性和全局性的特點可以使在不同時期調用的函數進行通信,傳遞資訊,而C++的靜态成員則可以在多個對象執行個體間進行通信,傳遞資訊。

繼續閱讀