c++11 新特性学习(1)
1.原始字面量
在 C++11 中添加了定义原始字符串的字面量,定义方式为:R “xxx(原始字符串)xxx” 其中()两边的字符串可以省略。原始字面量 R 可以直接表示字符串的实际含义,而不需要额外对字符串做转义或连接等操作。(如\n \t缩进这种)
比如:编程过程中,使用的字符串中常带有一些特殊字符,对于这些字符往往要做专门的处理,使用了原始字面量就可以轻松的解决这个问题了,比如打印路径:
#include<iostream> #include<string> using namespace std; int main() { string str = "D:\hello\world\test.text"; cout << str << endl; string str1 = "D:\\hello\\world\\test.text"; cout << str1 << endl; string str2 = R"(D:\hello\world\test.text)"; cout << str2 << endl; return 0; }
在 C++11 之前如果一个字符串分别写到了不同的行里边,需要加连接符,这种方式不仅繁琐,还破坏了表达式的原始含义,如果使用原始字面量就变得简单很多,很强直观,可读性强。
#include<iostream> #include<string> using namespace std; int main() { string str = R"(<html> <head> <title> 海贼王 </title> </head> <body> <p> 我是要成为海贼王的男人!!! </p> </body> </html>)"; cout << str << endl; return 0; }
2.指针空值类型
在 C++ 程序开发中,为了提高程序的健壮性,一般会在定义指针的同时完成初始化操作,或者在指针的指向尚未明确的情况下,都会给指针初始化为 NULL,避免产生野指针(没有明确指向的指针,操作也这种指针极可能导致程序发生异常)。C++98/03 标准中,将一个指针初始化为空指针的方式有 2 种:
char *ptr = 0; char *ptr = NULL;
在老版c++中NULL就是零
出于兼容性的考虑,C++11 标准并没有对 NULL 的宏定义做任何修改,而是另其炉灶,引入了一个新的关键字 nullptr。nullptr 专用于初始化空类型指针,不同类型的指针变量都可以使用 nullptr 来初始化。
3.constexpr
在 C++11 之前只有 const 关键字,从功能上来说这个关键字有双重语义:变量只读,修饰常量,举一个简单的例子:
void func(const int num) { const int count = 24; int array[num]; // error,num是一个只读变量,不是常量
int array1[count]; // ok,count是一个常量 int a1 = 520; int a2 = 250; const int& b = a1; b = a2; // error a1 = 1314; cout << "b: " << b << endl; // 输出结果为1314 }
1).静态数组初始化的时候[]中要是常量
2).func(const int num)函数nun不是常量,只是在函数中不能修改它的值
定义常量用constexpr,定义只读用const
constexpr可以定义结构体对象
constexpr可以修饰函数(修饰返回值的)
1)声明和定义要在main之上
2)修饰模板函数
4.自动类型推导
https://subingwen.cn/cpp/autotype/#1-1-%E6%8E%A8%E5%AF%BC%E8%A7%84%E5%88%99
4.1auto
C++11 中 auto 并不代表一种实际的数据类型,只是一个类型声明的 “占位符”,auto 并不是万能的在任意场景下都能够推导出变量的实际类型,使用auto声明的变量必须要进行初始化,以让编译器推导出它的实际类型,在编译时将auto占位符替换为真正的类型。
4.2 auto的限制
auto 关键字并不是万能的,在以下这些场景中是不能完成类型推导的:
1)不能作为函数参数使用。因为只有在函数调用的时候才会给函数参数传递实参,auto 要求必须要给修饰的变量赋值,因此二者矛盾。
2)不能用于类的非静态成员变量的初始化
3)不能使用 auto 关键字定义数组
4)无法使用 auto 推导出模板参数
常用地方
容器遍历
#include <map> int main() { map<int, string> person; // 代码简化 for (auto it = person.begin(); it != person.end(); ++it) { // do something } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!