无论是 Aggregate 还是 POD(Aggregates的升级版)都是对用来约束初始化的精巧的概念

motivation

当我们欲构造如下的union时:

union
{int i;std::string s;// illegal: std::string is not a POD type!
} u;

vs 2013会对之作进一步的错误说明:

error C2621: “<unnamed-tag>::s”: 非法的联合成员;
类型“std::basic_string<char,std::char_traits<char>,std::allocator<char>>”具有复制构造函数 

两者一规约,也即POD数据类型不允许使用其具有复制构造函数;
而且我们还可看到:
所谓的std::string类型其实是对std::basic_string<>某一特化版本的类型定义:

typedef basic_string<char, char_traits<char>, allocator<char> >string;

解释:Aggregates vs POD

如果想深入了解 POD(Plain Old Data)的话,了解 aggregates(聚合,集成?) 是必须的。

首先我们来看C++标准对 aggregates 的定义:

An aggregate is an array or a class (clause 9) with no user-declared constructors (12.1), no private or protected non-static data members (clause 11), no base classes (clause 10), and no virtual functions (10.3).

也即,首先所有的数组都是Aggregates,然后类类型如果满足那四个条件,等等,标准未对结构体(structs)以及联合体(unions)做任何说明。难道它们就不能成为aggregates了吗?可以的。在C++中,术语(关键字) class 表示所有的类、结构体以及联合。

那么,这四条关于类(class)的约束说明了:

  • 并非意味着一个 aggregate class 不可以拥有构造函数,事实上,它们可以拥有一个默认构造函数(default constrctor)以及(或者)一个拷贝构造函数只有它们被编译器隐式地声明,而非被用户显式地声明。

  • no private or protected non-static data members。You can have as many private and protected member functions (but not constructors) as well as as many private or protected static data members and member functions as you like and not violate the rules for aggregate classes。静态成员可以出现在任何位置,非静态成员只得以公共成员(public)的形式出现。

  • An aggregate class can have a user-declared/user-defined copy-assignment operator and/or destructor。结合第一条,也即如果想要出现构造函数的话,必须以拷贝构造的形式出现(operator=),

  • An array is an aggregate even if it is an array of non-aggregate class type.

下面我们来看一些具体的例子:

class NotAggregate1
{virtual void f() {}    // no virtual functions
};class NotAggregate2
{int x;                 // x is private by default and non-static
};class NotAggregate3
{public:NotAggregate3(int) {}   // user-defined ctor
};class Aggregate1
{public:NotAggregate1 member1;    // ok, public memberAggregate1& operator(const Aggregate1& rhs) {// }// ok, copy-assignment
private:void f() {}// ok, non-virtual function
};

现在我们来说明,为什么会提出 Aggregate 这样一个概念以及它是如何跟 POD(Plain Old Data)发生关联的?Aggregate 类型的类,可以被初始化通过 {},而non-Aggregate 的 class 不可以。(提出这样一个概念,是为了规范化初始化的用法):

struct X
{int i1;int i2;
};
struct Y
{char c;X x;int i[2];float f;
protected:static double d;Y& operator=(const Y& rhs) { return *this};
private:void g(){}
};

我们可直接使用{}进行初始化:

Y y = {'a', {10, 10}, {20, 30}};// y.c = 'a'// y.x.i1 = 10// y.x.i2 = 10// y.i[0] = 20// y.i[1] = 30// y.f = 0.0 by value-initialized 的方式// d 未被初始化,因为它是静态的

POD

来自C++标准:

A POD-struct is an aggregate class that has no non-static data members of type non-POD-struct, non-POD-union (or array of such types) or reference, and has no user-defined copy assignment operator and no user-defined destructor. Similarly, a POD-union is an aggregate union that has no non-static data members of type non-POD-struct, non-POD-union (or array of such types) or reference, and has no user-defined copy assignment operator and no user-defined destructor. A POD class is a class that is either a POD-struct or a POD-union.
An aggregate class is called a POD if it has no user-defined copy-assignment operator and destructor and none of its nonstatic members is a non-POD class, array of non-POD, or a reference.

  • 所有的POD类都必须是Aggregate,或者说,一个类如果不是Aggregate,则一定不是POD类(两者成逆否命题)。

  • 和 Aggregates 的情况一样,静态成员不在乎其具体是什么样的类型(只要是静态的即可),

举个栗子:

struct POD
{int x;char y;void f() {};// no harm if there's a functionstatic std::vector<char> v;// static members do not matter
};struct AggregateButNotPOD1
{int x;~AggregateButNotPOD1() {}// user-defined destructor
};struct AggregateButNotPOD2
{AggregateButNotPOD1 arrOfNonPOD[3];// array of non-POD class
};
  • POD-classes are the closest to C structs. Unlike them, PODs can have member functions and arbitrary static members, but neither of these two change the memory layout of the object. So if you want to write a more or less portable dynamic library that can be used from C and even .NET, you should try to make all your exported functions take and return only parameters of POD-types.

