《C++ primer plus》读书笔记(二)

第五章

1、for循环——for(initialization; test-expression; update-expression) body  // test-expression 会被转换为bool,0为false,非零为true

2、表达式——表达式是值或值与运算符的组合。赋值表达式的值为其左侧成员的值,而赋值运算符是从右到左结合的。

3、a++和++a——

  (1)对于内置类型,两种执行效率相同。

  (2)若重载运算符,对于类而言,前缀将值加1,返回结果;后缀会复制一个副本,加1后返回副本。所以前缀比后缀效率高。

4、逗号运算符——

  (1)for循环中,将多个表达式合并为一个:  i++, j++;

  (2)声明:  int i , j;

  (3)逗号表达式先计算第一个表达式,再计算第二个表达式。逗号表达式的值是第二部分的值。

  (4)逗号表达式是优先级最低的表达式。

5、strcmp()——比较两个字符串。接受2个字符串地址A、B作为参数。AB相同返回0,A的字母顺序在B之前,者返回负数,否则返回正数。

  (用引号括起的字符串常量是其地址。)

6、clock()——返回程序开始执行后所用的系统时间。这个值除以CLOCKS_PER_SEC可以得到秒数。

7、类型别名——#define AA char  // 用AA作为char的别名,所有的AA将被char替代

  或  typedef AA char

8、cin——cin.get()会忽略空格和换行符。发送给cin的输入会被缓冲。按下回车键,输入的内容才会被发送给程序。

  cin.get(ch)会得到每个字符。其参数声明为引用类型,所以函数可以修改其参数的值。

9、EOF——很多PC编程环境都将Ctrl+Z视为模拟的EOF,检测到EOF之后,cin将两位(eofbit和failbit)都设置为1。eof()和fail()用来查看是否被设置。

  所以循环等待输入的条件可以这样设置:while( cin.fail() == false ) {} 或 whle( !cin.fail() ){} 或 while(cin){} 或 while( cin.get(ch) ){}

  (通常,EOF被定义为-1)

第六章

10、运算符——!运算符的优先级高于所有的关系运算符和算术运算符。

    逻辑AND运算符的优先级高于逻辑OR运算符。

    C++确保程序从左到右计算逻辑表达式。

11、cctype——字符函数库。如isalpha(ch)判断字符是不是字母,是字母就返回非零,否则返回0。

12、文本IO——使用cin进行输入时,程序将输入看作一系列的字节,其中每个字节被解释为字符编码。

第七章

13、定义函数——

  (1)、无返回值:  void functionName(parameterList) {}

  (2)、有返回值:  typeName functionName(parameterList) {}

  (注意!返回值的类型不能是数组,可以是其他任何类型)

14、函数原型——

  (1)、函数原型能极大降低程序出错的几率、提高效率。

  (2)、函数原型不要求提供变量名,有类型列表就足够了。

  (3)、括号为空与括号中使用void是等效的,不指定参数列表应使用省略号——void haha(...);

15、函数和二维数组——指针的类型是指把指针声明语句中的指针名字去掉所剩下的部分

  对于:  int data[3][4] = {{1,2,3,4},{5,6,7,8},{4,3,2,1}};  int total = sum(data,3);  sum的原型是什么?

  (1)、原型是:  int sum ( int (*a) [4] , int size);

  所以 int(*)[4]即,将这个指针指向int[4]。所以data的类型指向由4个int组成的数组的指针

  所以 int *a[4] 的类型是int * [4],这个指针指向int,总共有4个,即它是4个指向int指针组成的数组。

  (2)、函数定义:  int sum (int a[][4] ,int size);

  a[ r ][ c ] = *( *( a + r ) + c); 

16、递归——每个递归调用都创建自己的一套变量。

  (注意!C++不允许main()调用自己。)

17、函数指针——

  (1)、函数地址:  函数的地址是存储其机器语言代码的内存的开始地址。如果think()是一个函数,那么think就是它的地址。

  (2)、声明指针函数:  函数:double pam(int);  指针函数为: double (*pf)(int) = pam;  // pf是一个指向函数的指针。

