C++11 字面量操作符

C++11引入了字面量运算符,允许用户自定义字面量后缀,将字面量转换为特定类型。例如,可以创建一个将字面量转换为微秒的运算符,便于时间间隔的表示。文章列举了不同类型的字面量(整数、浮点数、字符串、字符),并提供了相应的运算符示例,如_int、_f、_s和_c,展示了如何重载这些运算符处理字面量。
摘要由CSDN通过智能技术生成


Reference:

  1. 字面量运算符/字面量操作符

1. 字面量

在C++中,字面量(Literal)是表示固定值的语法元素。它们是程序中的常量值,直接出现在代码中,不需要进行计算或求值。C++支持多种类型的字面量,包括整数、浮点数、字符、字符串和布尔值。

下面是几种常见的C++字面量类型:

  • 整数字面量(Integer Literals):用于表示整数值。可以使用十进制、八进制、十六进制或二进制表示法。例如:42, 0xFF, 0755, 0b1010
  • 浮点数字面量(Floating-point Literals):用于表示浮点数值。可以使用十进制或科学计数法表示法。例如:3.14, 2.0e-5
  • 字符字面量(Character Literals):用于表示单个字符值。使用单引号括起来。例如:A, x, \n
  • 字符串字面量(String Literals):用于表示字符串值。使用双引号括起来。例如:Hello, World!, OpenAI, 42
  • 布尔字面量(Boolean Literals):用于表示布尔值,即truefalse
  • 空指针字面量(Null Pointer Literals):用于表示空指针值。使用关键字nullptr表示。

这些字面量可以直接在代码中使用,并具有与其类型相对应的值和语义。它们提供了一种直观和方便的方式来表示常量值,并在编程中广泛使用。

2. 字面量运算符

C++11 提供了一种创建用户自定义字面量的机制:字面量运算符(User-defined Literal Operator)

概念:

  1. 形如 T operator"" name(T1, T2),其中 name 是用户自定义的后缀,例如 unsigned int operator“” _t(const char*s, size_t l),用的话这样使用"123"_t一般建议后缀开头是下划线。如果不加下划线也能使用,但是会报以下Warning:

在这里插入图片描述
2. 字面量重载运算符可以把字面值常量(注意只能是字面值常量,也就是“123”,123,1.23,‘a’这样,不能是变量),转化为需要的类型对象。

3. 使用要点

根据字面值类型的不同,操作符函数可以接受的参数也是不一样的。

  1. 字面值是整数:操作符只能接受 unsigned long long 作为参数;
  2. 字面量为浮点数:操作符函数只可接受 long double 为参数;
  3. 字面量为字符串:操作符函数只可接受 const char*size_t 为参数;
  4. 字面量为字符:则操作符函数只接受一个 char 为参数。

4. 示例

1. 字面值是整数

int operator"" _n(unsigned long long i){
    return i / 10;
}
void test_n(){
    int a = -21474836470_n;
    cout << a << endl;
}

这样不会出现溢出。

2. 字面量为浮点数

double operator"" _f(long double i){
    return i / 10;
}
void test_f(){
    double a = -214748.36470_f;
    cout <<  a << endl;
}

3. 字面量为字符串

unsigned int operator"" _s(const char*s, size_t l){
    cout << "s = " << s << endl << "l = " << l << endl;
    return l;
}
void test_s(){
    unsigned int a = "12346"_s;
    cout << a << endl;
}

4. 字面量为字符

int operator"" _c(char c){
    return c;
}
void test_c(){
    cout << 'a'_c << ", " << 'A'_c << endl;

}

5. 比较好用的一个场景

inline std::chrono::microseconds operator"" _us(unsigned long long time_) { return std::chrono::microseconds(time_); }
---
std::this_thread::sleep_for(5000_us);

在/usr/include/c++/9/chrono里面就是这样写的,写法如下:

template <char... _Digits>
  constexpr chrono::microseconds
  operator""us()
  { return __check_overflow<chrono::microseconds, _Digits...>(); }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泠山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值