首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++11新关键字

1.auto auto关键字C++11之前,auto用来声明自动变量,表明变量存储栈,很少使用。C++11中被赋予了新含义和作用,用于类型推断。...auto关键字主要有两种用途:一变量定义根据初始化表达式自动推断该变量类型,二声明或定义函数作为函数返回值占位符,此时需要与关键字decltype连用。...auto不能用来声明函数返回值。但如果函数有一个尾随返回类型,auto可以出现在函数声明中返回值位置。...实际开发中,建议大家重写继承而来虚函数,加上关键字virtual表明当前函数虚函数,C++编译器“放纵”降低了代码可读性。...,用编译器来强制保证一些契约,改善编译信息可读性,尤其用于模板时候; (3)编译器遇到一个static_assert语句,通常立刻将其第一个参数作为常量表达式进行演算。

3K10

C++常见避坑指南

安全性高:由于使用了 const 关键字,这个字符串变量不可修改,可以避免意外修改和安全问题。 生命周期长:静态变量生命周期从程序启动到结束,不受函数调用和返回影响。...实际编程中,还是不太建议使用全局静态对象,建议写法: 要声明全局常量字符串,可以使用 const 关键字和 extern 关键字组合: // constants.h extern const char...; constexpr char* kVal="hahhahah"; 使用 constexpr 关键字声明全局常量字符串: // constants.h constexpr const char...除此之外,const 还能声明成员函数上,const 被放在了函数后面,表示这个函数一个“常量”,函数执行过程 const ,不会修改成员变量。...如果初始化由构造函数执行,则必须将构造函数声明constexpr. ● 当满足这两个条件,可以声明引用constexpr:引用对象由常量表达式初始化,并且初始化期间调用任何隐式转换也是常量表达式

29310
您找到你想要的搜索结果了吗?
是的
没有找到

『C++』我想学C++,C++太难了,那我想入门,给我10分钟我带你入门

使用标识符还有注意以下几点: 标识符长度最好不要超过8位,因为某些版本C中规定标识符前8位有效,当两个标识符前8位相同时,则被认为同一个标识符。 标识符严格区分大小写。...强制类型转换 强制类型转换通过定义类型转换运算来实现。...其一般形式为: (数据类型) (表达式) 其作用是把表达式运算结果强制转换成类型说明符所表示类型 使用强制转换应注意以下问题: 数据类型和表达式都必须加括号, 如把(int)(x/2+y)写成...,宏展开又以该字符串取代宏名,这只是一种简单代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。...constexpr函数必须满足下述限制: 函数返回值不能void类型 函数体不能声明变量或定义新类型 函数体只能包含声明、null语句或者一条return语句 形参实参结合后,return语句中表达式为常量表达式

1.6K10

C++11——引入关键字

1.auto auto关键字C++11之前,auto用来声明自动变量,表明变量存储栈,很少使用。C++11中被赋予了新含义和作用,用于类型推断。...auto关键字主要有两种用途:一变量定义根据初始化表达式自动推断该变量类型,二声明或定义函数作为函数返回值占位符,此时需要与关键字decltype连用。...auto不能用来声明函数返回值。但如果函数有一个尾随返回类型,auto可以出现在函数声明中返回值位置。...必须明确一点,constexpr声明中,如果定义了一个指针,限定符号constexpr仅仅对指针有效,与指针所指对象无关。...C++引入default关键字,可显示地、强制地要求编译器为我们生成默认版本。

1.4K50

阅读笔记

constexpr constexpr隐含意思在编译阶段求值,对于一些求值操作,如果声明constexpr,那么会编译器会尝试在编译阶段进行计算求值,如果求值成功,则用结果进行替换。...0; } 因为num被声明constexpr,所以正如前面所说,在编译阶段求值,又因为i一个非常量表达式,所以编译器报错如下: : In function 'int main()'...: Vector(int sz); } 可以使用Vector v = 3;这种方式进行初始化,往往这种并不是我们希望看到,所以可以使用关键字explicit来强制显式初始化: class Vector...在这个语法中,"hello"字符串字面值,而"s"用户定义字面量后缀,它将字符串字面值转换为std::string对象。...自gcc5.1之后,字符串优化采用了新机制,即SSO,其为Small String Optimization简写,中文译为小字符串优化,基本原理:当分配大小小于16个字节时候,从栈上进行分配,而如果大于等于