第八章

18、编译过程——编译过程的最终产品是可执行程序(由一组机器语言指令组成)。

  运行程序时,操作系统将这些指令载入到计算机内存中,因此每条指令都有特定的内存地址。计算机随后逐步执行这些指令。

19、函数调用——执行到函数调用指令时,程序将在函数调用后,立即存储该指令的内存地址,并将函数参数复制到堆栈,跳到标记函数起点的内存单元,

  执行函数代码(也许还需将返回值放入寄存器),然后跳回到地址被保存的指令处。

20、内联函数——编译器使用相应的函数代码代替函数调用。

  函数声明前加上关键字inline,函数定义前加上关键字inline。通常将省略原型,原型处直接定义。

21、引用变量——主要用途是作函数的参数,函数将使用原始数据,而不是其副本。

  (1)、创建:  int rats ;  int & a = rats;

  (2)、引用必须在声明时初始化,不能先声明再初始化。也不能通过赋值来设置引用。

  (3)、引用一旦与某个变量关联起来,就一直效忠。

  (4)、若引用参数是const,若实参类型正确却不是左值 或 类型不正确却可以转换成正确类型 时,将创建临时变量。

  (5)、返回引用时,应避免返回函数终止时不再存在的内存单元引用。

22、左值——

  (1)、可被引用的数据对象。如变量、数组元素、结构成员、引用和解除引用的指针等。

  (2)、非左值,包括字面常量和包含多项的表达式。

  (3)、常规变量属于可修改的左值,const变量属于不可修改的左值。

23、右值引用——可指向右值的引用,使用&&声明。如:  double & rref = std::sqrt ( 26.00 ) ;

24、默认参数——通过函数原型设置函数参数默认值。

  (1)、必须从右到左添加默认值。

  (2)、实参按照从左到右的顺序依次被赋值给形参,而不能跳过任何参数。

25、函数重载——参数列表(特征标)不同,而函数名相同的函数。

  (1)、类型引用和类型本身被视为同一个特征标。

  (2)、不能把const变量赋值给非const形参

26、名称修饰——根据函数原型中指定的形参类型对每个函数名进行加密,用来跟踪每一个重载函数。

27、函数模板——相当于Java中的泛型

  (1)、声明:  template <typename T> void Swap(T &a, T &b);  // typeName 可用 class 替换

  (2)、函数模板不能缩短可执行程序,最终的代码不包含任何模板,只包含了为程序生成的实际函数。

  (3)、一般将模板放在头文件中。

28、显式具体化——具体化的函数定义,匹配时,使用它而不是模板。

  (1)、非模板函数:  void swap( job &, job &);

  (2)、模板函数:  template <typeName T> void swap( T & ,T &);

  (3)、显式具体化:  template<> void swap<job>( job &, job &);  // swap<job>中job是可选的

  (4)、编译器在选择原型时:  非模板函数  >  显式具体化  >  模板函数

  (5)、显式实例化:  template void swap<int> ( int, int);  // template后无<>

  (6)、隐式实例化:  对于模板函数,编译器会通过对这个模板含数的引用生成一个含数的实例,这通常叫隐式实例化

29、decltype——decltype( expression ) var;  // 让var的类型与expression一样。

  (注意!若expression是一个函数调用,var的类型与其返回值相同。若expression是一个左值,var为指向其类型的引用)

30、后置返回类型——给函数指定返回类型。

  如:template<class T1, class T2>  auto gt( T1 x, T2 y) -> decltype( x + y ) {  ...  return x + y ;}

(0)

