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

第一章

1、预处理器——#include<iostream>将iostream文件内容添加到程序中。老式C头文件保留了扩展名.h,而C++头文件没有扩展名。

(有些C头文件被转换为C++头文件,去掉扩展名,并在前面加c,如cmath)

2、名称空间——相当于Java中的package,using编译指令相当于Java中的import。头文件没有.h前缀时,类、函数和变量是C++编译器的标准组件,被放置在名称空间std中。

3、类的本质——类是用户定义的一种数据类型。类定义描述的是数据格式及其用法,而对象则是根据数据格式规范创建的实体。

4、main()——main()的返回值(退出值)是返回给操作系统。通常退出值为0意味着程序运行成功。

第二章

5、OOP——面向对象编程的本质是设计并扩展自己的数据类型,让类型和数据匹配。

6、标识符——以一个下划线开头的名称被保留给实现,作全局标识符;以两个下划线或下划线加大写字母的名称被保留给实现(编译器及其使用的资源)使用。

(C++对名称长度没有限制)

7、整型——short至少16位;int至少和short一样;long至少32位,且至少和int一样长;long long至少64位,且至少和long一样长。

8、字节——字节通常指8位的内存单元,而C++中的字节依赖于实现。

9、运算符——运算符是内置的语言元素。sizeof运算符返回类型或变量的长度(字节)。所以,不同系统中sizeof( int )的返回值可能不同。

10、头文件climits——定义了各种表示类型限制的符号常量。如:#define INT_MAX 32767。(被设计为C可用的头文件,符号常量必须用#define编译指令定义)

11、变量初始化——

  函数内部定义的变量,应该在定义的时候进行初始化,否则它的值是不确定的,为被创建前相应的内存单元保存的值。

  (1)、int a = 1;  //  传统的C初始化

  (2)、int b(2);  //  C++的新方式

  (3)、int c = {3} 或 int c{3}  //  C++的大括号初始化器用于任何类型(大括号内不包含任何东西时,变量的初始化为0)

12、int——计算机处理起来效率最高的长度。除非使用后缀或值太大,C++通常将整形常量存储为int类型。

13、wcha_t——是整形类型,有足够的空间表示系统使用的最大扩展字符集。使用 iostream 中的 wcin 和 wcout 处理wcha_t流。

  可以通过前缀L来指示宽字符常量和宽字符串,如 wcha_t a = L'p';  wcout << L"tall" << endl;

  (C++11新增类型 char16_t 和 char32_t ,都是无符号的,分别长16位和32位,使用前缀 u 表示前者,前缀 U 表示后者)

14、bool——C++将0解释为 false ,将非零解释为 true 。

15、const——创建常量时最好马上赋值,如cont int a = 5;常量通常将首字母大写。

16、浮点——float至少32位;double至少48位,且不少于float;long double 至少和double一样多。这三种类型的指数范围至少是-37-37。

  (1)、cout.setf()可以控制输出格式,迫使cout使用定点表示法。因为cout通常会删除浮点后面的0,如3.3300000显示为3.33。

  (2)、浮点常量通常为double类型,通常用后缀f或F指定float类型,用后缀l或L指定long double类型。

17、强制类型转换——

  如:(long) thorn  或  long(thorn)

  强制类型转换不会修改thorn本身,而是创建一个新的、指定类型的值。

  也可以这样:  static_cast<long> (thorn)  ,它比传统的强制类型转换更为严格。

18、auto——自动推断类型,关键字auto可以不指定变量的类型,编译器自动把变量的类型设置成与初始值相同,如 auto a = 100;

  不过,auto一般是用于处理复杂类型

第四章

19、数组——

  (1)、声明数组的通用格式:  typeName arrayName[arraySize]  ,如 int a[5];

  (编译器不会检查使用的下标是否有效。)

  (2)、如果没有初始化函数中定义的数组,其元素的值为以前驻留在该内存中的值。(与函数中的变量一样)

  (3)、sizeof 作用与数组名时,得到的是整个数组中的字节数。作用于元素时,得到的是该元素的字节数。

  (4)、只有定义数组时才能初始化,之后就不行了。可以部分初始化,如:int a[5] = {1,2},部分初始化时,编译器把其他元素设置为0。

  可以这样:  int b[] = {1,2,3,4,5};  让编译器计算元素个数。

  (5)、使用列表初始化数组时,可以省略等号(=);大括号内不包含任何内容时,默认所有元素为0;列表初始化禁止缩窄转换。

