前言
c++的语法细节实在过杂,再加上c++11的新特性,看了又忘,忘了再看,故讲学习过程所得以笔记形式记录于此。
1. c++对变量初始化的形式
int a = 0; int a = {0}; int a(0); int a{0};//叫做列表初始化 c++11时,才得以全面应用
long double b = 1.02; int a(b); int a=b; //正确:转换执行,但丢失了部分值
int a{b}; int a={b};//错误:转换未执行,因为存在丢失信息的危险
2. 变量声明和定义的关系
extern int x; //为声明 int x; //为定义
任何包含了显示初始化的声明即为定义 如:extern int a=8; //给a赋初始值抵消了extern的作用
在函数体内部初始化extern标记的变量 将引发错误
3.常量
const限定符
const a=2; //在预处理时,编译器会讲所有的a全部用2来替换 (和宏定义类似)
默认状态下,const对象仅在文件内有效。当多个文件中出现了同名的const变量时,其实等同于在多个文件同时定义变量
若想一次定义多次声明式的在多个文件使用,必须在定义和声明时都使用 extern来限定const的引用
const int i=2;
const int &r=i;//正确
&r=i+1; // 错误
既然常量值不允许改变,当然也不能通过引用改变 所以引用也必须为const 类型顶层const和底层const const int a= 10;//顶层const
int b=10;
int *const p=b;//底层const简单的说 用const 直接 修饰的变量对象等都是顶层const 而 指向const变量或对象的指针和引用 都是底层const
特殊:const int a=10; const int *const p=a; 此时p既是顶层const又是底层const
4.常量表达式
指值不会改变且在编译过程中就能得到计算结果的表达式
int a=1;//不是 const int b=2;//是
const int c=b+2;//是 const int d=a+b;//不是
5.auto类型说明符
如果在声明时不知道变量初始化的值和类型 可以用
auto int a=5,b=4;
auto c = a+b;
编译器会通过a+b的值来推算变量的类型 所以auto定义的变量必须有初始值
6.decltype类型指示符
如果希望从表达式来得到变量类型,但是并不像用变量的值来进行初始化,可以用decltype类型提示符
用法 decltype(x) sum = 11;
x 可以是函数 f() 可以是变量 可以是表达式 特别的 x可以是引用 引用从来都是做为其所指对象的别名出现
只有在此处是个意外 若 int a; decltype((a)) b; 则b是引用类型
因为变量a是可以作为赋值语句左值的特殊表达式 所以(a)的类型便是引用
7.类型别名
typedef typedef a b 将b作为a的别名
using x=y;将x作为y的别名