C++ Primer Chap1-4 总结

Chap1:

cerr: 标准错误。

clog: 输出程序的一般性信息。

cout << “ ”: “<<”运算符返回左侧对象,cin >> 也返回左侧对象。

endl: 结束当前行,并将与设备关联的缓冲区中的内容刷到设备中。

批量注释:ctrl+K, ctrl+C; 批量取消注释:ctrl+K, ctrl+U。

for: 创建控制变量->检测->执行循环体->

++i->检测->执行循环体->

while(cin>>value): 遇文件结束符(ctrl+Z)或无效输入时停止。

文件重定向:允许我们将标准输入和标准输出与命名文件关联起来,P19。

成员函数:用.运算符来表达。左侧运算对象必须是一个类类型的对象,右侧运算对象必须是该类型的一个成员名,运算结果为右侧运算对象指定的成员。

Chap2:

(最小)尺寸:long long 64≥long 32(一般不用)≥int 16≥short 16; float 32(不如double); double 64;long double 96/128(一般不用)。

赋值时的类型转换:负数赋给unsigned:取模;超范围:未定义。

既有无符号又有int:int先转为无符号。

八进制:0开头;十六进制:0x开头。

字符串字面值中的空格,缩进和换行符是无意义的。

转义字符:输出既可以用’’,也可以用字符串““。

泛化的转义字符:\ooo代表八进制,\xoooo代表十六进制。

字面值后面可以加前后缀来指定是否带符号以及占用多少空间。

列表初始化特点:如果我们使用列表初始化且初始值存在丢失信息的奉献,则编译器报错。

默认初始化:定义于任何函数体之外的变量被初始化为0,定义在函数体内部的内置变量类型将不被初始化。

只声明不定义:extern。

复合类型:基于其他类型定义的类型。

声明符是跟在变量前的,不是跟在数据类型后的,且默认由右向左绑定。

定义引用要有初始值,引用不能绑字面值,不能定义引用的引用。

