1. 程式人生 > >類的前向宣告

類的前向宣告

class person;
void show1(person &k)
{
    cout<<k.age<<endl;
}

class person
{
public:
    int age;
    int g;
public:
    person(int a,int b)
    {
        age=a;
        g=b;
    }
    friend void show1(person& k);
    void show()
    {
        cout<<age<<" "<<this->g<<endl;
    }
};
int main()
{
    person p(1,2);
    p.show();
    show1(&p);
    return 0;
}

在類的定義前使用該類,需在使用前進行宣告(告訴編譯器person為一個類),這個宣告叫做前向宣告。

上述程式碼在友元函式的類外實現中使用了該類,則需在之前宣告,上述程式碼已做宣告。
但是上述程式碼依然會報錯,因為類的提前宣告,編譯器只是知道了person這是一個類,該類的具體細節(例如成員變數)編譯器並不知道,所以此時person又叫做不完全型別(直到該類具體定義完之前,person都是不完全型別),所以直接用k.age直接引用類的成員變數會報錯。

在類的提前宣告和具體實現之間若要使用該類(不完全型別),只能使用類(不完全型別)的引用或類(不完全型別)指標(因為這兩者不用關心類的具體細節)或者作為函式宣告的返回值型別和引數型別;不能使用不完全型別定義變數或例項化物件(編譯器不知道為其預留多大的記憶體空間):

在結構體型別定義中和類成員定義中同樣不能定義該型別的變數和物件,因為此時該型別還沒有定義完,也是不完全型別。但是有一點除外:在類成員函式類內實現中可以可以把該類作為一個完整型別看待,即在函式體中可以用該類例項化物件。