long long
bool | 布尔类型 | 未定义 |
char | 字符 | 8位 |
wchar_t | 宽字符 | 16位 |
char16_t | Unicode字符 | 16位 |
char32_t | Unicode字符 | 32位 |
short | 短整型 | 16位 |
int | 整型 | 32位 |
long | 长整型 | 32位 |
long long | 长整型 | 64位 |
float | 单精度浮点型 | 6位有效数字 |
double | 双精度浮点型 | 10位有效数字 |
long double | 扩展精度浮点型 | 10位有效数字 |
C++规定,一个int至少和一个short一样大,一个long至少和一个int一样大,一个long long至少和一个long一样大。
其中,long long就是C++11的新定义。
列表初始化
- 用花括号初始化对象
注意:
如果我们用来初始化的初始值存在丢失信息的风险,编译器会报错
12345678//比如double _pi = 3.1415926;//下面两句会报错,因为double转为int存在信息丢失的风险int _pi_1{_pi};int _pi_2 = {_pi};//不报错,无视信息丢失的写法int _pi_3(_pi);int _pi_4 = _pi;
nullptr
空指针:不指向任何对象,得到空指针的最直接的办法就是用nullptr
来初始化指针。
nullptr
是一种特殊的字面值,它可以被转换成任意其他的指针类型。
1 |
int * _iptr = nullptr; |
constexpr
- C++11规定,允许将变量声明为constexpr类型,以便由编译器来验证变量的值是否是一个常量表达式
- 声明为
constexpr
的变量一定是一个常量,而且必须用常量表达式去初始化它。
1 2 3 4 5 |
//10和_aet都是常量表达式 constexpr int _aet = 10; constexpr int _lif = _aet + 1; //只有当size是一个constexpr函数时,下面这条语句才是正确的 constexpr int _size = size(); |
对于某个给定的内联函数或者constexpr函数来说,它的多个定义必须完全一致。基于这个原因,内联函数和constexpr函数通常定义在头文件中。
类型别名
1 2 3 4 |
//传统方法 typedef int elem; //C++11 using elem = int; |
auto
编译器替我们分析表达式的类型
这个类型的推断结果,是根据表达式的初始值(会计算出表达式的值)来确定的
1 2 |
auto i = 0; auto *p = &i; |
decltype
编译器帮我们分析表达式的类型
这个推断结果,是不计算表达式的值的,而且,表达式如果是函数,编译器同样也不会调用函数,只获取该函数的返回类型
1 2 3 4 5 6 7 8 9 |
//_result的类型就是函数f的返回类型 decltype(f()) _result = x; const int _a = 0, &_b = _a; decltype(_a) _x = 0;//_x类型是const int decltype(_b) _y = _x;//_y类型是const int &,所以_y为_x的引用 //错误,前面是引用类型,而引用必须被初始化 decltype(_b) _z; |
类内初始化
C++11规定,可以为类的数据成员提供一个类内初始值。创建对象时,类内初始值用于初始化数据成员。
1 2 3 4 5 6 |
class Aet { public: string m_name{"aet"}; int m_age{18}; }; |
范围for循环
1 2 3 4 5 6 7 8 9 10 |
string _str{"lifwang"}; vector<int> _vec; _vec.push_back(1); _vec.push_back(2); for(auto elem : _vec) cout << elem << endl; for(auto & _char : _str) toupper(_char); |
关于vector
1 2 3 4 5 6 |
//如果vector里面的元素是一个vector //旧版本写法 vector<vector<int> > _vecV_vecI; //C++11新写法(少空格,以前没有那个空格就识别有误) vector<vector<int>> _vecV_vecI; |
列表初始化vector对象
1 2 3 |
vector<string> _vecS{"aet","lif","wx18"}; vector<int> _vecI{1,2,3}; |
容器的cbegin和cend
cbegin
返回指示容器第一个元素的const迭代器
cend
返回指示容器最后一个元素下一位置的const迭代器
特点:
不管容器对象本身是不是const属性的,cbegin和cend返回的迭代器都是带有const属性的
1 2 3 |
vector<int> _vec; auto _iteBegin = _vec.cbegin();//类型为:vector<int>::const_iterator auto _iteCend = _vec.cend();//类型为:vector<int>::const_iterator |
标准库函数begin和end
C++11引入了两个名为begin和end的函数
这两个函数在iterator头文件中
begin返回指向array首元素的指针,end返回指向array尾元素下一位置的指针
1 2 3 4 |
int array[] = {0,1,2,3,4,5,6,7,8,9}; int * beg = begin(array); int * last = end(array); |
除法的舍入规则
在除法运算中,如果两个运算对象的符号相同则商为正(如果不为0的话),否则商为负。
C++早期的版本允许符号为负值的商向上或向下取整。
C++11新标准则规定商一律向0取整(即直接切除小数部分)。
大括号值列表赋值
1 2 |
vector<int> _vecI; _vecI = {0,1,2,3,4,5,6,7,8,9}; |
sizeof用于类成员
C++11标准允许我们通过使用域作用符来获取类成员的大小。
sizeof运算符的结果部分地依赖于其作用的类型:
- 对char或者类型为char的表达式执行sizeof运算,结果为1。
- 对引用类型执行sizeof运算,得到被引用对象所占空间的大小。
- 对指针执行sizeof运算,得到指针本身所占空间的大小。
- 对解引用指针执行sizeof运算,得到指针指向的对象所占空间的大小,指针不需要有效。
- 对数组执行sizeof运算,得到整个数组所占空间的大小,等价于对数组中所有元素各执行一次sizeof运算然后将所得结果求和。
sizeof运算不会讲数组转换成指针来处理。 - 对string对象或vector对象执行sizeof运算,只返回该类型固定部分的大小,不会计算对象中的元素占用了多少空间。
标准库initializer_list类
为了编写能处理不同数量实参的函数,C++11标准提供了两种主要的方法:
- 如果所有的实参类型相同,可以传递一个名为initializer_list的标准库类型
- 如果实参的类型不同,我们可以编写一种特殊的函数,也就是所谓的可变参数模板
- C++还有一种特殊的形参类型(省略符),可以用它传递可变数量的实参(这种功能一般只用于于C函数交互的接口程序)。
initializer_list是一种标准库类型,用于表示某种特定类型的值的数组。
它定义在同名头文件中。
和vector不同的是,initializer_list对象中的元素永远是常量。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#include <initializer_list> initializer_list<string> sli; //可变参数 void error_msg(initializer_list<string> sli) { for(auto beg = sli.begin();beg != sli.end(); ++beg) cout << *beg << " "; cout << endl; } //传参调用 if(expected != actual) error_msg({"functionX",expected,actual}); else error_msg({"functionX","okay"}); //改进函数 void error_msg_new(ErrCode e,initializer_list<string> sli) { cout << e.msg() << ":"; for(const auto & elem : sli) cout << elem << " "; cout << endl; } //改进后调用 if(expected != actual) error_msg_new(ErrCode(22),{"functionX",expected,actual}); else error_msg_new(ErrCode(11),{"functionX","okay"}); |
列表初始化返回值
C++11标准规定,函数可以返回花括号包围的值的列表。
类似于其他返回结果,此处的列表也用来对表示函数返回的临时量进行初始化。
1 2 3 4 5 6 7 8 9 10 |
vector<string> process() { //expected和actual是string对象 if(expected.empty()) return {}; else if(expected == actual) return {"functionX","okay"}; else return {"functionX",expected,actual}; } |
如果,函数返回的是内置类型,则花括号包围的列表最多包含一个值,而且,该值所占空间不应该大于目标类型的空间。
如果,函数返回的是类类型,由类本身定义初始值如何使用。
定义尾置返回类型
将函数的返回类型放在最后边,而本来放置返回类型的地方则用auto代替,格式如下:
1 |
auto func(int i)->int(*)[10]; |
使用default生成默认构造函数
在C++11标准中,如果我们需要默认的行为,那么可以通过在参数列表后面写上= default
来要求编译器生成构造函数。
其中,= default
既可以和声明一起出现在类的内部,也可以作为定义出现在类的外部。
如果= default
在类的内部,则默认构造函数是内联的;然后,如果它出现在外部,则该成员默认情况下不是内联的。
1 2 3 4 5 6 7 8 9 |
class Aet { public: Aet() = default; Aet(int lhs,int rhs):m_w(lhs),m_x(rhs) {} public: int m_w; int m_x; }; |
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 51CTO:Linux C++网络编程二08/14
- ♥ Boost 程序库完全开发指南:容器算法数学文件08/24
- ♥ C++标准模板库编程实战_序列容器12/06
- ♥ Soui应用 动画二06/27
- ♥ 深入理解C++11:C++11新特性解析与应用 二12/30
- ♥ Spdlog记述:二07/09