9710

c++基础之变量和基本类型

由单引号括起来一个字符char类型字面值,双引号括起来0个或者多个字符则构成字符串字面值常量。...针对这种需求我们可以使用const关键字 const修饰变量无法被修改(但是只语法层面上,可以通过类型转换方式强制将其指针修改为非constconst对象无法修改,所以const对象需要初始化...如果想要定义const变量在所有文件中都有效,不管在其定义还是声明语句前都加上extern关键字 //1.cpp extern const int g_i = 10; //定义同时也加上extern...非底层const可以赋值给底层const,而底层const无法赋值称为非底层const 执行拷贝操作,源对象可以是const或者非const、而目标对象只能是非const constexpr 和常量表达式...,无法确定是否常量表达式,我们可以需要定义常量表达式情况下使用 constexpr关键字,该关键字用来修饰一个常量表达式,如果对应语句不是一个常量表达式,编译器会报错,可以根据这个报错进行修改

1.5K30

【笔记】《C++Primer》—— 第2章

short没有对应值 两个字符串之间若没有逗号等运算符隔开,将会自动合并为一个字符串,这一点可以用来让cout代码中分行 \v纵向制表符,也就是转移为下一列情况下换行打印 \f换页符,一般效果类似换行符...分离式编译,需要在不同文件中共享一个变量就需要声明它。...只有一个下划线作为标识符合法哦 尽量在要开始使用一个标识才开始声明这个标识 ? 2.3.1 声明变量标识符前加一个&号,这个标识符就成为指向其后对象引用(reference)。...关键之来强制指定一个表达式常量表达式,不是无法通过检查 指针和引用都可以被定义为constexpr,但是指针初始值必须0之类固定内存内值 ?...2.5 传统中想要声明类型别名(type alias)使用typedef关键字C11中又引入了别名声明(alias declaration),关键字using,其作用是将等号左侧名字规定为右侧类型别名

50520

C++20新特性个人总结

thread_local修饰变量可不进行初始化  例子:  const char * get_str1() {     return "111111"; } constexpr const char...    constinit thread_local const char *str6; // 编译正确     return 0; }  2  语法  2.1  位域变量默认成员初始化  位域变量声明时可进行初始化...  因为模板参数处于编译期计算,因此,作为调用用于自定义类型模板参数成员函数,这些成员必须constexpr修饰。 ..."; // 大写Uutf-32字符串     return 0; }  2.26  允许转换成未知边界数组  这个特性比较简单,实参为数组传参形参可以是无边界数组。 ...  以下复制操作中,将会隐式采用移动操作代替复制操作情况:  ①如果return或co_return中表达式一个id-expression,其函数最内层语句块或lambda表达式主体或者参数声明子句中声明隐式可移动实体

1.8K50

【笔记】《C++Primer》—— 第一部分:C++基础

但实际上两者并没有什么高低之处 const大多数时候比define要更好,速度也更快 当需要在多文件中共享一个常量,最好做法一个单独文件中定义一个const并加上extern符,然后需要使用文件中声明这个...关键字 如果表达式decltype((x)),则返回类型永远引用,而没有双层括号才是按照x本身状态来判断 3 字符串,向量和数组 命名空间实际上可以使用using namespace::name...,a>A string构造函数参数可以是(num,char),从而得到重复了num次char字符串 size_type格式一个机器无关足以放下任何string无符号整形数 append(...成员前用mutable关键字,使得这个成员必定不会变为const,即使身处const函数之中也可以被改变 友元函数没有传递性 声明重载函数为友元,每一种重载都要分别声明一次 定义函数,一旦遇到类名...构造函数,成员若有类内初始值则必由字面值常量或其自己constexpr构造且类必须使用默认析构函数类,称为字面值常量类 static关键字只出现在类声明里,不能在外部重复这个关键字,最好将其定义与其他非内联函数放在一起以保证唯一次定义

1.4K40

C++:18---函数模板(template)

一、模板定义 template 以关键字template开头,后面跟一个模板参数列表,列表里面用逗号将多个模板参数隔开定义注意事项 模板编译 当编译器遇到一个模板定义,...只有当实例化处模板一个特定版本,编译器才会生成代码 重点:通常,当我们调用一个函数/定义实例化一个类,编译器只需掌握函数声明/类声明即可,因此可以把函数/类声明放置头文件,而把函数/类定义放置源文件中...(模板) 模板函数:调用函数模板生成函数(函数),也称为函数模板实例化 一个模板参数列表只和一个函数模板相对应。...但是这些关键字必须放在函数返回值类型前面,模板参数列表后面 template //正确inline T func(T const&);constexpr template //错误,constexpr位置错误T func2(T const&); 六、定义类型无关代码 当我们定义函数模板,如果函数能处理功能只限于一些特定情况,而不能作用于大多数情况

1.1K50

c++ primer2 变量和基本类型。

单引号括起来表示char字面值,双引号括出单个或者多个字符则构成字符串。 转义序列还是比较常用,最常用 \n, \t, \a, \r 分别是换行,横向制表,响铃,回车。...规则: 定义于任何函数体之外变量都会被初始化为0,定义函数内部内置类型变量将不被初始化,如果试图拷贝或者复制,将会报错! 声明。...使用extern关键字可以只表示声明而非定义,比如extern int j;就指标声明j,在后面的代码中还可以定义int j=0;,这样都是正确,特别的,任何进行了显式初始化声明即成为定义,且函数内部不允许使用这样...constexpr 表达式: 实际中允许将变量声明constexpr类型类型,由编译器来验证变量值是否一个常量表达式,这样声明表示变量一定是个常量,且必须由常量表达式来初始化。...必须声明constexpr声明中如果定义了一个指针,那么限定符仅对指针有效,与指针所指对象无关。

51210

【笔记】《C++Primer》—— 第7章:类

const,当创建const对象,对象是构造初始化完成后(执行构造函数体前瞬间)获得const属性 当没有任何构造函数编译器会默认生成一个构造函数,初始化(值初始化,默认构造或用初始值赋值)类内各种成员...7.3 类其他特性 用来定义类型成员必须先定义再使用 成员前用mutable关键字,使得这个成员必定不会变为const,即使身处const函数之中也可以被改变 提供类内初始值必须用等号或花括号 const...前面说到即使类内声明了友元也要在外部提供相应声明,这是因为我们需要友元函数在外部被使用/引用时,也处于正确作用域之中,不过很多编译器并不强制要求这一点而是进行了优化 7.4 类作用域 定义函数...(string a),当我们输入astring类来调用Test(a),则编译器会隐式将string转为OurString再调用Test,但当我们输入achar*“abcde”,由于编译器需要先把...const属性初始值或用constexpr来初始化 要注意由于静态变量不是由构造函数初始化,一般来说我们不能在类内初始化它,而是类内声明它然后类外定义并初始化它 由于类内初始化只是声明而已

58720

C++20 Text Formattingfmtlib 适配问题小记

其中 Text Formatting 一个我个人比较感兴趣新组件。它主要是解决了之前字符串格式化库 ( printf 系 ) 效率问题和运行时安全问题。 并且新格式设置形式也比较友好。...就在在GCC和Clang下,fmtlib 可以编译期验证输入格式字符串合法性。 但是这个特性 fmtlib 8.0 开始有一个很大变化。 首先,各类format接口变成了这种形式。...它含义可在编译期求值(注意和 const 关键字区分开来,一个函数和类型申明可以是 consteval 但不是 const )。...使用 format_log(caller, "Hello {}", "world") 。FMT 会被推断为 const char[9]& 。然后传给 fmt::format_to_n(...) 。...调用其实就不再编译期可以求值 constexpr 了(因为上层函数签名没有这个保证)。

1K20

C++11基础学习系列三

使用数组注意一下几点: 1.数组维度必须常量表达式,在编译已知。...int a[size/getsize()]={1,2,3}; 2.数组类型不能使用auto关键字推断类型。 3.显示初始化数组元素,可省略数组维度。...auto(nums) p1; // p2 一个字符串数组 decltype(nums) p2 = {"c","d"}; //C++11引入新标准,来获得数组首元素地址和末尾元素下一个位置地址。...由于拷贝大类型对象或者容器对象比较低效,甚至有的类型(IO类型)不支持拷贝,这时我们尽量采用按引用传递,这样可以避免拷贝付出代价。如果函数内无须改变参数,最好将其声明为常量引用。...由于这样声明太过于麻烦,所以c++11标准中通过尾置返回类型,任何函数都能使用尾置返回类型。上述声明可以通过: auto func(int i)->int(*)[10]

79940

C++ 中 constconstexpr关键字解析:常量、函数和指针

很多C++初学者看到const这个关键字第一反应都是一头雾水,主要是因为const可以出现在很多位置,以及后面加入constexpr更是常常感到困惑,今天就为大家一一解释出现它们含义和以及作用...很多全局变量都是通过常量来进行修饰,需要注意,使用const关键字修饰变量需要立刻初始化 // 修饰局部变量,全局变量,成员变量 const int a = 2; // 错误,表达式必须可修改左值...引用 这是const最常用一种方式,通常用于函数参数列表中,因为我们知道C++中函数参数有3中传递方式,分别是值传递,指针传递(或者叫地址传递),引用传递,前两种传递都会发成拷贝行为 指针本身也是一个变量...所以为了避免意外修改导致实参值发生改,通常会采用const加上引用方式传递参数 void test(const Student &s) { ... } constexpr关键字 constexpr...C++11中引入一个关键字,它作用主要是用来修饰一些函数和变量,使其成为常量表达式,从而在编译器就可以进行计算,进一步提高程序运行期效率 常量表达式:指的是有一个或多个常量组成表达式,实际开发中经常会接触到常量表达式

70020

第七章 函数

包含零个形参,可以使用void标记 对于非模板函数来说,其每个形参都有确定类型,但形参可以没有名称 形参名称变化并不会引入函数不同版本 实参到形参拷贝求值顺序不定,C++17强制...一个翻译单元中,每个形参缺省实参只能定义一次 具有缺省实参函数调用时,传入实参会按照从左到右顺序匹配形参 缺省实参为对象 ,传入缺省值会随对象值变化而变化 main函数两个版本 无形参版本...因为objStr对象,所以会去MyNS域中查找 重载解析:名称查找基础上进一步选择合适调用函数 过滤不能被调用版本(non-viable candidates)...参数个数不对 无法将实参转换为形参 实参不满足形参限制条件 剩余版本中查找与调用表达式最匹配版本,匹配级别越低越好(有特殊规则) 级别1:完美匹配 或 平凡转换(比如加一个const) 级别2:...4.inline关键字声明一定要有函数定义。

16530

终极 C++避坑指南

编译期会将字符串常量存储一个全局区,然后再使用字符串常量位置用一个指针代替。所以基本可以等价认为,字符串常量(字面量)const char *类型。...类型推导问题 进行类型推导字符串常量会按const char *来处理,有时会导致问题,比如: template  void f(T t) {   std::cout <<...指针意义不明问题 由于 C++保留了 C 风格字符串行为,因此很多场景下,把const char *就默认为了字符串,都会按照字符串去解析。...,打印指针值   std::cout << &b << std::endl; // 流接收char *,按字符串处理 } STL 中所有流接收到char *或const char *,并不会按指针来解析...但换成常量表达式constexpr要放在最前,因此不能写成const char *constexpr str,而是要写成constexpr const char *str。

2K20
领券