C++新特性(一)

参考资料:
https://zh.cppreference.com/w/cpp

1. nullptr与NULL

慎重NULL,NULL其实是一个0的宏定义,本质是int型的0,不具备指针类型。nullptr表示空指针,本质也是0但是具备指针类型,但是并不具体到哪种类型的指针。

2. constexpr

constexpr 说明符声明编译时可以对函数或变量求值。这些变量和函数(给定了合适的函数实参的情况下)即可用于需要编译期常量表达式的地方。
在这里插入图片描述

2. 迭代器及类型推导

迭代器
STL中存在一些常见的已经封装好数据结构相关的模板类,例如vector(动态数组),List,Stack, queue, map等。这些类通常有一些最基本的操作,如:增删改查,遍历等。
C++为了方便统一,采用了设计模式中的迭代器模式,也就是统一的提供了一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。也就是迭代器。
常用的迭代器:

for(vector<string>::const_iterator it = v.cbegin(); it< v.cend(); ++it)

使用auto就可以简化为:

//auto会根据v.cbegin()的返回值确定it的具体类型
for(auto it = v.cbegin(); it<v.cend(); ++it)

在这里插入图片描述
还可以简化为:

for(auto str:l)
{
	...
}

3 委托构造

允许在同一个类的一个构造函数中调用另一个构造函数。
在这里插入图片描述

4 继承构造

直接使用父类的构造。

在这里插入图片描述

在这里插入图片描述

5 虚函数override及final,default,delete

override用在函数名后面,定义体前面,表示该函数是虚函数,继承自父类并必须被子类覆盖。

class A
{
publicvirtual void foo();
    void bar();
};
 
class B : public A
{
publicvoid foo() const override; // 错误:B::foo 不覆盖 A::foo
                               // (签名不匹配)
    void foo() override; // OK:B::foo 覆盖 A::foo
    void bar() override; // 错误:A::bar 非虚
};

final用在类名的后面,定义体的前面,表示该类不能被继承。
final用在类成员函数后面,表示该函数为虚并不可被派生类覆盖。

class Base
{
publicvirtual void foo();
};
 
class A : public Base
{
publicvoid foo() final; // Base::foo 被覆盖而 A::foo 是最终覆盖函数
    void bar() final; // 错误: bar 非虚,因此它不能是 final 的
};
 
class B final : public A // class B 为 final
{
publicvoid foo() override; // 错误:foo 不能被覆盖,因为它在 A 中是 final 的
};
 
class C : public B // 错误:B 是 final 的,所以必能被继承
{
};

delete不让编译器产生默认构造
default 希望编译器产生默认构造。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值