Unix/C++--关键字mutable、noexcept等

1 简介

C++关键字各有自己的特性,有的是辅助封装,如const、private等,有的为了使用方便,不得已破坏封装,如mutable等。

2 mutable

2.1 介绍

mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。
在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。
我们知道,被const关键字修饰的函数的一个重要作用就是为了能够保护类中的成员变量。即:该函数可以使用类中的所有成员变量,但是不能修改他们的值。然而,在某些特殊情况下,我们还是需要在const函数中修改类的某些成员变量,因为要修改的成员变量与类本身并无多少关系,即使修改了也不会对类造成多少影响。当然,你可以说,你可以去掉该函数的const关键字呀!但问题是,我只想修改某个成员变量,其余成员变量仍然希望被const保护。

2.2 示例

#include <iostream>

class Person {
public:
    Person();
    ~Person();

    int getAge() const; /*调用方法*/
    int getCallingTimes() const; /*获取上面的getAge()方法被调用了多少次*/
private:
    int age;
    char *name;
    float score;
    mutable int m_nums;            /*用于统计次数*/
};

Person::Person()
{
    m_nums = 0;
}

Person::~Person(){}

int Person::getAge() const
{
    std::cout << "Calling the method" << std::endl;
    m_nums++;
    // age = 4; 仍然无法修改该成员变量
    return age;
}

int Person::getCallingTimes()const
{
    return m_nums;
}

int main()
{
    Person *person = new Person();
    for (int i = 0; i < 10; i++) {
        person->getAge();
    }
    std::cout << "getAge()方法被调用了" << person->getCallingTimes() << "次" << std::endl;
    delete person;

    getchar();
    return 0;
}

运行结果:
Calling the method
Calling the method
Calling the method
Calling the method
Calling the method
Calling the method
Calling the method
Calling the method
Calling the method
Calling the method
getAge()方法被调用了10次

这样我们既保护了别的成员变量,又能够使计数器的值进行累加。
需要注意的是:mutable不能修饰const 和 static 类型的变量。

3 noexcept

3.1 介绍

  • 该关键字告诉编译器,函数中不会发生异常,这有利于编译器对程序做更多的优化。如果在运行时,noexecpt函数向外抛出了异常(如果函数内部捕捉了异常并完成处理,这种情况不算抛出异常),程序会直接终止,调用std::terminate()函数,该函数内部会调用std::abort()终止程序。
  • C++中的异常处理是在运行时而不是编译时检测的。为了实现运行时检测,编译器创建额外的代码,然而这会妨碍程序优化。
    在实践中,一般两种异常抛出方式是常用的:
    一个操作或者函数可能会抛出一个异常;
    一个操作或者函数不可能抛出任何异常。
    后面这一种方式中在以往的C++版本中常用throw()表示,在C++ 11中已经被noexcept代替。
void swap(Type& x, Type& y) throw()   //C++11之前
   {
       x.swap(y);
   }
   void swap(Type& x, Type& y) noexcept  //C++11
   {
       x.swap(y);
   }
  • 有条件的noexcecpt
    使用方式可以更加灵活,表明在一定条件下不发生异常。

3.2 示例

libsigc++中的代码

struct SIGC_API trackable_callback
{
  notifiable* data_;
  func_destroy_notify func_;
  trackable_callback(notifiable* data, func_destroy_notify func) noexcept : data_(data), func_(func)
  {
  }
};

参考

1、C++中的mutable关键字
2、C++中的mutable关键字
3、C++11 带来的新特性 (3)—— 关键字noexcept
4、C++11:noexcept修饰符、nullptr、原生字符串字面值

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读