20、字符串——

  字符串是存储在内存的连续字节中的一系列字符。

  (1)、C-风格的字符串以空字符结尾,其ASCII码为0,如:  char dog[7] = {'a','b','c','d','e','f','\0'};  注意,数组长度必须计算‘\0'  

  (2)、字符串常量,如:  char cat[] = "cat";

  (注意!'S'代表字符常量,而"S"表示‘S'和‘\0'两个字符组成的字符串,“S”实际表示的是字符串所在的内存地址)

  (3)、拼接字符串时,第一个字符串最后的‘\0'会被第二个字符串的第一个字符取代。

  (4)、strlen()函数返回存储在数组中的字符串的长度,只包括可见的字符,不包括空字符。  

  (5)、cin使用空白(空格、制表符和换行符)来确定字符串的结束位置,所以它读取数组输入时,只读取第一个单词,并自动添加空字符。

  (6)、面向行的输入有getline()和get(),它们都通过换行符来确定输入结尾,不同的是,get()并不再读取并丢弃换行符。

  cin.getline(name,ArSize),将读取ArSize-1个字符到name数组中。对于get(),可以这样使用:  cin.get(name,ArSize).get();

  (7)、读取空行时,get()将设置失效位;如果输入行包含的字符数比指定的多,getline()会设置失效位。后面的输入将被阻断。

  (8)、允许:char c[] = {"hello world!"};

  (9)、string类具有自动调整大小的功能,因此更为安全。

  (10)、strcpy(str1,str2)将str2复制给str1,  strcat(str1,str2)将str2附加到str1的结尾。

  (11)、str1.size()和strlen(str1)的功能相同。前者是string类的一个方法,后者是一个常规函数。

21、原始(raw)字符串——原始字符串中,\n不表示换行符,如:    默认定界符 ( 和 )  cout << R"(don't use "\n" ,OK?)" << '\n'; 输出:don't use "\n" ,OK?

  自定义定界符 +*( 和 )+*  cout << R"+*("(don't use "\n" ,OK?)")+*" << '\n'; 输出:"(don't use "\n" ,OK)"

22、结构——

  (1)、定义:  struct  man { char name[20];  double weight;  int age; };

  (2)、声明,允许省略关键字struct,如:  man mike;

  (3)、初始化:  man mike {"mike", 56.2, 22};

  (4)、使用成员运算符(.)来访问各个成员。

  (5)、同时定义结构和创建变量:  struct  man { char name[20];  double weight;  int age; } mike = {"mike", 56.2, 22}, jim ;

  (6)、还可以声明匿名结构:  struct { int x, int y } point ;

23、结构中的位字段——指定占用特定位数的结构成员,如:  struct my_bit { unsigned int x : 4;  bool  y : 1; };

24、外部声明——函数外部的声明。C++不提倡使用外部变量,提倡使用外部声明。

25、共用体——

  一种数据格式,能够存储不同的数据类型,但只能同时存储其中的一种类型,常用于节省内存。如:  union id { long long_id ;  char char_id; };

  (1)、由于共用体每次只能存储一个值,其长度为最大成员的长度。

  (2)、匿名共用体没有名称,其成员将成为位于相同地址处的变量,每次只有一个成员是当前成员。

26、枚举——

  另一种创建符号常量的方式,可以代替const。如:  enum spectrum { a , b , c , d , f };

  (1)、默认情况下,a、b、c、d 、f 作为符号常量,对应0到4。

  (2)、对于枚举,只定义了赋值运算符,并没有定义算术运算。

  (3)、只能将定义枚举时使用的枚举量赋给枚举变量。

  (4)、可以使用赋值运算符显式设置枚举量的值。如:  enum bits { first , zero = 0 , two = 200 ,three , four };  //这里three的值为201, first 的值为0

  (5)、枚举的取值范围。bits的最大值是202,大于它的最小的2的幂为256,所以bits的取值范围为0—255  

  (6)、通过强制类型转换,增加了可赋值给枚举变量的合法值,只要在取值范围内。如:  bits b = bits(240);

27、指针——

  指针是一个变量,存储的是值的地址,而不是值本身。

  (1)、地址运算符(&)可以获得变量的位置(存储地址)。

  (2)、指针,将地址看作指定的量,将值看作派生量。指针名表示地址。

  (3)、*运算符被称为间接值(解除引用)运算符。用于指针可以得到指针地址存储的值。

  (4)、声明:  int * a;  // *运算符两边的空格是可选的  int * b , c;  // 创建指针b和int变量c,每一个指针都需要一个*

  (5)、初始化:  int * a = &b;  // 将指针a的值设为&b

  (6)、一定要在对指针使用解除引用运算符(*)之前,将指针初始化为一个确定的、适当的地址。  

  (7)、将数字赋值给地址:  int * pt = (int * ) 0x8000000;

  (8)、分配内存:  int *pn = new int;  //从堆(heap)或只有存储区(free store)的内存区域分配内存。

