参考资料:
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
{
public :
virtual void foo();
void bar();
};
class B : public A
{
public:
void foo() const override; // 错误:B::foo 不覆盖 A::foo
// (签名不匹配)
void foo() override; // OK:B::foo 覆盖 A::foo
void bar() override; // 错误:A::bar 非虚
};
final用在类名的后面,定义体的前面,表示该类不能被继承。
final用在类成员函数后面,表示该函数为虚并不可被派生类覆盖。
class Base
{
public :
virtual void foo();
};
class A : public Base
{
public :
void foo() final; // Base::foo 被覆盖而 A::foo 是最终覆盖函数
void bar() final; // 错误: bar 非虚,因此它不能是 final 的
};
class B final : public A // class B 为 final
{
public :
void foo() override; // 错误:foo 不能被覆盖,因为它在 A 中是 final 的
};
class C : public B // 错误:B 是 final 的,所以必能被继承
{
};
delete不让编译器产生默认构造
default 希望编译器产生默认构造。