c++语言


普通、标准布局、POD

普通类型(is_trivial)
普通类型具有普通默认构造函数、普通复制构造函数、普通复制赋值运算符和普通析构函数。 在各种情况下,“普通”意味着构造函数/运算符/析构函数并非用户提供(=default)。
1.没有虚函数或虚基类。
2.没有具有相应非普通的 构造函数/运算符/析构函数 的基类。
3.没有具有相应非普通的 构造函数/运算符/析构函数 的类类型的数据成员。
(注意:成员可以有不同访问权限,private,public,protect;对基类派生类数据成员也没要求)

标准布局类型(is_standard_layout)
当类或结构不包含某些 C++ 语言功能(例如无法在 C 语言中找到的虚函数),并且所有成员都具有相同的访问控制时,该类或结构为标准布局类型。 可以在内存中对其进行复制,并且布局已经过充分定义,可以由 C 程序使用。 标准布局类型可以具有用户定义的特殊成员函数。
1.没有虚函数或虚基类。
2.所有非静态数据成员都具有相同的访问控制。
3.类类型的所有非静态成员均为标准布局。
4.所有基类都为标准布局。
5.没有与第一个非静态数据成员类型相同的基类。
6.最底层派生类中没有非静态数据成员,并且具有非静态数据成员的基类不超过一个,或者没有含非静态数据成员的基类(就是说非静态数据成员只能放在一个类中)。
(注意:没有要求构造函数、复制构造函数、复制赋值运算符和析构函数为default)

POD 类型(is_pod)
当某一类或结构同时为普通和标准布局时,该类或结构为 POD(简单旧数据)类型。 因此,POD 类型的内存布局是连续的,并且每个成员的地址都比在其之前声明的成员要高,以便可以对这些类型执行逐字节复制和二进制 I/O。 标量类型(例如 int)也是 POD 类型。 作为类的 POD 类型只能具有作为非静态数据成员的 POD 类型。

强制转换运算符

有几种特定于 C++ 语言的转换运算符。 这些运算符用于删除旧式 C 语言转换中的一些多义性和危险继承。 这些运算符是:
dynamic_cast 用于转换多态类型。
static_cast 用于转换非多态类型。
const_cast 用于删除 const、 volatile 和 __unaligned 属性。
reinterpret_cast 用于位的简单重新解释。
safe_cast 在 C++/CLI 中用于生成可验证的 MSIL。
使用 const_cast和reinterpret_cast 作为最后手段,因为这些运算符具有与旧样式转换相同的危险。 但是,若要完全替换旧的样式转换,仍必须使用它们。

用于编译时封装的 Pimpl

pimpl 是一种新式 C++ 技术,用于隐藏实现、最小化耦合和分离接口。

//test.h
class CTest {

private:
	class impl;//将声明放在类中的private中,定义放在cpp中
	std::unique_ptr<impl> pimpl;//需要用unique_ptr包装
};

//test.cpp
class CTest::impl {//实现对外界隐藏
//...
};

CTest::CTest():pimpl(new impl) {//构造函数里初始化

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值