C++11 字面量操作符

C++11 字面量操作符

  • 1. 字面量
  • 2. 字面量运算符
      • 概念:
  • 3. 使用要点
  • 4. 示例
      • 1. 字面值是整数
      • 2. 字面量为浮点数
      • 3. 字面量为字符串
      • 4. 字面量为字符
      • 5. 比较好用的一个场景

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...>(); }

你可能感兴趣的:(C/C++,c++,开发语言)