c++学习笔记(部分语法及c++11新特性)

** _ 前言 _ **

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的别名