C++ Primer学习笔记
本专栏记录了我从大四第一学期开始看《C++ Primer》所写下的笔记,其中记录的是我容易忘记的和C++中的一些重点知识。为我今后使用C++提供了参考和源代码。
临江仙
刻苦学习,努力钻研,喜欢学习新知识。待人友善,团结合作。
展开
-
C++管理类的指针成员
C++类的指针成员与其他成员有所不同,指针成员指向一个内存地址,该地址的内存需要我没管理。我现在分析一下为什么要管理指针成员。有如下Student类,Student.h如下:class Student {public: Student(int *books); virtual ~Student(); int *books;};Student.cpp如下:#i原创 2012-11-30 09:41:45 · 4904 阅读 · 1 评论 -
C++中的虚继承
多继承中被当做基类来虚继承的类是虚基类。虚基类:使用关键字virtual继承的基类。即使同一类在层次中作为虚基类出现多次,派生类对象中虚基类部分也只出现一次。在非虚基类中,构造函数只能初始化自己的直接基类,当对一个类进行虚继承的时候,由最底层的派生类初始化那个类,因此最底层的派生类应包含用于其他所有虚父类的初始化式。在这里有四个类:Point ,PointA,PointB,DerivedP原创 2012-11-25 22:42:27 · 3177 阅读 · 0 评论 -
C++中的多继承
多重继承:类有多个直接基类的继承。派生类继承所有基类的成员,通过在派生列表中指定多个基类而定义多个基类,每个基类需要一个单独的访问标号。若不定义访问标号,默认为private。class DerivedPoint :public PointA,public PointB {};派生类构造函数初始化所有基类构造函数初始化式只能控制用于初始化基类的值,不能控制基类的构造原创 2012-11-25 21:40:49 · 6713 阅读 · 1 评论 -
C++中的异常处理(三)
查看普通函数的声明的时候,不可能知道该函数会抛出什么异常,但是在捕获异常的时候要知道一个函数会抛出什么样的异常,以便捕获异常。异常说明:指定,如果函数抛出异常,抛出的异常将是包含在该说明中的一种,或者是从列出的异常中派生的类型。1.定义异常说明异常说明跟在形参表后。一个异常说明在关键字throw之后跟着一个由圆括号括住的形参列表,该列表可能为空或者多个,若为多个,则用逗号分开。例如:原创 2012-11-24 23:00:36 · 2618 阅读 · 1 评论 -
C++中的异常处理(二)
先看下面的代码:int main(){ int *i=new int(10); /* 这中间的代码出现异常 */ delete i; return 0;} 如果出现了这样的情况,动态分配的内存就不会被释放。为了处理这样的问题,可以使用C++标准库auto_ptr类。如果使用下面的代码,内存就一定会被释放#includeint ma原创 2012-11-24 20:56:54 · 2985 阅读 · 4 评论 -
C++中的异常处理(一)
异常就是运行时出现的不正常,例如运行时耗尽了内存或遇到意外的非法输入。异常存在于程序的正常功能之外,并要求程序立即处理。不能不处理异常,异常是足够重要的,使程序不能继续正常执行的事件。如果找不到匹配的catch,程序就调用库函数terminate。 如果不处理异常将会出现上图的效果。下面是处理异常的代码:#includeusing namespace std;int mai原创 2012-11-23 21:21:37 · 19401 阅读 · 2 评论 -
C++中的多态
C++中的多态分为四种1.参数多态这种多态包括函数模板和类模板2.包含多态这种多态就是C++面向对象编程的灵魂3.重载多态重载多态是指函数名相同,但函数的参数个数或者类型不同的函数构成多态4.强制多态这种多态是强制类型转换,司空见惯啊。 这里主要说的是C++面向对象编程的灵魂------包含多态。C++中面向对象编程的一个颇具讽刺的地方是,不能使用对象支原创 2012-11-21 13:56:13 · 4048 阅读 · 1 评论 -
C++派生类与基类的转换
每一个派生类对象包含一个基类部分,这就意味着可以像使用基类对象一样在派生类对象上执行操作。因为派生类对象也是基类对象,所以存在从派生类类型的引用到基类类型的自动转换,即,可以将派生类对象的引用转换为基类对象的引用,对指针也类似。基类对象既可以作为独立对象存在,也可以作为派生类对象的一部分而存在,因此,一个基类对象可能是也可能不是一个派生类对象的一部分,结果没有从基类引用到派生类引用的自原创 2012-11-20 21:26:10 · 3781 阅读 · 0 评论 -
C++派生类的构造函数和复制控制
派生类的构造函数和复制控制成员不能继承,每个类定义自己的构造函数和复制控制成员,像任何类一样,如果类没有定义自己的构造函数和复制控制成员,编译器自动合成。1.构造函数派生类的构造函数先要初始化基类的成员,然后初始化本类的成员下面定义一个Father类,头文件如下:#if !defined(AFX_FATHER_H__C5B84CD6_0B79_4806_BEDA_035EB4183原创 2012-11-19 21:11:54 · 6115 阅读 · 0 评论 -
C++继承方式与成员访问规则
既然派生类中包含基类成员和自己增加的成员,就产生了这两部分成员的关系和访问属性的问题,派生类对基类的成员访问方式有以下两种:内部访问:在派生类中访问基类的成员对象访问:派生类对象在类外部访问通过下面一张图片,简单明了的表示派生类对基类的访问规则 只有在基类中访问权限为public且继承方式为public的成员,派生类对象才能在外部访问基类的成员。原创 2012-11-19 20:07:54 · 2216 阅读 · 0 评论 -
C++操作符重载
重载操作符是具有特殊名称的函数:保留字operator后接需定义的操作符符号。除了函数调用操作符之外,重载操作符的形参数目(包括成员函数的隐式this指针)与操作符的操作数数目相同。函数调用操作符可以接受任意数目的操作数。 大多数操作符都可以重载,所以我列出不能重载的操作符,一共有四种::: .*原创 2012-11-18 21:04:41 · 2547 阅读 · 0 评论 -
C++复制控制之赋值操作符(二)
与类要控制初始化对象的方式一样,类也定义了该类型对象赋值时会发生什么,与复制构造函数一样,如果类没有定义自己的赋值操作符,则编译器会合成一个。重载操作符是是一些函数,其名字为operator后跟着所定义的操作符的符号。因此,通过定义名为operator=的函数,我们就可以对赋值进行定义赋值是二元运算,所以该操作符函数有两个形参:第一个形参对应左操作数,第二个形参对应右操作数。因为赋值操作是类的原创 2012-11-11 21:21:00 · 2730 阅读 · 1 评论 -
C++复制控制之复制构造函数(一)
只有单个形参,而且该形参是本类类型对象的引用(常用const修饰),这样的构造函数称为复制构造函数。与默认的构造函数一样,复制构造函数由编译器隐式调用。如果我们没有定义复制构造函数,编译器就会为我们合成一个。与合成的默认构造函数不同,即使我们定义了其他构造函数,也会合成复制构造函数,合成复制构造函数将逐个成员初始化。下面是代码:Student.h头文件#if !defined(AFX_原创 2012-11-10 23:34:27 · 1773 阅读 · 0 评论 -
C++文件操作
C语言上是C++的子集,所以C++操作文件可以使用C语言的函数。C++的fstream类提供了对文件的操作,但是不常用,C++操作文件的时候用C语言的函数还是方便一些。C语言使用FILE结构体操作文件,使用FILE结构体时,需要包含头文件#include下面的代码是一个示例#include#include#includeusing namespace std;int原创 2012-11-07 22:47:08 · 1982 阅读 · 1 评论 -
C++中的友元
友元机制允许一个类将其非公有的成员的访问权授予指定的函数或者类。友元的声明以关键字friend开始。它只能出现在类定义的内部。友元声明可以出现在类中的任何地方:友元不是授予友元关系的那个类的成员,所以他们不受其声明出现部分访问控制的影响。如果在class Student{private:int age;string name;friend class Teacher;原创 2012-11-06 21:14:27 · 1903 阅读 · 0 评论 -
C++标准库set类型
set容器只是单纯的键的集合,键必须为一。set容器不支持下标操作,而且没有定义maped_type类型。在set容器中,value_type不是pair类型,而是与key_type类型相同的类型。1.在set中添加元素set set1;set1.insert("the");set1.insert("end"); 也可以添加一对迭代器,如下:set1.insert(se原创 2012-11-06 10:53:20 · 5814 阅读 · 0 评论 -
C++标准库map类型
map是键-值对的集合。map类型通常可以理解为关联数组:可以使用键作为下标获取一个值,正如内置数组一样。而关联的本质在于元素的值于某个特定的键相关联,而并非通过元素在数组中的位置获取。1.map对象的定义要使用map对象,则必须包含map头文件。在定义map对象时,必须分别指明键和值得类型map word_count; string为键,int为值map的构原创 2012-11-05 10:50:47 · 6715 阅读 · 0 评论 -
C++标准库pair
与关联容器相关的模板类型,包含两个数据成员,在utility头文件中定义.pair类型提供的操作:pair p1;pair p1(v1,v2);make_pair(v1,v2);p1 p1 == p2;p.first;p.second; 1.创建和初始化: pair name; pair> data;以上全部调用pair类型的默认构造函对原创 2012-11-05 09:21:14 · 8539 阅读 · 0 评论 -
C++栈和队列
使用标准库的栈和队列时,先包含相关的头文件#include#include定义栈如下:stack stk;定义队列如下:queue q;栈提供了如下的操作s.empty() 如果栈为空返回true,否则返回falses.size() 返回栈中元素的个数s.pop() 删原创 2012-10-19 16:19:26 · 75943 阅读 · 14 评论 -
C++指向函数的指针
函数指针是指指向函数而非指向对象的指针。像其他指针一样,函数指针也指向某个特定的类型。函数类型由其返回类型以及形参表确定,而与函数名无关。int (*pi)(const string &,const string &);这个语句将pi申明为指向函数的指针,它所指向的函数带有两个const string& 类型的形参和int类型的返回值。*pi两侧的园括号是必须的:int *pi(c原创 2012-10-18 19:35:16 · 6727 阅读 · 0 评论 -
C style字符串
C style string(C风格字符串)的定义如下:C程序把指向以空字符结束的字符数组的指针视为字符串。在C++中,字符串字面值就是C风格字符串。C标准库定义一系列处理这种字符串的库函数,C++中将这些标准库函数放在cstring头文件中。由于C风格字符串本质上容易出错,C++程序应该优先使用C++标准库类string而少使用C风格字符串。C++标准库类string比C风格字符串更安全,效原创 2012-10-08 18:13:40 · 3874 阅读 · 0 评论 -
C++指向const对象的指针和const指针
1.指向const对象的指针我们可以通过指针来修改其所指对象的值,但如果指针指向的是const对象,则不允许使用指针来改变其所指的const值。C++要求指向const对象的指针也是const类型。const double *pd; //可以指向一个const double类型。 这里的const限定的是pd所指的对象,而不是pd。这里的pd是可以重原创 2012-10-08 13:30:44 · 7036 阅读 · 0 评论 -
C++标准库vector及迭代器
vector是同一种对象的集合,每个对象都有一个对应的整数索引值。和string对象一样,标准库将负责管理与存储元素相关的类存。引入头文件#include1.vector对象的定义和初始化vector v1 vector保存类型为T的对象。默认构造函数,v1为空vector v2(v1) v2是v1的一个副本vector v3(n,i)原创 2012-10-05 22:45:29 · 43276 阅读 · 1 评论 -
C++标准库string类型
string类型支持长度可变的字符串,C++标准库将负责管理与存储与字符串相关的类容,以及提供各种有用的操作。标准库string类型的目的就是满足对字符串的一般应用。包含头文件#include1.string对象的定义与初始化string s1; 默认构造函数string s2(s1); 将s2初始化为s1的一个副本str原创 2012-10-04 22:26:22 · 7090 阅读 · 0 评论