美文网首页C++11新特性
C++11新特性(19)-constexpr构造函数

C++11新特性(19)-constexpr构造函数

作者: 面向对象思考 | 来源:发表于2018-07-22 21:36 被阅读1次

聚合类

聚合类(aggregate class)允许利用者直接访问其成员,并且具有特殊的初始化形式。聚合类满足以下条件:

所有成员都是public的

没有定义构造函数

没有类内初始值

没有基类,也没有虚函数

怎么理解呢?

首先,看来看去聚合类其实就是一个C结构体;其次,聚合这个词,应该是相对组合的,表明了成员和类之间的松散关系。

当一个类是聚合类时,就可以使用初始值列表像下面这样初始化了:

struct Point

{

    int x;int y;

};

Point pt = {10, 10};

字面值常量类

前面讲过constexpr函数,它的参数和返回值都必须是常量表达式。而常量表达式的最基本要素就是字面值类型。字面值类型除了包括算数类型,引用和指针以外,某些类也属于字面值类型,C++11称之为字面值常量类。主要包括两种情况:

首先数据成员都是字面类型的聚合类就是一种。上面的Point类就是一个例子。我们可以这样理解,字面值的聚合继续具有字面值的特征,这里主要是编译阶段可以求值。

还有一种情况,虽然不是聚合类,但是只要满足下面的条件,也是字面值常量类:

数据成员必须都必须是字面值类型。

类必须至少含有一个constexpr构造函数。

如果一个数据成员含有类内初始值,则初始值必须是常量表达式;如果成员属于某种类,初始值必须使用该类的constexpr构造函数。

类必须使用析构函数的默认定义。

对于这几个条件,作者这样理解:

满足条件1,就可以在编译阶段求值,这一点和聚合类一样。

满足条件2,就可以创建这个类的constexpr类型的对象。

满足条件3,就可以保证即使有类内初始化,也可以在编译阶段解决。

满足条件4,就可以保证析构函数没有不能预期的操作。

constexpr构造函数

通过前置constexpr关键字,就可以声明constexpr构造函数,同时:

除了声明为=default或者=delete以外,constexpr构造函数的函数体一般为空,使用初始化列表或者其他的constexpr构造函数初始化所有数据成员。

struct Point{

    constexpr Point(int _x, int _y)

        :x(_x),y(_y){}constexpr Point()

        :Point(0,0)

        {

        }

        int x;int y;

};

constexpr

Point pt = {10, 10};

这样声明以后,就可以在使用constexpr表达式或者constexpr函数的地方使用字面值常量类了。

作者观点

定义各种名称的目的往往是因为经常需要将具有某种特征的事物从其他事物中分离出来。

觉得本文有帮助?请分享给更多人。

关注【面向对象思考】,轻松学习每一天!

面向对象设计,面向对象编程,面向对象思考!

相关文章

  • C++11新特性(19)-constexpr构造函数

    聚合类 聚合类(aggregate class)允许利用者直接访问其成员,并且具有特殊的初始化形式。聚合类满足以下...

  • Ceph读写锁实现

    src/common/RWLock.h RWLock使用了C++11新特性Deleted函数,禁用其拷贝构造函数与...

  • C++11中std::move、std::forward、左右值

    C++11中std::move、std::forward、左右值引用、移动构造函数的测试 关于C++11新特性之s...

  • [C++11阅读]移动语义和完美转发(上)

    移动语义是C++11中提升代码执行性能最重要的新特性,也是最复杂的特性之一。 移动构造函数 提出移动构造函数的动机...

  • C++ constexpr

    c++ constexpr构造函数有什么作用 给构筑bai函数加上constexpr之后, 这个构筑函数就只能du...

  • C++学习笔记(十七) - Lambda函数

    参考文献:C++11新特性:Lambda函数(匿名函数)匿名函数,C++11里面加入了匿名函数。 1 定义一个基本...

  • C++ 11 新特性之右值引用与移动

    继续奉上c++11新特性部分,这是C++11新特性介绍的第七部分,涉及到左右值引用、移动构造、移动赋值、完美转发等...

  • 技能

    C++ C++特性 C++11 多态和继承 构造函数 析构函数 手写代码实现string类 手写代码实现智能指针 ...

  • Lambda函数

    lambda函数定义 lambda函数是C++11中的新特性,名称来自于lambda calculus(λ演算)。...

  • C++11新特性(18)- 委托构造函数

    C++11之前的状况 构造函数多了以后,几乎必然地会出现代码重复的情况,为了避免这种情况,往往需要另外编写一个初始...

网友评论

    本文标题:C++11新特性(19)-constexpr构造函数

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