《C++ Primer中文版》(第四版)信息汇总(一)

最近决定把Lippman的大作《C++ Primer》重新温习一遍,在查阅的过程中记录下一些重要的知识点,希望对于自己有一定的帮助。为方便查询,全部内容按照章节分类。

第一章 快速入门
1、iostream库的基础是两种命名为istream何ostream的类型,分别表示输入流和输出流。

标准库定义了4个IO对象,处理输入时使用cin的istream类型对象。处理输出时使用命名为cout的ostream类型对象。处理标准错误的用来输出警告和错误信息给程序的cerr对象。用于产生程序执行的一般信息的clog对象。

2、读入未知数目的输入:利用while语句判断,直到遇到文件结束符(ctrl+z)
while(std::cin>>value)   
    sum+=value;  

 

第二章 变量和基本类型
1、复制初始化和直接初始化

view plaincopy to clipboardprint?
int ival(1024);//直接初始化   
int ival=1024;//复制初始化  

2、初始化不是赋值:初始化是指创建变量并给它赋初始值,而赋值则是擦除对象的当前值并用新值代替。

3、声明和定义:变量的定义用于为变量分配存储空间,还可以为变量指定初始值,在一个程序中,变量有且仅有一个定义;声明用于向程序表明变量的类型和名字,定义也是声明:当定义变量时我们声明了它的类型和名字。可以通过extern关键字声明变量名而不定义它。
extern int i;//声明但没有定义   
int i;//声明并且定义i  

4、常量在定义时必须初始化:因为常量在定义后就不能被修改,所以必须初始化。

const string hi="Hello";//True:初始化   
const int i;//Error:i is uninitialized const  

5、const引用:const引用时执行const对象的引用

const int ival=1024;   
const int &refival=ival;//OK:both reference and object are const   
int &refival2=ivale;//error:nonconst reference to a const object  

6、用class和struct关键字定义类的唯一差别在于默认访问级别:默认情况下struct的成员为public.而class成员为private.

第三章 标准库类型
除了基本的数据类型外,C++还定义了一个内容丰富的抽象数据类型标准库。其中最重要的标准库类型就是string和vector,他们分别定义了大小可变的字符串和集合。另外一种标准库类型bitset提供了一种抽象方法来操作位的集合。本章主要介绍标准库中的vector、string和bitset类型。

1、string类型对象的定义和初始化

#include<string>
using std::string;

string s1;
string s2(s1);
string s3("value");
string s4(n,'c');

2、为了与C语言兼容,字符串字面值与标准库string类型不是同一种类型,编程时一定要注意区分。 当进行string对象和字符串字面值混合连接操作时,+操作符的左右操作符必须至少有一个是string类型的。

string s1="hello";
string s2="world";
string s3=s1+","; //OK
string s4="hello"+",";//Error
string s5=s1+s2;//OK


3、#include<cctype.h>对string对象中单个字符进行处理。

4、标准库vector类型

#include<vector>
using std:vector;

vector<T> v1;
vector<T> v2(v1);
vector<T> v3(n,i);
vector<T> v4(n);

v.empty();//如果v为空,则返回true
v.size();//返回v中元素的个数
v.push_back(t);//在v的末尾增加一个值为t的元素

5、仅能对确知已存在的元素进行下标操作:

vector<int> ivec;
cout<<ivec[0];//Error:ivec has no elements

vector<int> ivec2(10);
cout<<ivec2[10];//Error:ivec has elements 0...9

6、除了使用下标来访问vector对象的元素外,标准库还提供了另一种访问元素的方法:使用迭代器,迭代器是一种检查容器内元素并遍历元素的数据类型。

vector<int>::iterator iter;

7、begin和end操作:

vector<int>::iterator iter=ivec.begin();//指向第一个元素
vector<int>::iterator iter=ivec.end();//由end操作返回的迭代器指向vector的"末端元素的下一个"

8、解引用操作符*与下标的区别

