完整阅读C++ Primer Plus

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

预备

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

处理数据

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

  3、C++11提供一种大括号初始化器,可以用它初始化任何类型。

 int ham = {};
int ems{};
int roc = {}; // 为0
int rhs{};

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

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

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

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

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

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

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

  

复合类型

  9、cin使用空白(空格、制表符、换行符)来确定字符串结束的位置,而cin.getline()可以依据换行符来读取整行,并且可以制定最多读取字符的数量。

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

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

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

循环和关系表达式

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

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

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

函数——C++编程模块

  15、如果数据类型本身并不是指针,则可以将const数据或者非const数据的地址赋给指向const的指针,但只能将非const数据的地址赋给非const指针

函数探幽

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

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

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

  C++不允许这种方式的重载,返回类型可以不同,但特征标必须也不同。

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

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

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

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

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

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

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

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

  21、还可以在程序中创建显式实例化:

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

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

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

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

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

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

  24、decltype关键字本质上更复杂一些,编译器必须遍历一个核对表去确定类型,现在有如下声明:

 decltype(expression) var;

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

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

  第三,如果expression是一个左值,并且expression是被括号括起的,var会是引用类型,否则第一步就会处理。

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

  25、C++11,在函数模板中,当无法得知返回值类型时,一般不可以直接使用关键字decltype来得到返回值类型,因为此时往往decltype后面表达式中的变量还不在作用域内,此时,需要使用后置返回类型

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

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

C++ Primer Plus(一)的更多相关文章

  1. C Primer Plus 学习体会

    本月刚刚开始学习<C primer plus>,之前课上草草学过一遍,讲到指针就结束了.现在重新开始看感觉难度不大只是刚开始接触有些语言细节比较琐碎.学习这一周的体会如下: 诸多前辈推荐的 ...

  2. C++ Primer Plus 第六版笔记

    C++ Primer Plus 第六版笔记 关于对象声明的思考 转自:http://www.cnblogs.com/weiqubo/archive/2009/11/02/1930042.html C+ ...

  3. 《3D Math Primer for Graphics and Game Development》读书笔记2

    <3D Math Primer for Graphics and Game Development>读书笔记2 上一篇得到了"矩阵等价于变换后的基向量"这一结论. 本篇 ...

  4. 《3D Math Primer for Graphics and Game Development》读书笔记1

    <3D Math Primer for Graphics and Game Development>读书笔记1 本文是<3D Math Primer for Graphics and ...

  5. 再读《C++ Primer》——变量和基本类型

    刚上大学那时,几个室友一块买了本<C++ Primer>第4版,看了一遍后就没怎么碰了,偶尔拿出来翻翻,当作工具书使用.后来知道有第5版了,一直觉得内容差不多吧.直到最近,再读其中的一些内 ...

  6. C Primer Plus_第6章_循环_编程练习

    1.题略 #include int main(void) { int i; char ch[26]; for (i = 97; i <= (97+25); i++) { ch[i-97] = i ...

  7. C Primer Plus_第5章_运算符、表达式和语句_编程练习

    Practice 1. 输入分钟输出对应的小时和分钟. #include #define MIN_PER_H 60 int main(void) { int mins, hours, minutes; ...

  8. C++Primer 5th 练习 12.19

    这阵子真是太忙了, 连续做了四个课设. 当然这并不能作为好久没写博客的借口, 没写博客的主要原因只有一个: 懒. 最近又开始回顾C++的语法与特性(据说C++就是一门需要反复回顾的语言),以及学习C+ ...

  9. [翻译]Primer on Cognitive Computing(认知计算入门)

    Source Kelly J., Primer on Cognitive Computing 20150216. 侵删,联系方式:zhoujiagen\@gmail.com. 按A candidate ...

  10. c++ Primer 第四版 第一阶段 const总结

    由于期末值考一门软件安全,所以果断看起c++Primer ,因为之前看谭浩强的c++感觉没什么用啊.所以这本书每阶段做个总结!!! 1.Const限定符作用: 在for循环中上限应该用一个固定变量来设 ...

随机推荐

  1. 51Nod - 1255

    也是第十一届校赛的C题,不过他把1e5改成了1e7. 一开始就想到用贪心做.思路是这样的:开一个字符数组ans保存答案.然后从头到尾遍历题目给出的字符串S,如果ans数组中还没有这个字母,那么就把字母 ...

  2. 转载 配置vue项目

    Vue作为前端三大框架之一截至到目前在github上以收获44,873颗星,足以说明其以悄然成为主流.16年10月Vue发布了2.x版本,经过了一段时间的摸索和看官方的教程和api,才了解到2.0版本 ...

  3. Qt如何管理组件

    转载:清凉简装的博客 解决“要继续此操作,至少需要一个有效且已启用的储存库“问题 1.在Qt安装目录找到组件管理软件MaintenanceTool,双击. 2.点击下一步,出现要继续此操作,至少需要一 ...

  4. [PHP学习教程 - 心得]001.偷龙转凤技巧10则(Remember Tips)

    引言:PHP当中的一些猬锁技巧,比较基础,想起就发贴总结一下,老鸟换个姿势飘过去就是. [技巧]应该属于“方法”的一个范畴,主要指对一种生活或工作方法的熟练和灵活运用.[五笔]RFAG. 话不多说,下 ...

  5. [优文翻译]003.你应避免的移动开发APP的5个细节(5 Things to Avoid while Developing Your Next Mobile App)

    导读:本文是从<5 Things to Avoid while Developing Your Next Mobile App>这篇文章翻译而来 智能手机的普及带动了大批移动应用的诞生,这 ...

  6. super调用父类的属性方法

    super:可以用来修饰属性  方法   构造器 当子类与父类中有同名的属性时,可以通过   super.此属性  显式的调用父类声明的属性 若想调用子类的同名的属性“this.此属性” 2.当子类重 ...

  7. 抽象类(abstract class)与抽象方法

    package cm.aff.abst; /* abstract:抽象的,,可以修饰类,方法 1.修饰类: 抽象类: ①不能被实例化 ②有构造器的 ③凡是类都有构造器 ④抽象方法所修饰的类一定是抽象类 ...

  8. Java实现 LeetCode 715 Range 模块(选范围)

    715. Range 模块 Range 模块是跟踪数字范围的模块.你的任务是以一种有效的方式设计和实现以下接口. addRange(int left, int right) 添加半开区间 [left, ...

  9. Java实现 蓝桥杯 算法训练 Torry的困惑(基本型)

    算法训练 Torry的困惑(基本型) 时间限制:1.0s 内存限制:512.0MB 问题描述 Torry从小喜爱数学.一天,老师告诉他,像2.3.5.7--这样的数叫做质数.Torry突然想到一个问题 ...

  10. Java实现Fibonacci取余

    Description Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. Input 多 ...