您的位置:首页 > 编程语言 > C语言/C++

C++11学习笔记(变量和基本类型)

2015-07-27 11:04 281 查看
近来在学习C++11新标准,在学习的过程中发现,有一些知识点仅仅只是看一遍是完全不能够立马掌握的,而后面再去找一遍也较为麻烦,因此留下一些学习的笔记,以便于温习和查阅。

1. constexpr 和常量表达式

常量表达式是指值不会改变并且在编译过程就能得到计算结果的表达式。
const int max_files=20;   //常量表达式
const int sz=get_size();    //非常量表达式,sz在运行时才能确定
C++11中,允许将变量声明为constexpr类型,由编译器来验证变量的值是否是一个常量表达式。因此不能使用普通函数作为constexpr变量的初始值,但可以定义特殊的constexpr函数,在编译时即能够得到计算结果,这样就能用该函数初始化constexpr变量。

2. 类型别名声明

传统的typedef:
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"></span><pre name="code" class="cpp">typedef double typeDouble; //typeDouble 是 double 的同义词typedef typeDouble base;  //同上typedef base *ptypeDouble;  //ptypeDouble 为双精度浮点型指针
新的类型别名声明:
using typeDouble=double;   //typeDouble 是一种double类型
特别注意:typedef char * pstring;const pstring cstr=0;    //cstr 是指向char的常量指针,即cstr指向的内存地址不变congest pstring *ps;     //

3. auto类型说明符

自动类型推导。需要注意到而是复合类型、常量和auto:引用:使用引用其实是使用引用的对象,特别是当引用被用作初始值时,真正参与初始化的其实是引用对象的值。
int i =0 , & r = i;auto a=r;  //此时,a是int 类型,而不是引用类型
常量:auto一般会忽略顶层const,同时底层const 会被保留下来当初始值为指向常量的指针时:
const int ci=i,&cr=ci;auto b=ci;  \\ b是一个整数,顶层的const 被忽略auto c=cr;   \\ c是一个整数auto d=&i;   \\ d是一个整型指针,因为i本身是一个整数auto e=&ci;   \\ e是一个指向整数常量的指针,因为此处的const是底层const
如果希望推断出来的auto 是一个顶层的const,需要明确指出:
const auto f = ci;   // f是 const int
特别的:在一条语句中定义多个变量,切记,符号*和符号&只属于某个声明符,而不是数据类型的一部分,因此初始值必须是同一类型:
auto k = ci , &l = i ;    //ci和i都是整型,因此正确auto &m=ci , *p=&ci;  //m 是ci的引用,p是指向整型常量的指针auto &n=i, *p2=&ci;    //错误 i是整型,但是ci是常量整型

4. Decltype类型指示符

作用是选择并返回操作数的数据类型,在此过程编译器并不实际计算表达式的值。
decltype ( f() )sum= x;   //sum 的类型是函数 f() 的返回值类型
decltype 在处理顶层const 和应用的方式和auto 有不同:如果decltype使用的表达式是一个变量,则decltype返回该变量的类型,包括顶层const和引用在内:
const int ci=0,&cj-=ci;decltype(cj)  x=0;   //x的类型是cost intdecltype(cj)  y=x;   //y的类型是 const int&decltype(cj)  z;      //错误
decltype和引用:如果decltype使用的表达式不是一个变量,则decltype返回表达式结果对应的类型:
//decltype的结果可以是引用类型int i=42,  *p=&i, &r=i;   //decltype(r+0) b;    //r是引用,但表达式的值是整型,因此b是整型decltype(*p) c;     //p是指针,但是对p解引用后为引用。
decltype和auto的另一处重要区别是,decltype的结果类型与表达式形式密切相关。注意一种特别情况:所用表达式加上一对括号与不加括号时会有不同:不加括号的变量,得到的结果是该变量的类型;加上括号,则编译器将它当成表达式,而变量是一种可以作为赋值语句右值的特殊表达式,因此,这样的decltype 将得到引用类型。换而言之:decltype ((variable)) 结果永远是引用,但是decltype (variable),只有当variable本身是引用才是引用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: