C++ Primer Plus(一)

完整阅读C++ Primer Plus 

  系统从新学习C++语言部分,记录重要但易被忽略的,关键但易被遗忘的。html

 

预备

  一、C++相对于C增长了最关键的两项,面向对象和范型编程。express

 

处理数据

  二、对于变量明,C++没有长度限制;同时,以两个下划线或一个下划线和大写字母开头的名称被保留给实现(编译器及其使用的资源)使用;以一个下划线开头的名称被保留给实现,用做全局标识符。编程

  三、C++11提供一种大括号初始化器,能够用它初始化任何类型。函数

1 int ham = {24};
2 int ems{7};
3 int roc = {}; // 为0
4 int rhs{};

  四、对于整型字面值,若是第一位为1~9则为十进制;若是第一位为0,第二位为1~7,则是八进制;若是前两位为0x或0X,则为十六进制。若是但愿使用cout输出八进制或十六进制格式的整数,可使用cout的控制符(这三个控制符都被包含在std命名空间)。学习

1 cout << dec << a; // 10进制,默认的
2 cout << oct << b; // 8进制
3 cout << hex << c; // 16进制

  五、cout.put()、cin.get()的用法,可参照C语言中get()与put()的用法。编码

  六、C++有一种表示特殊字符的机制,他独立于键盘,被称做通用字符名。通用字符名以\u或\U开头,前者后面是8个十六进制位,后者后面则是16个十六进制位。这些位表示的是ISO10646码点。spa

  七、对于宽字符类型wcha_t,cin和cout没法很好的处理,此时应该使用wcinwcout指针

  八、C++11新增了char16_t和char32_t类型,C++11使用前缀u表示前者,U表示后者;并与形式为\u00F6和\U0000222B的通用字符名匹配。code

1 u'C' u“be good”   U'R' U”dirty rat”

  

复合类型

  九、cin使用空白(空格、制表符、换行符)来肯定字符串结束的位置,而cin.getline()能够依据换行符来读取整行,而且能够制定最多读取字符的数量。htm

  十、可使用没有名称的结构类型,方法是省略名称,同时定义一个结构类型和一个这种类型的变量,不经常使用,可用做临时变量。

  十一、C++容许对一个整数强制类型转换为一个枚举值,并参与赋值操做;同时能够有多个值相同的枚举值,目前枚举值也可使用long,long long类型的值。对于较小的值编译器会使用一个字节甚至更少的的字节,对于包含long类型的枚举,会使用4个字节。

  十二、在C中容许给指针直接赋字面值,但C++不容许,必须进行类型转换。

 

循环和关系表达式

  1三、前缀递增,前缀递减,解除引用运算符的优先级相同,以从右往左的方式进行结合;后缀递增,后缀递减的优先级相同,但比前缀运算符的优先级高,以从左往右的方式结合。

  1四、 cin.get(ch)和cin.get()的区别。

属性 cin.get(ch) cin.get()
传递输入字符的方式 赋值给参数ch 将函数返回值赋给ch
用于字符输入时函数的返回值  istream对象(执行bool转换后为true)  int类型的字符编码
到达EOF时函数的返回值   istream对象(执行bool转换后为false) EOF 

 

函数——C++编程模块

  1五、若是数据类型自己并非指针,则能够将const数据或者非const数据的地址赋给指向const的指针,但只能将非const数据的地址赋给非const指针

 

函数探幽

  1六、函数重载后,在调用函数时,若是没有彻底相同的参数类型,编译器会作强制类型转换进行匹配,但若是有多个可转换的类型(也就是说有多个重载过的函数),C++将拒绝这种函数调用。

  1七、函数重载的关键是函数的参数列表,也成为特征标,如下两个声明互斥:

1 long gronk(int n, float m);
2 double gronk(int n, float m);

  C++不容许这种方式的重载,返回类型能够不一样,但特征标必须也不一样。

  1八、对于重载了引用参数的函数,C++将选择调用最匹配的版本,这使得可以根据参数是左值引用,const类型的左值引用仍是右值引用来定制函数的行为。

  1九、 函数模板并不是函数定义,在使用模板时,编译器会针对特定的类型生成函数实例,这种实例化方式被称为隐式实例化

  20、C++容许显式实例化,也就是说能够针对特定类型使用模板生成特定的实例。

1 template void Swap<int>(int, int); // 用<>指定类型,在声明前加template

  它的语义为“使用Swap()模板生成int类型的函数定义”。

  与显式实例化不一样的是,显式具体化使用下面两个等价的声明之一:

1 template<> void Swap<int>(int, int);
2 template<> void Swap(int, int);

  它们的语义是,“不要使用Swap模板来生产函数定义,而应使用专门为int类型显示地定义的函数定义”。

  2一、还能够在程序中建立显式实例化:

1 template <class T>
2 T Add(T a, T b){ return a + b; }
3 int m = 6;
4 double n = 9.8;
5 cout << Add<double>(m, n) << endl;

  因为这里显示实例化中的特定类型为double,因此变量m会被强制类型转换成double类型。

  2二、对于函数重载函数模板函数模板重载,C++将选择哪一个版本?

  请看这里--------->   C++ 函数重载,函数模板和函数模板重载,选择哪个

  2三、C++11,在函数模板中,当没法得知一个变量的值时,可使用decltype关键字来决定返回值类型:

1 template<class T1, class T2>
2 void ft(T1 x, T2 y)
3 {
4     decltype(x+y) xpy = x + y; // 此时xpy的类型就是x+y后的类型
5 }

  2四、decltype关键字本质上更复杂一些,编译器必须遍历一个核对表去肯定类型,如今有以下声明:

1 decltype(expression) var;

  第一,expression是一个没有用括号括起来的标识符,则var的类型与该标识符相同,包括const等限定符。

  第二,若是expression是一个函数调用,则于与函数的返回值相同,这里并不执行函数,只是查看返回值类型。

  第三,若是expression是一个左值,而且expression是被括号括起的,var会是引用类型,不然第一步就会处理。

  第四,到了这里,var的类型只能与expression相同。

  2五、C++11,在函数模板中,当没法得知返回值类型时,通常不能够直接使用关键字decltype来获得返回值类型,由于此时每每decltype后面表达式中的变量还不在做用域内,此时,须要使用后置返回类型

1 template<class T1, class T2>
2 auto gt(T1 x, T2 y) -> decltype(x+y) // 此时x,y已在做用域内
3 {
4     return x + y;
5 }

  auto表示是一个占位符,表示后置返回类型提供的类型。