for(vector<int>::size_type ix=0;ix!=ivec.size();++ix)
    ivec[ix]=0;

for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();++iter)
    *iter=0;

9、每种容器类型还定义了一种名为const_iterator的类型,该类型只能用于读取容器内元素,但不能改变其值。使用const_iterator类型时,我们可以得到一个迭代器,它自身的值可以改变,但不能用来改变所指向的元素的值。

for(vector<string>::const_iterator iter=text.begin();iter!=text.end();++iter)
    cout<<*iter<<endl;//print each element in text

for(vector<string>::const_iterator iter=text.begin();iter!=text.end();++iter)
    *iter=" ";//Error:*iter is const

 

10、不要把const_iterator对象与const的iterator对象混淆起来,声明一个const迭代器时,必须初始化迭代器。一旦被初始化后,就不能改变它的值。

vector<int> nums(10);//nums is nonconst
const vector<int>::iterator cit=nums.begin();
*cit=1;//OK:cit can change its underlying element
++cit;//Error:can't change the value of cit

11、string对象和bitset对象之间是反向转化的:string对象的最右边字符用来初始化bitset对象的低阶位。当用string对象初始化bitset对象时,记住这一差别很重要。如果string对象的字符个数小于bitset类型的长度,则高阶位置为0.

string strval("1100");
bitset<32> bitvec(strval);//bitvec的位模式中第2和3的位置为1,其余位置为0

第四章 数组和指针
C++语言提供了两种类似于vector和迭代器类型的低级复合类型——数组和指针。现代C++程序应尽量使用vector和迭代器类型,而避免使用低级的数组和指针,设计良好的程序只有在强调速度时才在类实现的内部使用数组和指针。与vector类型相比,数组的显著缺陷在于:数组的长度是固定的,而且程序员无法知道一个给定数组的长度,数组没有获取其容量大小的size操作,也不提供push_back操作在其中自动添加元素。如果需要更改数组的长度,程序员只能创建一个更大的新数组,然后把原数组的所有元素复制到新数组空间中。

1、数组的定义和初始化:数组的维数必须用值大于等于1的常量表达式定义,此常量表达式只能包含整型字面值常量、枚举常量或者用常量表达式初始化的整型const对象。非const变量以及要到运行阶段才知道其值的const变量都不能用于定义数组的维数。

const unsigned buf_size=512,max_files=20;
int staff_size=27;
const unsigned sz=get_size();

char input_buffer[buf_size];//ok,const variable
string fileTable[max_files+1];//ok,constant expression
double salaries[staff_size];//error:non const variable
int test_scores[get_size()];//error:要到运行时调用函数才知道值,non const expression
int vals[sz];//error:size not konwn until run time

2、不允许数组直接复制和赋值:与vector不同,一个数组不能用另外一个数组初始化,也不能将一个数组赋值给另一个数组。

int ia[]={0,1,2};
int ia2[](ia);//error:不能用另外一个数组初始化

const unsigned array_size=3;
int ia3[array_size];//ok,but elements are uninitialized
ia3=ia;//error:不能将一个数组赋值给另外一个数组

3、数组的长度是固定的:与vector不同,数组不提供push_back或者其他的操作在数组中添加新元素,数组一经定义,就不允许再添加新的元素。

4、vector的遍历可使用下标或迭代器实现,同理,也可用下标或指针来遍历数组,指针式指向某种类型对象的符合数据类型,是用于数组的迭代器,指向数组中的一个元素,在指向数组元素的指针上使用解引用操作符*和自增操作符++,与在迭代器上的用法类似。

string s("helloworld");
string *sp=&s;//定义了一个指向string类型的指针sp

5、理解指针声明语句时,请从右向左阅读

string *pstring;//把pstring定义为一个指向string类型对象的指针变量

double dp,*dp2;//该语句定义了一个double类型的dp对象以及一个指向double类型对象的指针dp2

string* ps;//把ps定义为一个指向string类型对象的指针

