1.3、声明
1.3.1、auto
以前版本关键字auto是一个存储类型说明符,表示动态存储还是静态存储,与static关键字对应,第九章也写了,C++11将其用实现自动类型推断(第三章)。必须显示初始化,让编译器能够将变量类型设置为初始值的类型。
示例:
#include "iostream"
#include "stdio.h"
#include "string"
using namespace std;
double f(int a,int b){return 0;}
auto pf=f;
int main(int argc,char const *argv[]){
auto a=1;
auto b=1.2;
auto ptr=&a;
string s="******";
auto s_begin=s.begin();
auto c=s;
return 0;
}
auto 不能用于函数形参!!!!如void f(auto x);
1.3.2、decltype
关键字decltype将变量类型声明为表达式指定的类型。比如decltype(x) y 让y类型与新类型相同。示例:
double x;
int n;
decltype(x*n) y;//y是double类型
decltype(&x) z;//z是double *类型
decltype((x)) m;//z是double &类型
1.3.3、返回类型后置
C++11新增了一种语法:在函数名和参数名后面指定返回类型,示例:
auto double(int x,double y)->decltype(x*y){
return x*y;
}
1.3.4、模板别名:using =
对于冗长或复杂的标识符,如果能够创建其别名将很方便。以前,C++为此提供了typedef:
typedef std::vector< std::string >:: iterator itType;
C++ll提供了另一种创建别名的语法,这在第14章讨论过:
using itType=vector< std::string >:: iterator;
差别在于,新语法也可用于模板部分具体化,但typedef不能:
template< ypenameT>
using arr12 = Std::array<T,12>;
上述语句具体化模板array<T,int>对于下述声明:
std::array<double,12> a1;
std:: array<string,12> a2;
可将它们替换为如下声明:
arr12< double>a1;
arr12(std::string>a2:
1.3.5、nullptr
C++里NULL源码:
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
空指针是不会指向有效数据的指针。以前,C++在源代码中使用0表示这种指针,但内部表示可能不同, 这带来了一些问题,因为这使得0即可表示指针常量,又可表示整型常量。正如第12章讨论的,C++11新增了关键字nullptr.用于表示空指针;它是指针类型,不能转换为整型类型·为向后兼容,C++11仍允许使用0来表示空指针,因此表达式nullptr==0为true,但使用nullptr而不是0提供了更高的类型安全。
例如,可将0传递给接受int参数的函数,但如果您试图将nullptr传递给这样的函数,编译器将此视为错误因此,出于清晰和安全考虑,请使用nullptr。
示例:
#include <iostream>
using namespace std;
void func(char *p)
{
cout << "void func(char *p)" << endl;
}
void func(int p)
{
cout << "void func(int p)" << endl;
}
int main()
{
func(NULL); // 想要调用重载函数 void func(char *p)//实际调用的为void func(int p)
func(250); // 想要调用重载函数 void func(int p)
fuc(nullptr); // 调用void func(char *p)
return 0;
}
打印结果:
void func(int p)
void func(int p)
void func(char *p)