首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个拥有所有私有成员的类可以是POD类吗?

一个拥有所有私有成员的类可以是POD类吗?
EN

Stack Overflow用户
提问于 2011-01-21 19:10:15
回答 3查看 3.4K关注 0票数 8

我以前听说过POD类型不能有私有数据--但是根据C++0x草案,我的要求比较宽松(强调我的):

对于所有非静态数据成员,具有相同的访问控制(第11条)

这似乎表明只要私人数据都是保密的就可以了。不过,我没有C++03的副本.

那么,WindowsApi::Uuid会是一个POD类吗?

代码语言:javascript
复制
namespace WindowsApi
{
    class Uuid
    {
        union
        {
            ::UUID asUuid; //Win32's UUID struct
            unsigned __int64 asInt64s[2];
            unsigned __int32 asInt32s[4];
        };
    public:
        Uuid() {}
        Uuid(::UUID sourceStructure) : asUuid(sourceStructure) {}
        operator ::UUID() { return asUuid; }
    };
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-21 19:13:28

C++03仍然不允许POD类中的非静态私有数据或受保护的数据。此要求在聚合的定义中指定。

聚合是一个数组或一个类(第9条),没有用户声明的构造函数(12.1),没有私有或受保护的非静态数据成员(第11条),没有基类(第10条),也没有虚拟函数(10.3)。

POD类必须首先是一个聚合类。

票数 10
EN

Stack Overflow用户

发布于 2011-01-21 19:27:47

我以前听说过POD类型不能有私有数据

在C++03中,POD类型不能有私有数据(请参阅AndreyT的答案)。

然而,在C++0x中,过氧化物酶的定义发生了变化(见9/10)。

根据n3225

POD结构是一个平凡类和一个标准布局类的类,它没有非POD结构、非POD联合(或此类类型数组)类型的非静态数据成员。 ... POD类是一个POD结构或POD结合的类。

这意味着

代码语言:javascript
复制
struct demo
{
   private:
      int a, b;
};

在C++0x中是POD,因为demo既是普通的,又是的标准布局

标准布局的定义在9/7节中

标准布局类是这样一个类:

  • 没有非标准布局类(或此类类型的数组)或引用的非静态数据成员,
  • 没有虚拟函数(10.3)和虚拟基类(10.1),
  • 对所有非静态数据成员具有相同的访问控制(第11条),
  • 没有非标准布局基类,
  • 或者在派生最多的类中没有非静态数据成员,最多有一个具有非静态数据成员的基类,或者没有具有非静态数据成员的基类,并且
  • 没有与first非静态数据成员相同类型的基类。

那么,WindowsApi::Uuid会是POD类吗?

不!WindowsApi::Uuid在C++03和C++0x中既不是POD。平凡类是一个具有普通默认构造函数 (12.1)的类,并且是微不足道的可复制类。WindowsApi::Uuid有一个非平凡的默认构造函数。

那么这个规则在C++0x中被放松了吗?

是!(考虑到第11条)

还可以查看关于集合和吊舱的常见问题条目

票数 12
EN

Stack Overflow用户

发布于 2011-01-21 19:29:52

根据我的n3225 C++0x草案,WindowsApi::Uuid是一个POD类。

从第219页: POD结构是一个类,它既是一个平凡的类,也是一个标准布局类,并且没有非POD结构、非POD联合(或此类类型的数组)类型的非静态数据成员。

一个平凡的类是一个类,它有一个简单的默认构造函数,并且几乎是可以复制的:

一个微不足道的可复制类是这样一个类:

  • 没有非平凡的副本构造函数(12.8),
  • 没有非平凡的移动构造函数(12.8),
  • 没有重要的副本分配操作符(13.5.3,12.8),
  • 没有非平凡的移动赋值操作符(13.5.3,12.8)
  • 有一个平凡的析构函数(12.4)。

标准布局类是这样一个类:

  • 没有非标准布局类(或此类类型的数组)或引用的非静态数据成员,
  • 没有虚拟函数(10.3)和虚拟基类(10.1),
  • 对所有非静态数据成员具有相同的访问控制(第11条),
  • 没有非标准布局基类,
  • 或者在派生最多的类中没有非静态数据成员,最多有一个具有非静态数据成员的基类,或者没有具有非静态数据成员的基类,并且
  • 没有与第一个非静态数据成员相同类型的基类。

因为WindowsApi没有违反任何这些约束,所以它将是C++0x下的一个有效的POD类。正如AndreyT所提到的,这是一个比C++03更慷慨的措辞。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4762788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档