C++ Aggregate 与 POD(Plain Old Data)的解释相关推荐

  1. C++ POD(Plain Old Data)类型

    群里发过来一份他们公司的笔试题,看了下,发现里面考了一个判断如下是否为POD类型,没搞明白什么是POD,多方查阅后,发现其实是指一个C风格代码的概念. POD全称Plain Old Data是指C风格 ...

  2. C++: POD, Plain old data, 朴素老数据,别别扭扭

    文章目录 简介 实现 plain这个单词其主要的寓意是 简介 POD就是C格式的数据结构,没有C++那一套编译器自动添加的东西,什么构造函数啦,析构函数,等等.目的就是和C兼容,可以使用memcpy直 ...

  3. pod重启策略和状态解释

    一.重启策略:Pod在遇到故障之后重启的动作 1.always 2.never 3.onfailure 3.1 非0状态 3.2 为0状态 二.探针 附:pod各种状态解释: 1.Pod一直处于Pen ...

  4. c++中的pod类型

    最早看到POD(plain old data)类型,是在imperfect c++里.我觉得这是一本把我带到c++世界里的一本很重要的书. 书里是这样解释POD的: 1.   所有标量类型(基本类型和 ...

  5. C++11中的POD和Trivial

    引子 在介绍C++11的文章或者博客中,经常会出现POD类型和Trivial类型的影子.但是POD类型和Trivial类型到底是什么意思呢? POD类型 POD类型的好处 POD类型 粗略上来讲,PO ...

  6. boost基础——variant的原理及基本用法

    The variant class template is a safe, generic, stack-based discriminated union container, offering a ...

  7. C++ Google代码风格

    C++ Google代码风格 0 index(扉页) 0.0 声明 0.1 译者前言 0.2 背景 headers(头文件) 1.1 Self-contained 头文件 1.2. #define 保 ...

  8. C++11中头文件type_traits介绍

    C++11中的头文件type_traits定义了一系列模板类,在编译期获得某一参数.某一变量.某一个类等等类型信息,主要做静态检查. 此头文件包含三部分: (1).Helper类:帮助创建编译时常量的 ...

  9. 【C++】Google C++编码规范(一):作用域

    1.文件作用域: 在.cpp文件中,C++使用匿名名字空间来表示文件作用域,C使用static来表示: 2.局部变量 局部变量在声明的同时,进行显示初始化:比起隐式初始化再赋值要高效: 局部变量的作用 ...

最新文章

  1. html怎么将页面放到中间,HTML – 如何将div放在另外两个(左和右)div之间?
  2. Meteor:发布与订阅
  3. 基于 Wasm 和 ORAS 简化扩展服务网格功能
  4. java 参数三点,java函数参数类型后添加三点的用法
  5. 你是不是已经超纲了?一文解决JavaWeb中要求的HTML,是什么样的?
  6. OpenJudge NOI 1.5 08:多边形内角和
  7. 查询商品信息报错FreeMark template error
  8. 最近,我在Spring的BeanUtils踩了不少坑
  9. mysql实际项目中使用多长时间_mysql - 存储过程在实际项目中用的多吗?
  10. Android Studio的适配器Adapter以及Adapterview的使用
  11. 图像拼接算法(zz)
  12. mysql数据,中国最新行政区划数据,到乡村共5级
  13. 利用ESP定律进行脱壳 ——合天网安实验室学习笔记
  14. BI如何实现用户身份集成自定义安全程序开发
  15. 电脑老是弹出vrvedp_m_卸载瑞星的最简单方法 vrvedp_m卸载
  16. 银行利息,活期,定期,本金知识集锦!
  17. (纪中)2417. Loan Repayment【数学】
  18. 鸿蒙harmonyOS怎么读取应用是否存在静默安装
  19. 西方心理学对学习的研究和认识
  20. 电脑点击关机之后一直退回进入登录界面

热门文章

  1. 计网笔记(一) 什么是因特网
  2. Dell服务器串口开机协议,dell和ibm服务器串口重定向功能的配置.docx
  3. Git教程——回到从前 (checkout 针对单个文件)
  4. OpenCV精进之路(四):图像处理——图片的缩放和图像金字塔
  5. 朴素贝叶斯算法matlab实现以及EM算法
  6. 基于Opencv3.0对图像进行透视变换
  7. iview 路由权限判断的处理
  8. python 小兵(2)
  9. codeforces 792CDivide by Three(两种方法:模拟、动态规划
  10. angular --开发环境搭建及项目创建