C++面试宝典:类的大小(sizeof)

类的大小

空类的大小 sizeof = 1

因为实例化就是为内存中开辟一个独一无二的地址,至少是一个字节,所以一个字节大小其实就是占位置的一个字节。

class node {
};
int main() {
    node *tmp = new node();
    cout<<sizeof(tmp)<<endl;    // output = 4,指针的大小是4
    cout<<sizeof(*tmp)<<endl;   // output = 1,类在堆空间上的内存大小是1
}

类中有成员变量的大小

因为类里面有成员变量所以就不需要通过隐含的一个字节来占位的,直接用成员变量去占位。所以包含了一个int,那么类的大小就是4个字节。

class node {
private:
    int a;
};
int main()
{
    node *tmp = new node();
    cout<<sizeof(tmp)<<endl;    // output = 4
    cout<<sizeof(*tmp)<<endl;   // output = 4
}

类的成员函数不占类对象的空间

类的成员函数不占用类对象的空间,所有的类对象共享一个代码段。

class node {
private:
    int a;
public:
    void print() {
        cout<<a<<endl;
    }
};
int main()
{
    node tmp;
    cout<<sizeof(tmp)<<endl;   // output = 4
    cout<<sizeof(node)<<endl;   // output = 4
}

父类中也有虚函数指针

父类中也是有虚函数指针的。

class fa1 {
private:
    int a;
public:
    virtual void print() {
        cout<<"father1"<<endl;
    }
};

class son: fa1 {
private:
    int a;
public:
    void print() {
        cout<<"son"<<endl;
    }
};
typedef void(*Fun)();
int main()
{
    fa1 b;
    cout << "虚函数表地址:" << (int*)(&b) << endl;
    cout << "虚函数表 — 第一个函数地址:" << (int*)*(int*)(&b) << endl;
    Fun pFun = NULL;
    pFun = (Fun)*((int*)*(int*)(&b));
    pFun();
    cout<<sizeof(fa1)<<endl;	// output = 8
    cout<<sizeof(son)<<endl;	// output = 12
}

多重继承

class fa1 {
public:
    virtual void print() {
        cout<<"father1"<<endl;
    }
};
class fa2 {
public:
    virtual void print() {
        cout<<"father2"<<endl;
    }
};
class son: fa1,fa2 {
public:
    void print() {
        cout<<"son"<<endl;
    }
};
int main() {
    cout<<sizeof(fa1)<<endl;	// output = 4
    cout<<sizeof(fa2)<<endl;	// output = 4
    cout<<sizeof(son)<<endl;	// output = 8
}

你可能感兴趣的:(C++面试宝典,类和数据抽象,基础知识)