C++函数修饰符总结

本文转载自https://tlanyan.me/cpp-function-modifier-summary/

C++博大精深,而且不断拥抱新的变化。本文简要总结一下C++中函数的修饰符,其中部分在实际中极少用到。

按修饰符的位置分为函数名前与函数名后两种,以下分别做介绍。

函数名前

  1. 返回值类型 返回值类型是C++中定义函数的必备部分,这些修饰符包括void,(unsigned)
    int,bool等内置基本数据类型和自定义类型,也包括修饰返回值const关键字(如const
    int*),还包括C++11中新增的类型自动推导auto关键字。
  2. template template关键字声明函数是模板函数。
  3. virtual virtual关键字声明函数是虚函数,可被子类覆盖。
  4. inline inline关键字提示编译器应将函数内联。
  5. static static修饰类的成员函数时指示函数是静态成员函数,不从属于具体对象;修饰单独的函数时,限定函数的可见范围为本文件内。
  6. extern extern关键字声明一个定义在外部的函数
  7. explicit explicit关键字在C++11新增,只用于构造函数,指定构造函数要显式定义,不能隐式转换。
  8. friend friend关键字声明类的友元函数,在函数内可直接访问对象的私有或受保护成员及成员函数。
  9. constexpr C++11中新增,指示函数返回常量表达式(可以简单理解为返回字面量)。

函数名后

置于函数名后的修饰符有两种,第一种使用等号(=),第二种直接修饰。

使用=

此类较为简单,总共有三种:

  1. =0:只能用于虚函数,表示函数为纯虚函数。
  2. =default:C++11新增,只能用于编译器提供默认实现的特殊成员函数,指示使用默认实现。
  3. =delete:C++11新增,只能用于编译器提供默认实现的特殊成员函数,指示编译器应该删除该函数的默认实现。

直接修饰

种类繁多,本人已知的修饰符包括:

  1. const
    表示函数不会修改对象(或者说调用期间对象不变),注意不包括mutable修饰的成员变量。

  2. volatile
    类似于const修饰的函数,表示对象状态可能随时会改变;const修饰的函数内只能调用自身的const成员方法,同理volatile函数内也只能调用自身volatile成员函数。

  3. &
    C++11引入的功能,左值引用限定符,指示函数只能被左值对象调用。

  4. &&
    C++11引入,右值引用限定符,指示函数只能被右值调用。如果函数没有引用限定符修饰,左值和右值均可调用。一个引用限定例子:

 #include <iostream>
  struct S {
    void f() & { std::cout << "lvalue\n"; }
    void f() &&{ std::cout << "rvalue\n"; }
  };
 
  int main(){
    S s;
    s.f();            // 打印“ lvalue ”
    std::move(s).f(); // 打印“ rvalue ”
    S().f();          // 打印“ rvalue ”
  }
  1. override
    C++11引入的功能,声明成员函数覆盖父类的虚函数。声明为override后,子类声明时可不写virtual。

  2. final
    C++11引入,指示函数是最终实现,子类不应当再定义或覆盖,可与override同时使用。

  3. noexcept
    C++11引入,修饰函数是否会抛出异常。

  4. throw
    指示函数抛出异常及类型,C++11起被废弃。

总结
本文简要概括的列出了C++定义函数的修饰符。需要注意的是,严格来说上述内容中并不全是修饰符,部分仅是语法结构。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值