类的前向声明

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Legends_Never_Die/article/details/82928338
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直接引用类的成员变量会报错。

在类的提前声明和具体实现之间若要使用该类(不完全类型),只能使用类(不完全类型)的引用或类(不完全类型)指针(因为这两者不用关心类的具体细节)或者作为函数声明的返回值类型和参数类型;不能使用不完全类型定义变量或实例化对象(编译器不知道为其预留多大的内存空间):

在结构体类型定义中和类成员定义中同样不能定义该类型的变量和对象,因为此时该类型还没有定义完,也是不完全类型。但是有一点除外:在类成员函数类内实现中可以可以把该类作为一个完整类型看待,即在函数体中可以用该类实例化对象。
 

猜你喜欢

转载自blog.csdn.net/Legends_Never_Die/article/details/82928338