string* ps1,ps2;//ps1定义为指针,ps2并非指针,只是一个普通的string对象而已

string* ps1,*ps2;//定义两个指针

6、指针初始化和赋值操作的约束,对指针进行初始化或赋值只能使用以下四种类型的值:(1) 0值常量表达式(2) 类型匹配的对象的地址(3) 另一对象之后的下一地址(4) 同类型的另一个有效指针。把int型变量赋给指针是非法的。

int ival;
int zero=0;
const int c_ival=0;
int *pi=ival;//error:pi initialized from int value of ival
pi=zero;//errro:pi assigned int value of zero
pi=c_ival;//ok:c_ival is a const with compile time value of 0
pi=0;//ok:directly initialize to literal constant 0

7、void*指针:它可以保存任何类型对象的地址:void*表明该指针与一地址值相关,但不清楚存储在此地址上的对象的类型,void*指针只支持几种有限的操作:与另一个指针进行比较;向函数传递void*指针或从函数返回void*指针;给另一个void*指针赋值。不允许使用void*指针操作它所指向的对象。

double obj=3.14;
double *pd=&obj;
void *pv=&obj;
pv=pd;

8、指针提供间接操作其所指对象的功能,与对迭代器进行解引用操作一样,对指针进行解引用可访问它所指的对象。

string s("hello world");
string *sp=&s; //sp holds the address of s
cout<<*sp;   //print hello world

9、指针和引用的比较,虽然使用引用和指针都可间接的访问另一个值,但它们之间有两个重要的区别:

第一个区别在于引用总是指向某个对象,定义引用时没有初始化是错误的;第二个去背则是赋值行为的区别,给引用赋值修改的是该引用所关联的对象的值,而并不是引用与另一个对象关联。引用一经初始化,就始终指向同一个特定对象。

//赋值结束后,pi所指向的ival对象值保持不变
int ival=1024,ival2=2048;
int *pi=&ival,*pi2=&ival2;
pi=pi2;//pi now points to ival2

//这个赋值操作修改了ri引用的值ival对象,而并非引用本身
int &ri=ival,&ri2=ival2;
ri=ri2; //assigns ival2 to ival


10、指向指针的指针:C++使用**操作符指派一个指针指向另一个指针,为了真正访问到ival对象,必须对ppi进行两次解引用。

int ival=1024;
int *pi=&ival;//pi points to an int 
int **ppi=π//指向指针的指针

cout<<**ppi<<endl;//两次解引用取得ival的值

11、指针和const限定符

(1) 指向const对象的指针:如下的cptr是一个指向double类型const对象的指针,const限定了cptr指针所指向的对象类型,而并非cptr本身。也就是说cptr本身并不是const,如果需要的话,允许给cptr重新赋值,使其指向另一个const对象,但不能通过cptr修改其所指对象的值。同时把const对象的地址赋给一个普通的、非const对象的指针也会导致编译时的错误,不能使用void*指针保存const对象的地址

const double *cptr;//cptr may point to a double that is const

const double pi=3.1415;
double *ptr=&pi;//error:ptr is a plain point
const double *cptr=&pi;//ok
*cptr=42;//error:*cptr might be const

const int universe=42;
const void* cpv=&universe;//ok:cpv is const
void *pv=&universe;//error:不能使用void*指针保存const对象的地址

double dval=3.14;
cptr=&dval;//允许把非const对象的地址赋给指向const对象的指针

(2) const指针:本身的值不能修改,如下curErr是指向int型对象的const指针,const指针的值不能修改,这就意味着不能使curErr指向其他对象,任何企图给const指针赋值的行为,都会导致编译时的错误

int errNumb=0;
int *const curErr=&errNumb;//curErr为const指针

curErr=curErr;//异常:不能修改const指针的值

(3) 指向const对象的const指针:既不能修改pi_ptr所指向对象的值,也不允许修改该指针的指向。

const double pi=3.1415926;
const double *const pi_ptr=pi;//

12、指针和typedef,如下面代码所示,cstr变量是什么类型?

