インタビューに、静止画のみの違いの多くを自分自身を見つけるために、C ++言語の詳細を確認します。
静的 int型 I1 = 1 ; 静的 int型 I2 = 1 ; int型i3は、 静的 int型I4。 INT メイン() { 静的 INT I5 = 1 。 int型 I6 = 1 ; int型i7プロセッサー; coutの <<&I1 << " " << I1 << てendl; coutの <<&I2 << " " << I2 << てendl; coutの <<&I3 << " " << I3 << てendl;" " << I4 << てendl; coutの <<&i5の<< " " << i5の<< てendl; coutの <<&I6 << " " << I6 << てendl; coutの <<&i7プロセッサー<< " " << i7の<< てendl; getchar(); }
出力:
まず、その値:
ノーマル/静的なグローバル変数(I3)は、デフォルトで0に初期化され、ローカル変数の共通の初期値が定義されていません(I7)
静的ローカル変数である静的ローカル変数は、0に初期化されます
メモリ記憶場所に加えて:
まず、プロセスのメモリマップを置きます:
これは初期化されていない静的な初期エリア+領域です。なお、静的領域および定常領域は、1 INT A = 1:このような定数として、同じではありません。またはchar * X = "123"、 "123"
ビューの二つの絵にこの対応は非常に明確です
さて、以下のテーマを入力します。
グローバル変数は静的かどうかにかかわらず、静的変数の領域にあります
スタック領域/ヒープ上の普通のローカル変数、静的変数領域内の静的ローカル変数。
静的な異なる用途:
1.static全局变量/函数,因为函数肯定是全局的了,所以这俩捏一起说。
只有一个用途:不让其他cpp使用自己,即限制作用域为所在的cpp。如果不带static,其他cpp可以extern修饰进而引用。
所以假设a.cpp里有一个函数f。
如果我们想让其他cpp引用这个f函数。那么我们应该把f的声明加入到a.cpp的头文件并且声明时不要加static,这样会导致每个包含a.h的cpp都有一份该函数f的副本,大大增加编译效率!当然这个问题回头另外写一篇博客,就先点到为止。另外永远不要在头文件中定义变量!
如果我们不想让其他cpp引用f函数,则我们直接在f的定义前加上static修饰,这样其他cpp就看不到f函数了(即使包含a头文件的情况下也是看不到的)。
2.static局部变量,如:
void f(){ static int cnt=0;cnt++; }
这个函数调用几次,cnt就等于几。
static局部变量和全局变量一起存在静态变量区,二者唯一的区别就是:static局部变量作用域只限于所在的函数,但到达函数以外时并不会释放,而是会保持已有的值继续等待下次调用。
static局部变量只会初始化一次!直到cpp退出才会释放。
3.类中的static成员变量(类的静态成员变量):
在所有该类的实例(对象)中只存在一个副本,所有对象共享一个该静态变量。
类的静态成员变量需要在类中声明,类外定义,例子如下:
class A{ static int x; }; int A::x=1;
4.类中的static成员函数:
只能调用静态成员变量,别的和普通成员函数区别不大。
概括来说:类的静态成员函数、变量的存储位置不在类里,所以也就理所当然的没有this指针。所以静态成员函数无法调用普通成员变量也就合理了(因为没有this指针,根本找不到相应的变量位置!)。
由于二者都与类绑定,而不与特定对象绑定,所以二者可以除了可以通过对象访问外,还可以通过类名访问(A:: f();)。