栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c++ 字面量

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c++ 字面量

字面量
  • 自定义字面量

自定义字面量

字面量(literal)是指在源代码中写出的固定常量,它们在 C++98 里只能是原生类型,如:

"hello",字符串字面量,类型是 const char[6]
1,整数字面量,类型是 int
0.0,浮点数字面量,类型是 double
3.14f,浮点数字面量,类型是 float
123456789ul,无符号长整数字面量,类型是 unsigned long

C++11 引入了自定义字面量,可以使用 operator"" 后缀 来将用户提供的字面量转换成实际的类型。C++14 则在标准库中加入了不少标准字面量。下面这个程序展示了它们的用法:

#include 
#include 
#include 
#include 
#include 
using namespace std;
int main()
{
	cout << "i * i = " << 1i * 1i<< endl;
	cout << "Waiting for 500ms"<< endl;
	this_thread::sleep_for(500ms);
	cout << "Hello world"s.substr(0, 5)<< endl;
}

输出是:

i * i = (-1,0)
Waiting for 500ms
Hello

上面这个例子展示了 C++ 标准里提供的帮助生成虚数、时间和 basic_string 字面量的后缀。其所在的命名空间是:

std::literals::complex_literals
std::literals::chrono_literals
std::literals::string_literals

要在自己的类里支持字面量也相当容易,唯一的限制是非标准的字面量后缀必须以下划线 _打头。比如,假如我们有下面的长度类:

struct length {
double value;
enum unit {
	metre,
	kilometre,
	millimetre,
	centimetre,
	inch,
	foot,
	yard,
	mile,
};
static constexpr double factors[] =
	{1.0, 1000.0, 1e-3,
	1e-2, 0.0254, 0.3048,
	0.9144, 1609.344};
explicit length(double v, unit u = metre)
{
	value = v * factors[u];
}
};
length operator+(length lhs, length rhs)
{
	return length(lhs.value + rhs.value);
}
// 可能有其他运算符

我们可以手写 length(1.0, length::metre) 这样的表达式,但估计大部分开发人员都不愿意这么做吧。反过来,如果我们让开发人员这么写,大家应该还是基本乐意的: 1.0_m + 10.0_cm 。

要允许上面这个表达式,我们只需要提供下面的运算符即可:

length operator"" _m(long double v)
{
	return length(v, length::metre);
}
length operator"" _cm(long double v)
{
	return length(v, length::centimetre);
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/849719.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号