C++ 一些关键字的用法

目录

 

1 const关键字

1.1 成员变量

1.2 const成员函数

2 mutable关键字

3 volatile关键字

4 static关键字

5 using关键字

6 sizeof关键字


1 const关键字

1.1 成员变量

const成员变量初始化方式:

  • 构造函数初始化列表中进行初始化
  • 将const成员变量用static修改,在类外初始化

1.2 const成员函数

class A{
public:
    void test() const {
        std::cout << "const func" << std::endl;
    }
};
  • const成员函数只能读取成员变量,不能修改
  • const对象只能调用const成员函数;非const对象也可以调用const成员函数
  • 成员函数可以通过是否有const来实现重载

2 mutable关键字

被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中,主要修改一些跟类状态无关的数据成员

class A{
public:
    void test() const {
        count += 1;   // 正确,因为count为mutable变量
        std::cout << "const func" << std::endl;
    }
private:
    mutable int count;
};
  • mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中,主要修改一些跟类状态无关的数据成员

3 volatile关键字

声明的变量编译器对访问该变量的代码不再进行优化,总是从它所在的内存读取数据。主要引用于多线程并发访问共享变量、内嵌汇编操纵栈等

volatile int a = 10; // 阶段A
int b = a;
.....        // 其它一些操作
int c = a;   // 阶段B。此时编译判断阶段A到阶段B之间没有对a进行更新操作,会将上次获取a的值赋值给c,但由于a是volatile修饰,所以会重新从a对应的内存获取值
  • volatile可以保证对特殊地址的稳定访问

4 static关键字

  • 类的静态成员函数不能直接访问类的非静态成员,可以通过传参的方式获取对象名,然后调用非静态成员
  • this指针是一个特殊的隐含指针,它隐含于成员函数,除静态成员函数外每个成员函数都有一个this指针,this是通过函数参数的首参来传递的

5 using关键字

  • 命名空间使用,防止不同文件的代码出现命名冲突
  • 子类中引用基类中不能直接访问的成员
  • 指定别名,常用于函数指针,类似typedef,C++11引入

6 sizeof关键字

不是函数,是一个操作符,sizeof(i++)不会执行i++这个表达式。对于空类,结果是1,为了占位

7 nothrow关键字

c++异常处理需要额外多出20~30ms的时间,nothrow使得new运算不会抛出异常,而是返回NULL。对应头文件#include <new>。只能保证operator new不抛出异常,不保证构造函数抛出异常

char* p = new (std::nothrow) char[1048576];

8 explicit构造函数

为了防止隐式转换,如class test{ public: test(int n); },此时  test a = 32是正确的, 构造函数加了explicit不允许这种写法

9 operator new

c++内存管理例程,operator new内含一个无穷循环,尝试分配内存,若无法满足内存需求,就调用new-handler分配,可以用set_new_handler重新设置new_handler处理函数,且能处理0字节申请,最终分配失败会抛出bad_alloc异常。

10 operator delete

收到null指针时不做任何操作

11 RAII

资源取得时机便是初始化时机

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章