typedef string *pstring;
const pstring cstr;

一般说来cstr是const pstring类型的指针,那const pstring指针所表示的真实类型是什么?注意不是指向string类型的const对象(不能简单的把typedef当做文本扩展),而是指向string类型对象的const指针,因为const修饰的是pstring的类型。

13、C风格字符串:以空字符null结束的字符数组

char cal1[]={'C','+','+'};//不是C风格字符串
char cal2[]={'C','+','+','/0'};//C风格字符串
char cal3[]="C++";//自动添加null,为C风格字符串

14、C风格字符串的标准库函数,必须包含相应的C头文件#include<cstring>

strlen(s);//返回s的长度,不包括字符串结束符null
strcmp(s1,s2);//比较两个字符串s1和s2是否相同。
strcat(s1,s2);//将字符串s2连接到s1后,并返回s1
strcpy(s1,s2);//将s2复制给s1,并返回s1
strncat(s1,s2,n);//将s2的前n个字符连接到s1后面,并返回s1
strncpy(s1,s2,n);//将s2的前n个字符复制给s1,并返回s1

15、动态定义数组以及初始化数组:可以使用跟在数组长度后面的一对空圆括号对数组元素做值初始化。

int *pia=new int[10];//分配了一个含有10个int型元素的数组
int *pia2=new int[10]();//把数组元素都设置为0

const int *pci_bad=new const int[100];//Error:uninitialized const array
const int *pci_ok=new const int[100]();//OK:value-initialized const array

16、C语言使用一对标准库函数malloc和free在自由存储区分配存储空间,而C++语言则使用new和delete表达式实现相同的功能。注意动态空间的释放,在关键字delete和指针之间的空方括号对必不可少。它告诉编译器该指针指向的是自由存储区中的数组,而并非单个对象。

delete [] pia;//该语句回收了pia所指的数组

17、string类提供了一个名为c_str的成员函数,用于返回C风格字符串,即返回指向字符数组首地址的指针,该数组存放了与string对象相同的内容,并且以结束符null结束。

string str("Hello World");
char *str1=str;//Error
char *str2=str.c_str();//OK

第五章 表达式
本章重点介绍C++语言定义的操作符,他们使用内置类型的操作数。

1、sizeof操作符:返回一个对象或类型名的长度,返回的类型为size_t,长度的单位是字节,具有以下三种语法形式:

sizeof(type name);
sizeof(expr);
sizeof expr;

