C++ 11新特性

目录

1,字符串原始字面量

原始的字符串,存在大量的转义字符,比如 \n 代表换行,\t \0 等等大量转义字符。

但有的时候,我们不希望进行转义,希望字符串以最原始的模样输出,于是 c++ 11 有了 原始字面量

javascript 复制代码
//原始字面量
std::string str1 = R"(D:\nhello\nworld\ntest.txt)";  
	std::cout << str1 << std::endl;

//会被转义的字面量
std::string str2 = "D:\nhello\nworld\ntest.txt";
	std::cout << str2 << endl;

2,nullptr

javascript 复制代码
#ifndef
	#ifdef _cplusplus
			#define NULL 0
	#else
			#define NULL ((void*)0)
	#endif
#endif

上面代码可以看出 NULL 这个宏,在 c 语言当中代表的是 void* 指针,而在

c++ 当中则代表字面值 0 。

所以,当我们想让一个指针为空指针时,不应该使用 NULL

所以我们使用 nullptr ,nullptr 可以转换成任何类型的指针类型。

3,constexpr

constexptr 用来修饰常量表达式

c++程序从编写完毕到执行分为四个阶段:预处理,编译,汇编,链接 4个阶段。然而,常量表达式和非常量表达式的计算时机不同,非常量表达式只能在程序运行阶段计算出结果,但常量表达式的计算往往发生在程序的编译阶段,这可以极大提高程序的执行效率

那么问题来了,编译器如何识别表达式是不是常量表达式呢?

在c++11 中添加了 constexpr 关键字之后就可以在程序中使用它来修改常量表达式,用来提高程序的执行效率。

在使用中建议 将 const 和 constexpr 的功能区分开,即 凡是表达"只读" 语义的场景都使用 const ,表达 "常量" 语义的场景都使用 constexpr

在定义常量时,const 和 constexpr 是等价的,都可以在程序的编译阶段计算出结果,例如:

javascript 复制代码
const int m = f();    //不是常量表达式,m的值只有在运行阶段呢才会获取
const  int i = 520;   //是一个常量表达式	
const  int j = i + 1; //是一个常量表达式

constexpr int i = 520;  //是一个常量表达式
constexpr int j = i + 1; //是一个常量表达式

对于 c++ 内置类型的数据,可以直接用 constexpr 修饰,但如果是自定义的数据类型(用 struct 或者 class 实现),直接用 constexpr 修饰是不行的。

javascript 复制代码
//此处的 constexpr 修饰是无效的
constexpr  struct test
{
	int id;
	int num;
};

如果要定义一个结构体

javascript 复制代码
struct  T
{
	int a;
};

void  func(const int num)
{
	constexpr T t;
	cout<<t.a<<endl;
}

【注意】const 关键字 和 constexpr 的区别在于
const 用于声明一个常量,其值在初始化后不能被修改。然而,const 变量的值不一定在编译时就已知。它可以在运行时根据程序逻辑进行初始化。

constexpr 不仅表示常量,还要求其值必须在编译时就能确定。这意味着 constexpr 变量或函数的结果必须在编译阶段就可以计算出来,不依赖于运行时的状态。

4,auto

auto 是用来作为自动推导类型而存在的,它并不是一种时机的数据类型,只是一个类型声明的占位符。
使用 auto 声明的变量必须要进行初始化,以让编译器推导出它的实际类型,在编译时将 auto 占位符替换为真正的类型。

javascript 复制代码
auto  x = 3.14;  //正确
auto  y = 520;   //正确

auto  nb;   //错误,没有进行初始化不能推导
auto  double  nbl;  //错误,不能修改数据类型
相关推荐
shehuiyuelaiyuehao37 分钟前
算法29,前缀和,除自身以外的数组的乘积
java·数据结构·算法
小刘在重生~1 小时前
Java常用类|String类详解 + BigDecimal精准计算(含面试题)
java·开发语言·python
随遇而安zx1 小时前
【多线程】---JMM 与 volatile 深度解析
java·多线程
爱吃巧克力的程序媛1 小时前
main.cpp注册 C++ 类到 QML 元对象系统
c++·qt
YYYing.1 小时前
【C++进阶系列 (二)】关于线程堆栈的那些事——函数调用过程
开发语言·c++·函数·线程堆栈
邪修king1 小时前
Re:Linux系统篇(十九):进程篇(八): 进程等待详解:wait/waitpid,僵尸进程到底该如何回收
java·开发语言
啵啵啵鱼2 小时前
DS-顺序表
java·数据结构·笔记·后端·链表·obsidian
我爱写代码i2 小时前
SKAPP SK影视反编译详细教程+源码 含苹果端ipa
开发语言·javascript·ecmascript
TinyMemory2 小时前
Java 面向对象核心入门(七):方法重载 Overload,同一个方法名能干不一样的活
java·面向对象·overload·方法重载