相关推荐

  • C++ Primer 第一部分基本语言

    第1章 快速入门 1,介绍main函数的意义和其基本结构,return语句.不同平台下编译与执行程序.2,两个类isrteam与otream与它们的实例对象cin,cout,cerr,clog.说明了程序中基本的输入与输出."<<"与">>"作为操作符,左操作符是一个iostream 对象,右操作符是一个变量.返回值仍为一个iostream对象,所以输入或输出可以这样 cout<<"a="<<a&l

  • C++Primer笔记之关联容器的使用详解

    关联容器 关联容器支持通过键来高效地查找和读取元素.两个基本的关联容器类型是map和set.map的元素以键-值对的形式组织:键用作元素在map的索引,而值则表示所存储和读取的数据.set仅包含一个键,并有效地支持关于某个键是否存在的查询.set和map类型的对象不允许为同一个键添加第二个元素.如果一个键必须对应多个实例,则需使用multimap或mutiset类型,这两种类型允许多个元素拥有相同的键. pair类型:在头文件utility中定义. pair的创建和使用: 复制代码 代码如下:

  • 《C++ primer plus》读书笔记(三)

     第九章 1.C++程序的组成-- (1).头文件: 包含结构声明和使用这些结构的原型. (2).源代码文件: 包含与结构有关的函数的代码. (3).源代码文件: 包含调用与结构有关的函数的代码. 2.头文件-- (1).常包含的内容: 函数原型:#define或const定义的符号常量:结构声明:类声明:模板声明:内联函数. (2).若文件名包含在尖括号中,编译器将在存储标准头文件的主机系统的文件系统中查找. (3).若文件名包含在双引号中,编译器首先查找当前的工作目录或源代码目录,再在标准位

  • C++Primer笔记之顺序容器的使用详解

    顺序容器,它将单一类型元素聚集起来成为容器,然后根据位置来存储和访问这些元素,这就是顺序容器.标准库里定义了三种类型:vector(支持快速随机访问).list(支持快速插入.删除).deque(双端队列)容器只定义了少量操作,大多数额外的操作由算法库提供.容器内元素的类型约束:1.元素类型必须支持赋值运算:2.元素类型的对象必须可以复制.这是容器元素类型的最低要求,如果想支持一些其他特殊要求,则必须具备相关的性质. 可以定义容器的容器vector< vector<int> > l

  • 《C++ primer plus》读书笔记(一)

    第一章 1.预处理器--#include<iostream>将iostream文件内容添加到程序中.老式C头文件保留了扩展名.h,而C++头文件没有扩展名. (有些C头文件被转换为C++头文件,去掉扩展名,并在前面加c,如cmath) 2.名称空间--相当于Java中的package,using编译指令相当于Java中的import.头文件没有.h前缀时,类.函数和变量是C++编译器的标准组件,被放置在名称空间std中. 3.类的本质--类是用户定义的一种数据类型.类定义描述的是数据格式及其用

  • 《C++ primer plus》读书笔记(二)

    第五章 1.for循环--for(initialization; test-expression; update-expression) body // test-expression 会被转换为bool,0为false,非零为true 2.表达式--表达式是值或值与运算符的组合.赋值表达式的值为其左侧成员的值,而赋值运算符是从右到左结合的. 3.a++和++a-- (1)对于内置类型,两种执行效率相同. (2)若重载运算符,对于类而言,前缀将值加1,返回结果:后缀会复制一个副本,加1后返回副本

  • PHP读书笔记整理_结构语句详解

    PHP结构语句顺序结构 顺序结构就像一条直线,按着顺序一直往下执行.我们编写的代码默认都是按照顺序结构执行的. 条件结构之if-else- 条件结构就像一个岔路口,可以向左走,也可以向右走.比如上洗手间,我们知道我们的性 别,这时候我们需要根据洗手间提供的条件,左边男洗手间,右边女洗手间,或者正好相反,其中性别就是这个条件结构的条件.再比如,现在的分数都流行使用 A.B.C来分级,假设考试成绩是93分,可以将其设置为等级A,考试成绩是87,可以将其设置为等级B,这里分数区间即为条件结构中的条件.

  • InnoDb 体系架构和特性详解 (Innodb存储引擎读书笔记总结)

    后台线程 •Master Thread 核心后台线程,主要负责将缓冲池的数据异步刷新到磁盘.例如脏页的刷新,插入缓冲的合并,undo 页的回收等. 每秒一次的操作: 1.日志缓冲刷新到磁盘,即使该事务还没有提交.该操作总是会发生,这个就是为了再大的事务,提交时间都很短. 2.当IO压力很小时(1s内发生的IO次数小于5% innodb_io_capacity)合并5% innodb_io_capacity 的插入缓冲. 3.当脏页比例大于 innodb_max_dirty_pages_cnt,

  • MongoDB快速入门笔记(二)之MongoDB的概念及简单操作

    MongoDB是面向集合的文档式数据库,不像关系数据库那样,有表,列.行,mongoDB数据库则是由一系列的文档组成.下面给大家介绍MongoDB的概念及简单操作. 1.以下列举普通的关系型数据库和MongoDB数据库简单概念上的区别: 2.MongoDB的简单操作 (1)启动MongoDB数据库之后,使用命令mongo,显示如下,默认连接到test数据库. MongoDB shell version: 3.2.6 connecting to: test 使用命令show dbs,可以查看所有的

  • MYSQL必知必会读书笔记第十和十一章之使用函数处理数据

     mysql简介 MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理. 拼接字段 存储在数据库表中的数据一般不是应用程序所需要的格式.我们需要直接从数据库中检索出转换.计算或格式化过的数据:而不是检索出数据,然后再在客户机应用程序或报告程序中重新格式化. 计算字段(字段 = 列,不过数据库列一般称为列,而字段通常用于计算字段中)并不实际存在于数据库表中,计算字段是运行时在select语句内创建的

  • javascript框架设计读书笔记之种子模块

    1.命名空间: js里面的命名空间就是使用对象的属性来扩展的.比如,用户定义一个A对象,A对象下面有B属性和C属性,同时B属性和C属性又是对象.因此A={B:{},C:{}},这时用户就可以在B对象和C对象中定义一样的方法,属性了.因此B和C就属于不同的命名空间.我们调用B,C对象里面的方法,就可以通过A.B.like(),A.C.like()调用了.当然A属于window对象中的属性. 但是有一种情况,比如:boke.jsp页面引入了jquery.js以及prototype.js(他们都会在w

  • PHP读书笔记_运算符详解

    什么是运算符 什么是运算符?运算符是告诉PHP做相关运算的标识符号.例如,你需要计算123乘以456等于多少,这时候就需要一个符号,告诉服务器,你需要做乘法运算. PHP中的运算符有哪些?PHP运算符一般分为算术运算符.赋值运算符.比较运算符.三元运算符.逻辑运算符.字符串连接运算符.错误控制运算符. PHP中的算术运算符 算术运算符主要是用于进行算术运算的,例如:加法运算.减法运算.乘法运算.除法运算.在PHP中的常用的算术运算符对应下表: PHP中的赋值运算符 PHP的赋值运算符有两种,分别

  • MYSQL必知必会读书笔记第六章之过滤数据

    mysql简介 MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理. where子句的位置,在同时使用ORDER BY 和WHERE子句时应该让ORDER BY 位于where之后,否则会产生错误. 1.不匹配检查 复制代码 代码如下: SELECT vend_id FROM products where vend_id <>1003 等同于 复制代码 代码如下: SELECT vend_id

  • MYSQL必知必会读书笔记第三章之显示数据库

    MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理. show column from tablename: 对每一个字段返回一行,行中包含字段名,数据类型.是否允许NULL.键信息.默认值以及其他信息. describe 语句: MySQL支持使用describ作为show columns from 的一种快捷方式.describ tablename 所支持的其他的show语句: show s

  • DB2 UDB V8.1管理学习笔记(二)

    正在看的db2教程是:DB2 UDB V8.1管理学习笔记(二).表空间类型分为SMS和DMS,分别是system management space, database management space. SMS使用方便,简单,无需手工创建和维护数据存储文件.DMS需要手动指定container和存储数据的文件名,并保证有足够磁盘空间可用.  对于一个数据库,至少存在一个page size为4K的系统临时表空间,可以额外建立具有更大page size的用户临时表空间,系统会自动进行使用. 无法用

随机推荐