美文网首页
C++类大小和静态成员/方法

C++类大小和静态成员/方法

作者: 第八区 | 来源:发表于2017-08-11 16:37 被阅读33次

类大小计算

  • 空类的大小为1字节
  • 一个类中,虚函数本身、成员函数(包括静态与非静态)和静态数据成员都是不占用类对象的存储空间的
  • 字节对齐的问题。与C语言一致
  • 没有继承的时候,存在虚函数则需要加上虚指针vptr(+4个字节),如果有多个也只需要加上一个,因为只有一个虚指针。
  • 虚基类指针:如果是虚继承,则子类的大小为:虚基类的大小 + 4个字节(用来存放指向虚基对象的指针)+子类新增成员的大小。
示例
#include <iostream>

using namespace std;

/**
 * 8=4(x)+4 (vptr)
 */
class A {
public:
    int x;

    virtual void func() {

    }
};

/**
 * 16=4(x)+4 (vptr)+4(y)+4(vbPtr)
 */
class B : virtual public A {
public:
    int y;

    virtual void funcB() {

    }
};


class B1 : virtual public A {
public:
    int z;

    virtual void funcB1() {

    }
};

/**
 * 16=4(x)+4 (vptr)+4(y)+4(B vbPtr)+4(A vbptr)+4(m)
 */
class C : virtual public B {
    int m;

    virtual void funcC() {

    }
};

/**
 * 16=4(x)+4 (vptr)+4(y)+4(B vbPtr)+4(A vbptr)+4(m)+4(z)+4(B1 vbptr)
 */
class D : public B, public B1 {
    int n;

    virtual void funcD() {

    }
};

int main() {
    A a;
    B b;
    C c;
    D d;
    cout << "sizeof(A)=" << sizeof(a) << endl;
    cout << "sizeof(B)=" << sizeof(b) << endl;
    cout << "sizeof(C)=" << sizeof(c) << endl;
    cout << "sizeof(D)=" << sizeof(d) << endl;
    return 0;
}

运行结果:

sizeof(A)=8
sizeof(B)=16
sizeof(C)=24
sizeof(D)=28
  • sizeof(A):x的大小,存在虚函数则有vptr
  • sizeof(B):x的大小,y的大小,存在虚函数则有vptr;虚继承,则还存在指向虚基类指针。
  • sizeof(C):x的大小,y的大小,m的大小,存在虚函数则有vptr;虚继承,则还存在指向虚基类指针。而基类也是虚继承,基类中也有一个指向虚基类指针。
  • sizeof(D)

静态成员变量

  • 静态变量必须在外部定义和赋值
    • a 不能在 main() 函数中定义
    • b 不能在类的构造函数中定义
  • 必须要定义静态变量,否则该变量没有内存空间(类中只是申明)
  • 类本身可以直接调用静态变量
  • 静态变量依旧符合public、private、protect特性
示例
  • 声明
//C.h
class C {
private:
    int a;
public:
    static int b;
};
  • 定义
//C.cpp
#include "C.h"
int C::b=10;
  • 使用
int main() {
    cout<<C::b<<endl;
    C::b=100;
    cout<<C::b<<endl;
    return 0;
}

静态方法

  • 静态方法可以被类直接调用,但是同静态变量一样符合public、private、protect特性
  • 静态成员函数不可以调用类的非静态成员。因为静态成员函数不含this指针。
  • 静态成员函数不可以同时声明为 virtual或后缀const 函数。因为virtual就是用来区分是哪个对象调用了他,与静态方法矛盾。而后缀const是用来修饰this指针的,静态变量中不包含this指针。

相关文章

  • C++类大小和静态成员/方法

    类大小计算 空类的大小为1字节 一个类中,虚函数本身、成员函数(包括静态与非静态)和静态数据成员都是不占用类对象的...

  • C++中的成员变量和成员函数

    C++中的类有两个成分: (1)成员变量 成员变量按照作用域分为静态成员变量和非静态成员变量,C++中成员变量的默...

  • TypeScript 03——成员方法定义与调用

    类中的成员分为: 静态成员 和 实例成员;静态成员包含了:静态属性 和 静态方法;实例成员包含了:实例属性 和 实...

  • 2019-01-18

    二、.NET基础概念《静态类》 静态类:用static修饰的类。 注意:静态类的成员必须是静态成员,包括属性和方法...

  • static 关键字

    修饰类的成员变量和成员方法 静态成员为类的实例所共享 静态方法不能重载,为静态 修饰类 只能修饰内部类。有三个特点...

  • C++基础学习

    1. 类的静态成员和非静态成员区别是: 类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过...

  • 创建对象时调用顺序

    创建对象时调用顺序如下: ①先初始化父类和子类的静态成员。 ②父类非静态成员。 ③父类构造方法。 ④子类非静态成员...

  • [初学C++]静态成员

    静态成员变量和成员函数 在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。所...

  • @classmethod和@staticmethod的区别

    简介 类的成员 python中类的成员可以分为三大类:字段、方法和属性 类的方法 包括:普通方法、静态方法和类方法...

  • 为什么从静态的方法里调用非静态的方法或变量是非法的?

    结论: 非静态的方法可以调用静态的方法,但是静态的方法不可以调用非静态的方法。 类的静态成员(变量和方法)属于类本...

网友评论

      本文标题:C++类大小和静态成员/方法

      本文链接:https://www.haomeiwen.com/subject/wxkrrxtx.html