2、强制转换:dynamic_cast(支持运行时识别指针或引用所指向的对象)、const_cast(将转换掉表达式的const性质)、static_cast(编译器隐式进行的任何数据类型都可以由它显式完成)、reinterpret_cast(通常为操作数的位模式提供较低层次的重新解释)

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/rocket5725/archive/2009/09/17/4563837.aspx

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【原书名】 C++ Primer (4th Edition) 【原出版社】 Addison Wesley/Pearson 【作者】 (美)Stanley B.Lippman,Josée LaJoie,Barbara E.Moo 【译者】 李师贤 蒋爱军 梅晓勇 林瑛 【丛书名】 图灵计算机科学丛书 【出版社】 人民邮电出版社 【书号】 7-115-14554-7 【开本】 16开 【页码】 900 【出版日期】 2006-3-1 【版次】 4-1 【内容简介】 本书是久负盛名的C++经典教程,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数程序员学会了C++。本版对前一版进行了彻底的修订,内容经过了重新组织,更加入了C++ 先驱Barbara E. Moo在C++教学方面的真知灼见。既显著改善了可读性,又充分体现了C++语言的最新进展和当前的业界最佳实践。书中不但新增大量教学辅助内容,用于强调重要的知识点,提醒常见的错误,推荐优秀的编程实践,给出使用提示,还包含大量来自实战的示例和习题。对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使本书成为C++初学者的最佳指南;对于中高级程序员,本书也是不可或缺的参考书。本书的前言阐述了 第4版和前一版的不同之处。 【目录信息】 第1章 快速入门 1 1.1 编写简单的C++程序 2 1.2 初窥输入/输出 5 1.2.1 标准输入与输出对象 5 1.2.2 一个使用IO库的程序 5 1.3 关于注释 8 1.4 控制结构 10 1.4.1 while语句 10 1.4.2 for语句 12 1.4.3 if语句 14 1.4.4 读入未知数目的输入 15 1.5 类的简介 17 1.5.1 Sales_item类 17 1.5.2 初窥成员函数 19 1.6 C++程序 21 小结 22 术语 22 第一部分 基本语言 第2章 变量和基本类型 29 2.1 基本内置类型 30 2.1.1 整型 30 2.1.2 浮点型 32 2.2 字面值常量 34 2.3 变量 38 2.3.1 什么是变量 39 2.3.2 变量名 40 2.3.3 定义对象 42 2.3.4 变量初始化规则 44 2.3.5 声明和定义 45 2.3.6 名字的作用域 46 2.3.7 在变量使用处定义变量 48 2.4 const限定符 49 2.5 引用 50 2.6 typedef名字 53 2.7 枚举 53 2.8 类类型 54 2.9 编写自己的头文件 57 2.9.1 设计自己的头文件 58 2.9.2 预处理器的简单介绍 60 小结 62 术语 62 第3章 标准库类型 67 3.1 命名空间的using声明 68 3.2 标准库string类型 70 3.2.1 string对象的定义和初始化 70 3.2.2 String对象的读写 71 3.2.3 string对象的操作 72 3.2.4 string对象中字符的处理 76 3.3 标准库vector类型 78 3.3.1 vector对象的定义和初始化 79 3.3.2 vector对象的操作 81 3.4 迭代器简介 83 3.5 标准库bitset类型 88 3.5.1 bitset对象的定义和初始化 88 3.5.2 bitset对象上的操作 90 小结 92 术语 92 第4章 数组和指针 95 4.1 数组 96 4.1.1 数组的定义和初始化 96 4.1.2 数组操作 99 4.2 指针的引入 100 4.2.1 什么是指针 100 4.2.2 指针的定义和初始化 101 4.2.3 指针操作 104 4.2.4 使用指针访问数组元素 106 4.2.5 指针和const限定符 110 4.3 C风格字符串 113 4.3.1 创建动态数组 117 4.3.2 新旧代码的兼容 120 4.4 多维数组 122 小结 124 术语 125 第5章 表达式 127 5.1 算术操作符 129 5.2 关系操作符和逻辑操作符 131 5.3 位操作符 134 5.3.1 bitset对象或整型值的使用 135 5.3.2 将移位操作符用于IO 137 5.4 赋值操作符 137 5.4.1 赋值操作的右结合性 138 5.4.2 赋值操作具有低优先级 138 5.4.3 复合赋值操作符 139 5.5 自增和自减操作符 140 5.6 箭头操作符 142 5.7 条件操作符 143 5.8 sizeof操作符 144 5.9 逗号操作符 145 5.10 复合表达式的求值 145 5.10.1 优先级 145 5.10.2 结合性 146 5.10.3 求值顺序 148 5.11 new和delete表达式 150 5.12 类型转换 154 5.12.1 何时发生隐式类型转换 154 5.12.2 算术转换 155 5.12.3 其他隐式转换 156 5.12.4 显式转换 158 5.12.5 何时需要强制类型转换 158 5.12.6 命名的强制类型转换 158 5.12.7 旧式强制类型转换 160 小结 161 术语 162 第6章 语句 165 6.1 简单语句 166 6.2 声明语句 167 6.3 复合语句(块) 167 6.4 语句作用域 168 6.5 if语句 169 6.6 switch语句 172 6.6.1 使用switch 173 6.6.2 switch中的控制流 173 6.6.3 default标号 175 6.6.4 switch表达式与case标号 176 6.6.5 switch内部的变量定义 176 6.7 while语句 177 6.8 for循环语句 179 6.8.1 省略for语句头的某些部分 180 6.8.2 for语句头中的多个定义 181 6.9 do while语句 182 6.10 break语句 183 6.11 continue语句 184 6.12 goto语句 185 6.13 try块和异常处理 186 6.13.1 throw表达式 186 6.13.2 try块 187 6.13.3 标准异常 189 6.14 使用预处理器进行调试 190 小结 192 术语 192 第7章 函数 195 7.1 函数的定义 196 7.1.1 函数返回类型 197 7.1.2 函数形参表 198 7.2 参数传递 199 7.2.1 非引用形参 199 7.2.2 引用形参 201 7.2.3 vector和其他容器类型的形参 206 7.2.4 数组形参 206 7.2.5 传递给函数的数组的处理 209 7.2.6 main:处理命令行选项 210 7.2.7 含有可变形参的函数 211 7.3 return语句 211 7.3.1 没有返回值的函数 212 7.3.2 具有返回值的函数 212 7.3.3 递归 216 7.4 函数声明 217 7.5 局部对象 220 7.5.1 自动对象 220 7.5.2 静态局部对象 220 7.6 内联函数 221 7.7 类的成员函数 222 7.7.1 定义成员函数的函数体 223 7.7.2 在类外定义成员函数 225 7.7.3 编写Sales_item类的构造 函数 225 7.7.4 类代码文件的组织 227 7.8 重载函数 228 7.8.1 重载与作用域 230 7.8.2 函数匹配与实参转换 231 7.8.3 重载确定的三个步骤 232 7.8.4 实参类型转换 234 7.9 指向函数的指针 237 小结 239 术语 240 第8章 标准IO库 243 8.1 面向对象的标准库 244 8.2 条件状态 247 8.3 输出缓冲区的管理 249 8.4 文件的输入和输出 251 8.4.1 文件流对象的使用 251 8.4.2 文件模式 254 8.4.3 一个打开并检查输入文件的 程序 256 8.5 字符串流 257 小结 259 术语 259 第二部分 容器和算法 第9章 顺序容器 263 9.1 顺序容器的定义 264 9.1.1 容器元素的初始化 265 9.1.2 容器内元素的类型约束 267 9.2 迭代器和迭代器范围 268 9.2.1 迭代器范围 270 9.2.2 使迭代器失效的容器操作 271 9.3 顺序容器的操作 272 9.3.1 容器定义的类型别名 272 9.3.2 begin和end成员 273 9.3.3 在顺序容器中添加元素 273 9.3.4 关系操作符 277 9.3.5 容器大小的操作 278 9.3.6 访问元素 279 9.3.7 删除元素 280 9.3.8 赋值与swap 282 9.4 vector容器的自增长 284 9.5 容器的选用 287 9.6 再谈string类型 289 9.6.1 构造string对象的其他方法 290 9.6.2 修改string对象的其他方法 292 9.6.3 只适用于string类型的操作 293 9.6.4 string类型的查找操作 295 9.6.5 string对象的比较 298 9.7 容器适配器 300 9.7.1 栈适配器 301 9.7.2 队列和优先级队列 302 小结 303 术语 303 第10章 关联容器 305 10.1 引言:pair类型 306 10.2 关联容器 308 10.3 map类型 309 10.3.1 map对象的定义 309 10.3.2 map定义的类型 310 10.3.3 给map添加元素 311 10.3.4 使用下标访问map对象 311 10.3.5 map::insert的使用 313 10.3.6 查找并读取map中的元素 315 10.3.7 从map对象中删除元素 316 10.3.8 map对象的迭代遍历 316 10.3.9 “单词转换”map对象 317 10.4 set类型 319 10.4.1 set容器的定义和使用 319 10.4.2 创建“单词排除”集 321 10.5 multimap和multiset类型 322 10.5.1 元素的添加和删除 322 10.5.2 在multimap和multiset 中查找元素 323 10.6 容器的综合应用:文本查询程序 325 10.6.1 查询程序的设计 326 10.6.2 TextQuery类 327 10.6.3 TextQuery类的使用 328 10.6.4 编写成员函数 330 小结 332 术语 332 第11章 泛型算法 335 11.1 概述 336 11.2 初窥算法 339 11.2.1 只读算法 339 11.2.2 写容器元素的算法 341 11.2.3 对容器元素重新排序的算法 343 11.3 再谈迭代器 347 11.3.1 插入迭代器 348 11.3.2 iostream迭代器 349 11.3.3 反向迭代器 353 11.3.4 const迭代器 355 11.3.5 五种迭代器 356 11.4 泛型算法的结构 358 11.4.1 算法的形参模式 359 11.4.2 算法的命名规范 359 11.5 容器特有的算法 361 小结 362 术语 363 第三部分 类和数据抽象 第12章 类 367 12.1 类的定义和声明 368 12.1.1 类定义:扼要重述 368 12.1.2 数据抽象和封装 369 12.1.3 关于类定义的更多内容 372 12.1.4 类声明与类定义 374 12.1.5 类对象 375 12.2 隐含的this指针 376 12.3 类作用域 380 类作用域中的名字查找 382 12.4 构造函数 385 12.4.1 构造函数初始化式 387 12.4.2 默认实参与构造函数 391 12.4.3 默认构造函数 392 12.4.4 隐式类类型转换 393 12.4.5 类成员的显式初始化 396 12.5 友元 396 12.6 static类成员 398 12.6.1 static成员函数 400 12.6.2 static数据成员 400 小结 403 术语 403 第13章 复制控制 405 13.1 复制构造函数 406 13.1.1 合成的复制构造函数 409 13.1.2 定义自己的复制构造函数 409 13.1.3 禁止复制 410 13.2 赋值操作符 411 13.3 析构函数 412 13.4 消息处理示例 415 13.5 管理指针成员 419 13.5.1 定义智能指针类 421 13.5.2 定义值型类 425 小结 427 术语 427 第14章 重载操作符与转换 429 14.1 重载操作符的定义 430 14.2 输入和输出操作符 435 14.2.1 输出操作符<>的重载 437 14.3 算术操作符和关系操作符 439 14.3.1 相等操作符 440 14.3.2 关系操作符 441 14.4 赋值操作符 441 14.5 下标操作符 442 14.6 成员访问操作符 443 14.7 自增操作符和自减操作符 446 14.8 调用操作符和函数对象 449 14.8.1 将函数对象用于标准库算法 450 14.8.2 标准库定义的函数对象 451 14.8.3 函数对象的函数适配器 453 14.9 转换与类类型 454 14.9.1 转换为什么有用 454 14.9.2 转换操作符 455 14.9.3 实参匹配和转换 458 14.9.4 重载确定和类的实参 461 14.9.5 重载、转换和操作符 464 小结 466 术语 467 第四部分 面向对象编程与泛型编程 第15章 面向对象编程 471 15.1 面向对象编程:概述 472 15.2 定义基类和派生类 473 15.2.1 定义基类 474 15.2.2 protected成员 475 15.2.3 派生类 476 15.2.4 virtual与其他成员函数 479 15.2.5 公用、私有和受保护的继承 482 15.2.6 友元关系与继承 486 15.2.7 继承与静态成员 486 15.3 转换与继承 487 15.3.1 派生类到基类的转换 487 15.3.2 基类到派生类的转换 489 15.4 构造函数和复制控制 490 15.4.1 基类构造函数和复制控制 490 15.4.2 派生类构造函数 490 15.4.3 复制控制和继承 494 15.4.4 虚析构函数 495 15.4.5 构造函数和析构函数中的虚函数 497 15.5 继承情况下的类作用域 497 15.5.1 名字查找在编译时发生 498 15.5.2 名字冲突与继承 498 15.5.3 作用域与成员函数 499 15.5.4 虚函数与作用域 500 15.6 纯虚函数 502 15.7 容器与继承 503 15.8 句柄类与继承 504 15.8.1 指针型句柄 505 15.8.2 复制未知类型 507 15.8.3 句柄的使用 508 15.9 再谈文本查询示例 511 15.9.1 面向对象的解决方案 513 15.9.2 值型句柄 514 15.9.3 Query_base类 515 15.9.4 Query句柄类 516 15.9.5 派生类 518 15.9.6 eval函数 520 小结 522 术语 523 第16章 模板与泛型编程 525 16.1 模板定义 526 16.1.1 定义函数模板 526 16.1.2 定义类模板 528 16.1.3 模板形参 529 16.1.4 模板类型形参 531 16.1.5 非类型模板形参 533 16.1.6 编写泛型程序 534 16.2 实例化 535 16.2.1 模板实参推断 537 16.2.2 函数模板的显式实参 540 16.3 模板编译模型 542 16.4 类模板成员 545 16.4.1 类模板成员函数 548 16.4.2 非类型形参的模板实参 551 16.4.3 类模板中的友元声明 552 16.4.4 Queue和QueueItem的友元 声明 554 16.4.5 成员模板 556 16.4.6 完整的Queue类 558 16.4.7 类模板的static成员 559 16.5 一个泛型句柄类 560 16.5.1 定义句柄类 561 16.5.2 使用句柄 562 16.6 模板特化 564 16.6.1 函数模板的特化 565 16.6.2 类模板的特化 567 16.6.3 特化成员而不特化类 569 16.6.4 类模板的部分特化 570 16.7 重载与函数模板 570 小结 573 术语 574 第五部分 高级主题 第17章 用于大型程序的工具 579 17.1 异常处理 580 17.1.1 抛出类类型的异常 581 17.1.2 栈展开 582 17.1.3 捕获异常 583 17.1.4 重新抛出 585 17.1.5 捕获所有异常的处理代码 586 17.1.6 函数测试块与构造函数 586 17.1.7 异常类层次 587 17.1.8 自动资源释放 589 17.1.9 auto_ptr类 591 17.1.10 异常说明 595 17.1.11 函数指针的异常说明 598 17.2 命名空间 599 17.2.1 命名空间的定义 599 17.2.2 嵌套命名空间 603 17.2.3 未命名的命名空间 604 17.2.4 命名空间成员的使用 606 17.2.5 类、命名空间和作用域 609 17.2.6 重载与命名空间 612 17.2.7 命名空间与模板 614 17.3 多重继承与虚继承 614 17.3.1 多重继承 615 17.3.2 转换与多个基类 617 17.3.3 多重继承派生类的复制控制 619 17.3.4 多重继承下的类作用域 620 17.3.5 虚继承 622 17.3.6 虚基类的声明 624 17.3.7 特殊的初始化语义 625 小结 628 术语 628 第18章 特殊工具与技术 631 18.1 优化内存分配 632 18.1.1 C++中的内存分配 632 18.1.2 allocator类 633 18.1.3 operator new函数和 operator delete函数 636 18.1.4 定位new表达式 638 18.1.5 显式析构函数的调用 639 18.1.6 类特定的new和delete 639 18.1.7 一个内存分配器基类 641 18.2 运行时类型识别 646 18.2.1 dynamic_cast操作符 647 18.2.2 typeid操作符 649 18.2.3 RTTI的使用 650 18.2.4 type_info类 652 18.3 类成员的指针 653 18.3.1 声明成员指针 653 18.3.2 使用类成员的指针 655 18.4 嵌套类 658 18.4.1 嵌套类的实现 658 18.4.2 嵌套类作用域中的名字查找 661 18.5 联合:节省空间的类 662 18.6 局部类 665 18.7 固有的不可移植的特征 666 18.7.1 位域 666 18.7.2 volatile限定符 668 18.7.3 链接指示:extern "C" 669 小结 672 术语 673 附录 标准库 675 索引 703

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值