天天看點

C++ 的靜态成員變量為什麼一定要在類外定義

       在C++裡面,我們在類裡聲明靜态成員變量,那麼一定要在類外定義。初始化是賦一個初始值,而定義是配置設定記憶體。靜态成員變量在類中僅僅是聲明,沒有定義,是以要在類的外面定義,實際上是給靜态成員變量配置設定記憶體。

//Tstatic.cpp 
#include <stdio.h> 
class A { 
    public: 
        static int a; //聲明但未定義
 }; 
int main() { 
    printf("%d", A::a);
    return 0;
}
           

      編譯以上代碼會出現“對‘A::a’未定義的引用”錯誤。這是因為靜态成員變量a未定義,也就是還沒有配置設定記憶體,顯然是不可以通路的。

     再看如下例子:

//Tstatic.cpp 
#include <stdio.h> 
class A { 
    public: 
        static int a; //聲明但未定義
 }; 
int A::a = 3; //定義了靜态成員變量,同時初始化。也可以寫"int A:a;",即不給初值,同樣可以通過編譯
int main() { 
    printf("%d", A::a);
    return 0;
}

           

     這樣就編譯通過了,因為給在類外對靜态成員變量a定義指派,是以就可以通路了。(備注:在類外面  這樣子寫:int A::a ; 也可以表示聲明了,這樣就表示我們已經定義了。)

#pragma once

typedef struct MyStruct
{
int name;
int year;
}infoList;

class statics
{
public:
statics();
static int m_nums;
static infoList  m_lists;
};
//cpp檔案的聲明
#include"stdafx.h"
#include"statics.h"
#include<iostream>
int statics::m_nums; //定義 
infoList statics::m_lists; //定義 這樣子可以有些成員我們不知道怎麼初始化,或者說必須在用的過程才指派。可以使用這種方法
statics::statics()
{
std::cout<<"static class ";
}
           

繼續閱讀