C++11 POD类型

POD类型(Plain Old Data)代表该类型与C语言兼容,能以二进制的方式转换为C语言的类型

标准布局类型对于与用其他语言编写的代码进行通信非常有用

  1. 可以使用字节赋值,比如memset,memcpy操作
  2. 对C内存布局兼容。
  3. 保证了静态初始化的安全有效

一个类型如果是POD类型,则满足如下三个条件

  • 是一个平凡类型

                有平凡的构造函数

                有平凡的拷贝构造函数

                有平凡的移动构造函数

                有平凡的拷贝赋值运算符

                有平凡的移动赋值运算符

                有平凡的析构函数

                不包含虚函数

                不包含虚基类

      以下几种类型都不属于POD类型

class A {
    A(){}
};    // 破坏了平凡构造函数
class B {
    B(B&){}
};    // 破坏了平凡拷贝构造函数
class C {
    C(C&&){}
};    // 破坏了平凡移动构造函数
class D {
    D operator=(D&){}
};    // 破坏了平凡拷贝赋值运算符
class E {
    E operator=(E&&){}
};    // 破坏了平凡移动赋值运算符
class F {
    ~F(){}
};    // 破坏了平凡析构函数
class G {
    virtual void func();
}    // 有虚函数
class H : G {
}    // 有虚基类

  • 有标准布局

所有非静态成员具有相同的访问权限

class A {
private:
	int a;
public:
	int b;
};    // 非静态成员变量访问权限不同

没有虚函数,没有虚基类

class D {
	virtual void func();
};       // 虚函数
class E : D {

};       // 虚基类

没有非静态的引用类型

class A {
    int& a;
}    // 有非静态引用类型

没有两个相同类型的基类子对象(可能是间接的)

struct Q {};

struct S : Q { };
struct T : Q { };

struct U : S, T { };    // S T都继承自Q类型,因此U不符合标准布局

非静态数据成员和位域都在同一个类中(要么都在子类中,要么都在某一个基类中)

struct B { int i; };         // standard-layout class
struct C : B { };            // standard-layout class
struct D : C { };            // standard-layout class
struct E : D { char : 4; };  // not a standard-layout class

类中第一个非静态类型与基类不是同一个类型

class C1 {
};
class C : C1 {
    C1 c1;
};

所有非静态成员和基类都是标准布局

  • 所有非静态成员都是POD类型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值