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;
}
運作結果

利用生存周期的“全局性”,可以改善函數傳回指針的問題,局部變量的問題在于當函數退出時其生存周期結束。而利用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;
}
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中static用來修飾局部靜态變量和外部靜态變量、函數。而C++中除了上述功能外,還用來定義類的成員變量和函數,即靜态成員和靜态成員函數。
注意:程式設計時static的記憶性和全局性的特點可以使在不同時期調用的函數進行通信,傳遞資訊,而C++的靜态成員則可以在多個對象執行個體間進行通信,傳遞資訊。