空指针:nullptr, 0, NULL(#include<cstdlib>)。

const默认只在文件内有效,多文件使用要分别extern const。

const对象的引用在定义时就要定义为const引用(const int &),但定义为const的引用可以绑定非const的对象,则此时不能通过此引用修改原对象,且原对象可以通过自己改变。

const对象的指针在定义时也要定义为const指针(const int *),但定义为const的指针可以绑定非const的对象,则此时不能通过此指针修改原对象,且原对象可以通过自己改变。

const指针:int *constcurErr=&errNumb。

顶层const:本身是常量;底层const:指针所指对象是常量。

执行拷贝操作时,顶层const不受影响,但底层const必须相同。

constexpr:如果认定变量是一个常量表达式,那就把它声明成constexpr类型。

constexpr指针只是顶层const,所以既可以指向常量对象也可以指向非常量。

auto对于引用:会忽略掉引用以及顶层const。

对于引用会返回顶层const和引用类型,除非使用的表达式不是一个变量,另一方面,若表达式是解引用操作则得到引用类型。

decltype((i))与decltype(i)前者一定返回引用类型。

Chap3:

getline(cin, s)与cin>>s区别。

s.size()的结果是string::size_type类型,下标运算符也是。

for(auto i:s)只能显示不能修改,若想修改s中的字符,则要用auto &i。

早期的向量套向量:vector<vector<int> >。

v2.push_back(i)。

如果循环体内部包含有向vector对象添加元素的语句,则不能使用范围for循环。

vector<int>::size_type。

不能使用下标形式向空vector添加元素。

特殊情况下如果容器为空,则begin和end返回的是同一个迭代器。

迭代器类型:vector<int>::iterator和vector<int>::const_iterator(常量指针,只能读数据不能写数据)。

difference_type:带符号整型,表示两迭代器间距。

不允许用数组=数组来赋值,也不允许用vector给数组赋值,但可以用数组初始化vector:vector<int> ivec(begin(int_arr),end(int_arr))。

数组下标:通常定义为size_t类型(cstddef头文件)。

auto ia2(数组),则ia2是指针,但decltype(数组)返回的是同大小的数组。

数组的begin和end不是成员函数,而是要把数组名作为参数。

ptrdiff_t:带符号整型,表示两指针间距。

*p+4:先解引用再+4。

C风格字符串:strlen(p),strcmp(p1,p2),strcat(p1,p2),strcpy(p1,p2)。

可以用C风格字符串代替string类型,反之不行(但可以用s.c_str()返回C风格字符串)。

int (&row)[4]=ia[1]:把row绑定到ia的第二个4元素数组上。

范围for来循环多维数组,为了避免数组被转成指针,要用auto &。

若ia是一个二位数组,auto p=ia(p是指向二维数组的指针),则*p是指向一维数组的指针,**p是一个整型,当然使用begin(*p)更简洁一点。

Chap4:

当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值得似乎和,用的是对象的身份(在内存中的位置)。

decltype(左值)得到引用,decltype(右值)得到的与右值类型相同。

递增运算符和解引用运算符的优先级相同并且都比算术运算符的优先级高。

*++iter:即*(++iter),iter先自增,返回增加后的数值,再解引用。

整形除法如果含小数直接舍去(保留正负号)。

带符号数的除法法则:先考虑商,再用被除数-(除数×商) 即得余数。

string在循环中要声明为引用,可以避免对元素的拷贝。

if(val==true):只有当val=1时才为真。

++i:首先将运算对象加1,然后将改变后的对象作为求值结果,后置版本也会将对象加1,但是求值结果是运算对象改变之前那个值的副本。

后置递增运算符的优先级高于解引用运算符。

解引用运算符优先级低于点运算符,所以执行解引用运算的子表达式两端必须加上括号。

条件运算符的优先级非常低,若使用条件表达式作为运算则要加上括号。

位运算的小整型要提升。

建议仅将运算符用于处理无符号类型。

移位运算符移出边界则舍去。

移位运算符的优先级低于算术运算符,高于关系运算符、赋值运算符和条件运算符。

sizeof运算符:sizeof *p= sizeof (*p)。

逗号运算符:从左向右运算,返回最后一个值。

算术转换:转换成最宽的。

整型提升:int、各种char、long,转换成式子里最宽的。

无符号和带符号的转换:依赖于机器 P142。

显式转换:int ival1=static_cast<int> ival2,其中ival2本身不是int;char *p=const_cast<char*> (pc), 其中pc原本带const,转换后p不是const,但p能不能再修改取决于指向的对象是不是const。

时间: 2024-10-10 22:03:24

C++ Primer Chap1-4 总结的相关文章

C++ Primer快速学习 第一章 入门

很多人说C++Primer不适合于入门,本系列入门文章向大家证明了:这是一个谎言. 第一章 入门 本章介绍 C++ 的大部分基本要素:内置类型.库类型.类类型.变量.表 达式.语句和函数. 1.1. 编写简单的 C++ 程序 每个 C++ 程序都包含一个或多个 函数 ,而且必须有一个命名为 main.函数 由执行函数功能的语句序列组成.操作系统通过调用 main 函数来执行程序, main 函数则执行组成自己的语句并返回一个值给操作系统. 下面是一个简单的 main 函数,它不执行任何功能,只是

C++ Primer Plus的若干收获--(八)

接下我会比较系统的介绍OOP的核心--类这个概念.可能会写的比较繁琐,比较多,但是自己理解总是好的.还记得上学期刚开始的时候老师讲的数据结构,一上来就来个LIst的一个大类,结果全班就傻了,完全不知所云(ps:博主是数学系,只学过C),然后自己就坐在图书馆借了两大本C++书开始啃了起来,大概啃了两个月才把C++学了个大概,尤其是读到类这块都是三四百行的常常的代码,看的那叫一个痛苦啊.不过自此之后就真正喜欢上这门语言了,再到之后能用C++写上个一两千行的代码,才发现之前的努力还是有收获的.好了,废

C++ Primer笔记8_动态内存_智能指针

1.动态内存 C++中,动态内存管理是通过一对运算符完成的:new和delete.C语言中通过malloc与free函数来实现先动态内存的分配与释放.C++中new与delete的实现其实会调用malloc与free. new分配: 分配变量空间: int *a = new int; // 不初始化 int *b = new int(10); //初始化为10 string *str = new string(10, ); 分配数组空间: int *arr = new int[10];//分配的

C++ Primer 学习笔记_98_特殊工具与技术 --优化内存分配

特殊工具与技术 --优化内存分配 引言: C++的内存分配是一种类型化操作:new为特定类型分配内存,并在新分配的内存中构造该类型的一个对象.new表达式自动运行合适的构造函数来初始化每个动态分配的类类型对象. new基于每个对象分配内存的事实可能会对某些类强加不可接受的运行时开销,这样的类可能需要使用用户级的类类型对象分配能够更快一些.这样的类使用的通用策略是,预先分配用于创建新对象的内存,需要时在预先分配的内存中构造每个新对象. 另外一些类希望按最小尺寸为自己的数据成员分配需要的内存.例如,

C++ Primer 学习笔记_73_面向对象编程 --再谈文本查询示例

面向对象编程 --再谈文本查询示例 引言: 扩展第10.6节的文本查询应用程序,使我们的系统可以支持更复杂的查询. 为了说明问题,将用下面的简单小说来运行查询: Alice Emma has long flowing red hair. Her Daddy says when the wind blows through her hair, it looks almost alive, like a fiery bird in flight. A beautiful fiery bird, he

C++ Primer 学习笔记_74_面向对象编程 --再谈文本查询示例[续/习题]

面向对象编程 --再谈文本查询示例[续/习题] //P522 习题15.41 //1 in TextQuery.h #ifndef TEXTQUERY_H_INCLUDED #define TEXTQUERY_H_INCLUDED #include <iostream> #include <fstream> #include <sstream> #include <vector> #include <set> #include <map&g

C++primer 15.7.3节练习

练习15.26 写的时候不小心写到了派生类Disc_quote,其实是一样的,主要明白原理即可 1 #include <iostream> 2 #include <string> 3 #include <utility> 4 #include <memory> 5 #include <vector> 6 7 using namespace std; 8 9 class Quote { 10 public: 11 Quote() : bookNo(

C++ Primer 第四版课后练习解答 习题1.1

注意:本随笔是在<C++Primer(第四版)习题解答(完整版)>中直接抄录的.此处主要是便于本人以后反复阅读. 习题1.1 查看所用的编译器文档,了解它所用的文件命名规范.编译并运行本节的main程序. [解答] 一般而言,C++编译器要求编译的程序保存在文件中.C++程序一般涉及两类文件:头文件和源文件.大多数系统中,文件的名字由文件名和文件后缀(又称扩展名)组成.文件后缀通常表明文件的类型,如头文件的后缀可以是.h或.hpp等:源文件和后缀可以是.cc或.cpp等,具体的后缀与使用的编译

C++Primer 5th 练习 12.19

这阵子真是太忙了, 连续做了四个课设. 当然这并不能作为好久没写博客的借口, 没写博客的主要原因只有一个: 懒. 最近又开始回顾C++的语法与特性(据说C++就是一门需要反复回顾的语言),以及学习C++的编程规范. 敲了C++Primer 5th 上的一道典型的练习题,纪念一下这即将过去的2016. 题目描述: 定义你自己版本的 StrBlobPtr, 更新 StrBlob类, 加入恰当的 friend 声明及begin 和 end 成员. 这道题目主要是练习 智能指针 share_ptr 和

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员)、拷贝构造函数

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员).拷贝构造函数  从概念上将,可以认为构造函数分为两个阶段执行: 1)初始化阶段: 2)普通的计算阶段.计算阶段由构造函数函数体中的所有语句组成. 一.构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 1.对象成员及其初始化 <span style="font-size:14px;">#include <iostream> using namespace std;