28、数组——

  (1)、编译时给数组分配内存被称为静态联编,程序运行时选择数组长度被称为动态联编。

  (2)、创建动态数组:  int * p = new int [10]; // p为该元素第一个元素的地址

  (3)、释放数组:  delete [] p;  // 只能释放new分配的内存;  不能delete两次;  对空指针delete安全;  数组用delete [] 释放。

  (4)、不能使用sizeof运算符来确定动态分配的数组包含的字节数。

  (5)、使用数组:  p[0]为第一个元素,p[1]是第二个。  // C++内部使用指针来处理数组,p[1]被看作 *(p+1)

  (6)、p = p + 1;  // 指针变量加1后,增加的量为它指向的类型的字节数。

  (7)、多数情况下C++将数组名解释为数组第一个元素的地址。

  (8)、指针和数组名的区别:  可以修改指针的值,而数组名是常量;  对数组名使用sizeof得到数组的字节数,而对指针使用sizeof得到指针的长度。

  (9)、short tell[10];  cout << tell;  // 数组名本身为其第一个元素的地址,如:&tell[0] ,即一个2字节内存块的地址。

    cout << &tell;  // 输出的是一个20字节内存块的地址。

  (10)、给cout提供一个字符的地址,它将从该字符开始打印,直到遇到空字符为止。

  (11)、要打印一个指针的地址,必须把这个指针强转成另一种指针类型,如 (int *) p;

29、使用new创建动态结构——struct1 * s = new struct1;  // 此时,结构标识符是指针,所以不能使用成员运算符句点(.),

    // 只能使用箭头成员运算符(->)访问成员或者使用(*s).price 来访问成员。

30、自动存储、静态存储和动态存储——

  (1)、函数内部定义的常规变量为自动变量,存储在栈中,后进先出(LIFO),程序执行中,不断增大缩小。为自动存储。

  (2)、在函数外面定义,或声明变量使用static关键字的变量为静态变量。静态存储是整个程序执行期都存在的变量。

  (3)、使用new创建的变量为动态存储。new和delete管理类一个内存池,被称为free store 或 heap。

  (注意!栈中自动添加和删除机制使得占用的内存总是连续的,而new和delete可能导致只有存储区不连续)

31、模板类vector——类似string,也是一种动态数组,是使用new创建动态数组的替代品,自动使用new和delete管理内存。

    #include<vector>  using namespace std;  // 包含头文件,vector位于std名称空间中

    vector<int> ele(10);  // 创建一个名为ele的vector对象,可存储10个类型为int的元素。

  (注意,C++11中可用列表初始化。类型可以是变量)

32、模板类array——与数组一样,长度固定,使用栈存储,效率与数组相同,而更方便、安全。

    #include <array>   using namespace std;  array<int,5> arr;  // 名为 arr 的array对象,包含5个int元素。

  (注意,类型不能是变量!可用列表初始化)

(0)

相关推荐

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

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

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

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

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

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

  • 《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后返回副本

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

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

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

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

  • 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的赋值运算符有两种,分别

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

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

  • 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

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

    mysql简介 MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理. 计算次序: where 可以包含任意数目的and和or,允许两者结合以进行复杂和高级的过滤.但是SQL在操作or之前会优先的处理AND操作符.如果想优先的使用or的条件可以使用括号. in:为什么要使用in操作符?其优点具体如下. 1.在使用长的合法选项清单时,in操作符的语法更清楚直观 2.在使用IN时,计算的次序更容易管理

  • MYSQL必知必会读书笔记第二章之版本更改

    MySQL的当前版本为版本5,以下列出最近版本的主要更改: 4.---------InnoDB引擎,增加了事务处理.并.改进全文搜索等支持. 4.1--------对函数库.子查询.集成帮助等重要增加. 5.-------------增加了存储过程.触发器.游标.视图等 以上内容是小编给大家介绍MYSQL必知必会读书笔记的相关知识,希望对大家有所帮助!

  • MYSQL必知必会读书笔记第五章之排序检索数据

    MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理. 其实,检索出的数据并不是以纯随机顺序显示的.如果不排序,数据一般将以它底层表现中出现的顺序显示.这可以是数据最初添加到表中的顺序.但是,如果数据后来进行过更新或删除,则此顺序将会受到MySQL重用回收存储空间的影响.因此,如果不明确控制的话,不能依赖该排序顺序. 在多个列上将序排列 :如果想在多个列上进行将序排列,必须每个列指定DESC关键字

随机推荐