C++11新特性(侯捷)——课程笔记(六)

这部分包括几个小的特性,包括type alias(类型别名)、using的总结、noexcept、override以及final

1. type alias(类型别名)

类型别名类似于typedef,也是使用using来实现的

(1)用于函数指针

using func = void(*)(int, int);
//相当于
typedef void (*func)(int, int);

这两句话的意思都是func是一个函数类型

(2)type alias can introduce a member typedef name

template<typename T>
struct Container{
    using value_type = T;    //typedef T value_type;
};

这样定义就可以用在泛型编程当中

template<typename Cntr>
void fn2(const Cntr& c)
{
    typename Cntr::value_type n;
}

2. using使用的整理(并非都是C++11的新特性)

(1)用于名称空间以及名称空间的成员

(2)用于类的成员

(3)type alias和template alias中

3. noexcept

用来表示一个函数不会抛出异常,后面也可以加上条件,表明满足某条件就不抛出异常,比如:

void swap(Type& x, Type& y) noexcept(noexcept(x.swap(y)))
{
    x.swap(y);
}

一个标准库中的应用情况,vector在扩容的时候会把元素从一个地方搬到另一个地方,当元素定义了move constructor和move assignment operator时,编译器就会调用这些版本,而不是调用拷贝构造或拷贝赋值(这是因为我们在两个move的函数中做一些操作可以使元素搬运起来更快)。我们定义的两个move函数必须承诺不会抛出异常,这样才会被编译器调用。

(注:会发生扩容行为的容器只有vector和deque)

4. override和final

(1)override用在虚函数上,表示我们重写了某个虚函数。用处是,假如我们手滑写错了派生类重写的虚函数,加上override编译器就会报错,例如:

struct Base{
    virtual void vfunc(float) { }
};

struct Derived : public Base{
    virtual void vfunc(int) override { }    //[Error]
    virtual void vfunc(float) override { }  //正确
};

(2)final。标记class表示不能被继承,标记虚函数表示该虚函数不能被override

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值