之前阅读时没有及时总结,现在慢慢补上。
第1章 快速入门
main 函数在很多方面都比较特别,其中最重要的是每个C++程序必须含有 main 函数,且 main 函数是(唯一)被操作系统显示调用的函数。
main 函数的返回值必须是 int 型。
endl 是一个特殊值,称为操纵符(manipulator),将它写入输出流时,具有输出换行的效果,并刷新与设备相关联的缓冲区(buffer)。通过刷新缓冲区,用户可立即看到写入到流中的输出。
C++中通过定义类来定义自己的数据结构。
标准库的头文件用尖括号< >括起来,非标准库的头文件(自定义头文件)用双引号" "括起来。
第2章 变量和基本类型
要获得无符号型则必须指定该类型为unsigned。
以0(零)开头的字面值整数常量表示八进制,以 0x 或 0X 开头的表示十六进制。
为了兼容C语言,C++所有的字符串字面值都由编译器自动在末尾添加一个空字符(' \0 ')。
在C++中理解“初始化不是赋值”是必要的:初始化指创建变量并给它赋初始值,而赋值则是擦除对象的当前值并用新值代替。
内置类型变量是否自动初始化取决于变量定义的位置。在函数体外定义的变量都初始化成0,在函数体里定义的内置类型变量不进行自动初始化。
变量的定义用于为变量分配存储空间,还可以为变量指定初始值。
声明用于向程序表明变量的类型和名字。定义也是声明:当定义变量时我们声明了它的类型和名字。可以通过使用 extern 关键字声明变量名而不定义它。
任何在多个文件中使用的变量都需要有与定义分离的声明。在这种情况下,一个文件含有变量的定义,使用该变量的其他文件则包含该变量的声明(而不是定义)。
与其他变量不同,除非特别说明,在全局作用域声明的 const 变量是定义该对象的文件的局部变量。此变量只存在于那个文件中,不能被其他文件访问。通过指定 const 变量为 extern ,就可以在整个程序中访问 const 对象。
引用只是对象的另一个名字。
const 引用是指向 const 对象的引用。例:
const int ival = 1024;
const int &refVal = ival ; //ok
int &ref2 = ival ; //error
枚举的定义包括关键字 enum ,其后是一个可选的枚举类型名,和一个用花括号括起来、用逗号分开的枚举成员列表。
enum open_modes { input, output, append };
默认地,第一个枚举成员赋值为0,后面的每个枚举成员赋的值比前面的大1。
用来初始化枚举成员的值必须是一个常量表达式。
不能改变枚举成员的值。枚举成员本身就是一个常量表达式。
如果使用 class 关键字来定义类,那么定义在第一个访问标号前的任何成员都隐式指定为private ;如果使用struct 关键字,那么这些成员都是public。
设计头文件时,应使其可以多次包含在同一源文件中,这一点很重要。我们必须保证多次包含同一头文件不会引起该头文件定义的类和对象被多次定义。使得头文件安全的通用做法,是使用预处理器定义头文件保护符。头文件保护符用于避免在已经见到头文件的情况下重新处理该头文件的内容。
为了避免名字冲突,预处理器变量经常用全大写字母表示。
#ifndef SALESITEM_H
#define SALESITEM_H
// Define````````
#endif
第3章 标准库类型
任何存储 string 的 size 操作结果的变量必须为
string::size_type 类型。特别重要的是,不要把 size 的返回值赋给一个 int 变量。
保存一个 string 对象 size 的最安全的方法就是使用标准库类型 string::size_type。
当进行 string 对象和字符串字面值混合连接操作时,+操作符的左右操作数必须至少有一个是 string 类型的:
string s1="hello";
string s2="world";
string s3=s1+","; //ok
string s4="hello"+", " //error
string s5=s1+", "+"world"; //ok
string s6="hello"+", "+s2; //error
vector 元素的位置从0开始。
必须是已存在的元素才能用下标操作符进行索引。通过下标操作进行赋值时,不会添加任何元素。
所谓的“缓冲区溢出”错误就是对不存在的元素进行下标操作的结果。
由于容器的 end 操作返回的迭代器不指向任何元素,因此不能对它进行解引用或自增操作。
容器定义了一种名为 const_iterator 的类型,该类型只能用于读取容器内元素,但不能改变其值。
任何改变 vector 长度的操作都会使已存在的迭代器失效。例如,在调用 push_back 之后,就不能再信赖指向 vector 的迭代器的值了。
两个迭代器相加的操作是未定义的。
第4章 数组和指针
区别:数组的长度是固定的,数组一经创建,就不允许添加新的元素。指针则可以像迭代器一样用于遍历和检查数组中的元素。
现代C++程序应尽量使用 vector 和迭代器类型,而避免使用低级的数组和指针。设计良好的程序只有在强调速度时才在类实现的内部使用数组和指针。
与 vector 类型相比,数组的显著缺陷在于:数组的长度是固定的,而且程序员无法知道一个给定数组的长度。数组没有获取其容量大小的 size 操作,也不提供 push_back 操作在其中自动添加元素。如果需要更改数组的长度,程序员只能创建一个更大的新数组,然后把原数组的所有元素复制到新数组空间中去。
非 const 变量以及要到运行阶段才知道其值的 const 变量都不能用于定义数组的维数。
与 vector 不同,一个数组不能用另外一个数组初始化,也不能将一个数组赋值给另一个数组。
C++提供了一种特殊的指针类型 void*,它可以保存任何类型对象的地址。
void* 指针只支持几种有限的操作:与另一个指针进行比较;向函数传递 void* 指针或从函数返回 void* 指针;给另一个 void* 指针赋值。不允许使用 void* 指针操纵它所指向的对象。
不能使用 void* 指针保存 const 对象的地址,而必须使用 const void* 类型的指针保存 const 对象的地址。
在使用下标访问数组时,实际上是对指向数组元素的指针做下标操作。只要指针指向数组元素,就可以对它进行下标操作。例:
int ia[]={0,2,4,6,8};
int *p=&ia[2];
int j=p[1]; //ok, j=ia[3]
int k=p[-2]; //ok, k=ia[0]
C++允许计算数组或对象的超出末端的地址,但不允许对此地址进行解引用操作。
指针和 const 限定符
1、指向 const 对象的指针
如果指针指向 const 对象,则不允许指针来改变其所指的 const 值。为了保证这个特性,C++语言强制要求指向 const 对象的指针也必须具有 const 特性:
const double *cptr ;
2、const 指针
除指向 const 对象的指针外,C++语言还提供 const 指针———本身的值不能修改:
int errNumb=0;
int *const curErr=&errNumb;
const 指针的值不能修改,这就意味着不能使 curErr 指向其他对象。
与任何 const 量一样,const 指针也必须在定义时初始化。
字符串字面值的类型就是 const char 类型的数组。
牢记字符串必须以结束符 null 结束:
char ca[]={'C','+','+'}; //not null-terminated
cout << strlen(ca) << endl; //disater: ca isn't null-terminated
动态数组的定义:
数组变量通过指定类型、数组名和维数来定义。而动态分配数组时,只需指定类型和数组长度,不必为数组对象命名,new 表达式返回指向新分配数组的第一个元素的指针:
int *pia = new int[10];
此 new 表达式分配了一个含有10个 int 型元素的数组,并返回指向该数组第一个元素的指针,此返回值初始化了指针 pia 。
new 表达式需要指定指针类型以及在方括号中给出的数组维数,该维数可以是任意的复杂表达式。创建数组后,new 将返回指向数组第一个元素的指针。在*存储区中创建的数组对象是没有名字的,程序员只能通过其地址间接访问堆中的对象。
第5章 表达式
第6章 语句
switch (ch)
{
case 'a': ++aCnt; // not have a break statement
case 'e': ++eCnt; // not have a break statement
case 'i': ++iCnt; // not have a break statement
case 'o': ++oCnt; // not have a break statement
case 'u': ++uCnt; // not have a break statement
}
对于上面的代码,假设 ch 的值是 ‘i’,程序从 case 'i' 后面的语句开始执行,iCnt 的值加1。但是,程序的执行并没有在这里停止,而是越过case 标号继续执行,同时将 oCnt 和 uCnt 的值都加了1。
第7章 函数
int gcd(int v1, int v2)
{
while (v2)
{
int temp=v2;
v2=v1%v2;
v1=temp;
}
return v1;
}
函数不能返回另一个函数或者内置数组类型,但可以返回指向函数的指针,或指向数组元素的指针的指针。
函数声明
void print(int *array, int size);
变量可以在头文件中声明,而在源文件中定义。同理,函数也应当在头文件中声明,并在源文件中定义。
局部对象
内联函数
重载函数
const int* p=&a;
int const* p=&a;
上面这两个功能相同,都是指针指向的内容不能被修改。
int* const p=&a;
指针p本身的值不能被修改。
第8章 标准IO库
IO类型在三个独立的头文件中定义:iostream 定义读写控制窗口的类型, fstream 定义读写已命名文件的类型,而 sstream 所定义的类型则用于读写存储在内存中的 string 对象。
C++中的文件名
string 对象中,则可调用 c_str 成员获取C风格字符串。
<C++Primer>第四版 阅读笔记 第一部分 “基本语言”的更多相关文章
-
C++ Primer 第四版阅读笔记
阅读笔记 初始化 变量定义指定了变量的类型和标识符,也可以为对象提供初始值.定义时指定了初始值的对象被称为是 已初始化的.C++ 支持两种初始化变量的形式:复制初始化和 直接初始化.复制初始化语法用等 ...
-
<;C++Primer>;第四版 阅读笔记 第四部分 “面向对象编程与泛型编程”
继承和动态绑定与数据抽象一起成为面向对象编程的基础. 模板使我们能够编写独立于具体类型的泛型类和泛型函数. 第15章 面向对象编程 面向对象编程基于三个基本概念:数据抽象.继承和动态绑定.在C++中, ...
-
<;C++Primer>;第四版 阅读笔记 第三部分 “类和数据抽象”
类定义了数据成员和函数成员:数据成员用于存储与该类类型的对象相关联的状态:而函数成员则负责执行赋予数据意义的操作. 第12章 类 一个类可以包含若干公有的.私有的和受保护的部分:在public部分定义 ...
-
<;C++Primer>;第四版 阅读笔记 第二部分 “容器和算法”
泛型算法中,所谓"泛型(generic)"指的是两个方面:这些算法可作用于各种不同的容器类型,而这些容器又可以容纳多种不同类型的元素. 第九章 顺序容器 顺序容器的元素排列次序与元 ...
-
think in java 第四版读书笔记 第一章对象导论
很久没有碰过java了,为了项目需要以及以后找工作,还是有必要将think in java通读一遍.欢迎大家一起讨论学习 1.1抽象过程 面向对象语言的5个特性: 1.万物皆对象 任何事物都可以抽象为 ...
-
C++Primer第5版学习笔记(四)
C++Primer第5版学习笔记(四) 第六章的重难点内容 你可以点击这里回顾第四/五章的内容 第六章是和函数有关的知识,函数就是命名了的代码块,可以处理不同的情况,本章内 ...
-
C++Primer第5版学习笔记(三)
C++Primer第5版学习笔记(三) 第四/五章的重难点内容 你可以点击这里回顾第三章内容 因为第五章的内容比较少,因此和第四章的笔记内容合并. 第四章是 ...
-
C++Primer第5版学习笔记(一)
C++Primer第5版学习笔记(一) 第一.二章的重难点内容 这个笔记本主要记录了我在学习C++Primer(第5版,中文版)的过程中遇到的重难点及其分析.因为第一.二章都比较简单,因 ...
-
C++Primer第5版学习笔记(二)
C++Primer第5版学习笔记(二) 第三章的重难点内容 这篇笔记记录了我在学习C++常用基本语法的学习过程,基本只记录一些重难点,对概念的描述不是一开始就详尽和准确的,而是层层深入 ...
随机推荐
-
js cookie存储方法
/*! * jQuery Cookie Plugin v1.4.0 * https://github.com/carhartl/jquery-cookie * * Copyright 2013 Kla ...
-
pojo类和vo类分别是什么
转:http://blog.sina.com.cn/s/blog_4adc4b090101kuks.html vo有两种说法,一个是viewObject,一个是valueObject.. 就拿前者来说 ...
-
android studio 添加到项目库中的项目
工程-对-new module-Android Library-module name和package name 它应该在同一个库被引入. 然后在该文件夹replace新的library 在gradl ...
-
windows 和linux 文件互传
1.sz + 文件 [拷贝到windows上] 2.rz + 文件 [拷贝到linux上]
-
通过action传过来的值在option获取进行验证
通过action传过来的值在option获取进行验证的方法: for(var i=0;i<document.getElementById("ufacilityType").o ...
-
A - ACM Rank Table
ACM contests, like the one you are participating in, are hosted by the special software. That softwa ...
-
MongoDB之update
Update操作只作用于集合中存在的文档.MongoDB提供了如下方法来更新集合中的文档: db.collection.update() db.collection.updateOne() New i ...
-
HDU 5727 - Necklace - [全排列+二分图匹配][Hopcroft-Karp算法模板]
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5727 Problem DescriptionSJX has 2*N magic gems. ...
-
(五)使用GitHub的前期准备
创建账户 创建账号成功后将得到一个个人的公开页面URL:https://github.com/xkfx. 设置头像 设置SSH Key SSH 为 Secure Shell 的缩写. from bai ...
-
C程序员必读的 3 本书
C程序员必读的 3 本书 原创: Martin 老师 公众号:零基础零障碍学习C语言 勿用质疑,今天来看这篇文章的朋友都是准备学好C语言的朋友,大家想学好C语言的迫切性,就好比Martin老师等着元 ...