C++实践与提高
文章平均质量分 77
记录C++学习的点点滴滴。
笨蛋糕
当你的才华还不足以撑起你的野心时,你应该静下心去学习!
展开
-
C++ Primer笔记(十九)运行时类型识别RTTI
通过运行时类型识别(RTTI),程序能够使用基类的指针或引用来检查这些指针或引用所指向对象的实际类型。通过两个操作符提供RTTI: 1:typeid操作符,它返回指针或引用所指对象的实际类型。如typeid(*p); typeid(ref); 2:dynamic_cast操作符,将基类类型的指针或引用安全的转换为派生类类型的指针或原创 2014-04-27 16:37:34 · 932 阅读 · 0 评论 -
C++ Primer笔记(十八)优化内存分配
C++类型分配是一个类型化操作:new特定类型分配内存,并在新分配的内存中构造对象。new表达式会为每个动态分配的类自动调用构造函数。但有些时候需要将内存分配与对象构造分开,因为对预先分配,但以后却不使用的对象进行构造很是浪费的。内存分配和对象构造紧密纠缠,就像对象析构和内存回收一样。new表达式分配内存并在该内存中构造一个对象,delete表达式调用析构函数撤销对象,并将对像所用内存返还给系原创 2014-04-27 11:33:49 · 984 阅读 · 0 评论 -
C++ Primer笔记(十七)多重继承与虚继承
多重继承是从多于一个直接基类派生类的能力。多重继承的派生类继承其所有父类的属性。为了支持多重继承,应扩充派生列表,多个类用逗号分割。如:class panda:public bear,public animal{};注意每个基类都必须制定访问级别。public,private,protected,与单继承一样。多重继承的派生类对象包含每个基类子对象。像单继承一样,多继承原创 2014-04-27 11:11:55 · 1258 阅读 · 0 评论 -
C++ Primer笔记(十六)命名空间
在一个给定的作用域中定义的每个名字,在该作用域中必须是唯一的。对庞大、复杂的应用程序而言,这个很难满足。由独立开发的库构成的复杂程序更有可能遇到名字冲突,因为库倾向于使用全局名字:模板名、类型名或函数名。命名冲突问题被称为:命名空间污染。命名空间为防止名字冲突,提供了更加可控的机制。命名空间能够划分全局命名空间。一个命名空间是一个作用域,通过在命名空间内定义库中的名字,就可以避免全局名字固有的原创 2014-04-26 17:22:45 · 722 阅读 · 0 评论 -
C++ Primer笔记(十五)异常处理
现对于小型的软件系统,大规模编程对程序设计语言和程序员的要求更高,它们往往具有以下要求:1:更严格的正常运转时间以及更强壮的错误检测和错误处理。2:运用各种库进行开发。3:能够处理更复杂的应用概念。C++中所具有的异常处理、命名空间和多重继承可以很好的满足这些要求。一:异常处理使用异常处理,程序中独立开发的各部分能够就程序执行期间出现的问题相互通信,并处理这些问题。这能够将原创 2014-04-26 13:05:30 · 725 阅读 · 0 评论 -
C++ Primer笔记(十四)模版与泛型编程
所谓泛型编程就是以独立于任何特定类型的方式编程。使用时,我们需要提供具体程序实例所操作的类型或值。标准库的容器、迭代器和算法都是泛型编程的例子。模板是泛型编程的基础。模板是创建类或函数的蓝图或公式。可以定义自己的函数模板或类模板。函数模板是独立于类型的函数,根据实参类型产生函数特定类型的版本。模板定义以关键字template开始,后接模板形参列表。它是用尖括号括住的一个或多个模板形参的原创 2014-04-26 11:14:16 · 613 阅读 · 0 评论 -
C++ Primer笔记(十三)面向对象编程
继承和动态绑定与抽象一起成为面向对象编程的基础。C++中用类进行数据抽象,用派生从一个类继承另一个类,动态绑定是编译器能够在运行时决定,是使用基类中定义的函数还是派生类中定义的函数。面向对象编程的关键思想是多态性。除构造函数以外,任意非static成员函数都可以是virtual函数。继承层次的基类一般都要定义virtual的析构函数。virtual 只能在类内部原创 2014-04-23 09:45:03 · 788 阅读 · 0 评论 -
C++ Primer笔记(十二)重载操作符与转换
重载操作符必须具有至少一个类类型或枚举类型的操作数,这条规则强制重载操作符不能重新定义用于内置类型对象的操作符含义。重载操作符时使用默认实参是非法的。大多数重载操作符可以定义为普通非成员函数或类的成员函数。作为类的成员重载函数,其形参看起来比操作数数目少1,因为它有一个隐含的this形参,限定为第一个操作数。作为普通函数时,函数的第一、第二个参数分别为操原创 2014-04-23 08:34:11 · 827 阅读 · 0 评论 -
C++ Primer笔记(十一)复制控制
如果没有显式定义复制构造函数、赋值操作符,编译器通常为我们定义。复制构造函数是一种特殊的构造函数,具有单个形参,该形参为对该类类型的引用。当定义一个新对象,当将该类型的对象传递给函数或从函数返回该类型的对象时将隐式使用复制构造函数。复制构造函数、赋值操作符和析构函数总称为复制控制。编译器自动实现这些操作,但类也可以定义自己的版本。通常编译器合成的复制控制函数是非常精练的,它原创 2014-04-21 15:08:11 · 753 阅读 · 0 评论 -
C++ Primer笔记(十)类
类的成员可以是数据、函数或类型别名。在类内部声明成员函数是必须的,但是可以不在类内定义。在类内部定义的函数默认为inline。也就是说,当它们被调用时,编译器将试图在同一行内扩展该函数。也可以显式的将成员函数声明为inline。在声明处和定义处指定inline均可。将const加在形参列表后,就可以将成员函数声明为常量,它不能改变其所操作的对象的数据成员,同时con原创 2014-04-16 12:19:58 · 816 阅读 · 0 评论 -
C++ Primer笔记(九)泛型算法
标准库容器定义的算法很少,而是选择提供一组算法.。泛型是指这些算法不依赖特定的容器类型,可作用在不同类型的容器和不同类型的元素上。不但可以作用在list和vector上还可以作用在内置数组上。 迭代器将算法和容器绑定起来。大多数算法是通过遍历有两个迭代器标记的一段元素来实现其功能。find函数,接受两个迭代器和一个值作为参数,它检查两个迭代器实参标记范围内的每一个元素,只要原创 2014-04-16 11:10:17 · 783 阅读 · 0 评论 -
C++ Primer笔记(八)关联容器
第十章:关联容器关联容器和顺序容器的本质差别在于:关联容器通过键存储和读取元素,而顺序元素通过元素在容器中的位置顺序存储和访问元素。虽然关联容器的大部分行为与顺序容器相同,但其独特之处在于支持键的使用。关联容器通过键来高效的查找和读取元素,两个基本的关联容器为map和set。map的元素以键---值对的形式组织,键用作元素在map中的索引,而值表示存储和读取的元素。原创 2014-04-15 18:38:13 · 842 阅读 · 0 评论 -
C++ Primer笔记(七)顺序容器
顺序容器内的元素按位置进行存储和访问。元素的排列次序与元素值无关,而是由元素添加到容器的次序决定的。标准库定义了三种顺序容器类型:vector,list,deque。它们的差别在于访问元素的方式,以及添加或删除元素相关操作的运行代价。容器仅定义少量操作,大多数额外操作由算法库提供。为了定义容器对象首先要包含相关头文件,如#include,#include,#include,所有的容器都是类原创 2014-04-15 16:00:41 · 842 阅读 · 0 评论 -
C++ Primer笔记(六)函数
1、返回值为void类型的函数不能放在赋值表达式的右边。2、形参表中的每一个形参都需要一个显式的类型。尽量把函数头部限制在一行。3、如果函数确定需要返回一个结果,则语句return 表达式;会计算表达式的值并把结果返回给调用者。4、函数签名—函数原型的函数名和实参类型部分——并不指定函数的返回类型——在同一作用域内的函数必须有不同的签名。5、实参类型原创 2014-04-15 10:21:23 · 936 阅读 · 0 评论 -
C++ Primer笔记(五)语句
1、可执行语句——没有涉及到初始化和构造函数调用的声明并不是执行语句。2、if选择语句、if...else双路选择语句、C++编译器总是把else同它之前最近的if联系起来。(最近原则)while循环语句、空行、缩排、计数器控制的循环、嵌套的控制语句、for循环、switch多路选择、double比float更受欢迎。3、条件运算符(?:)——条件表达式的值也可以是要执行的原创 2014-04-12 22:47:28 · 675 阅读 · 0 评论 -
C++ Primer笔记(四)表达式
C++支持运算符重载。对于两个数的除法和求模,若均为正,则结果均为正。若均为负,除法结果为正,取模的结果为负。若一正一负,则结果依赖于具体编译器。之所以不能串联使用关系操作符如if(i=1,结果恒为真。对于判断与bool值相等与否,一般都是判断非假,if(val!=false),或是写成if(val),因为val可能是int或是相关类型,如果使用if(val==true原创 2014-04-12 11:20:08 · 871 阅读 · 0 评论 -
C++ Primer笔记(三)数组和指针
C++语言应尽量使用vector和迭代器类型,应避免使用低级的数组和指针,涉及良好的程序只有在强调速度时才在类实现的内部使用数组和指针。因此要向成为一个真正的C++程序员就要多使用vector和string来替代数组和c风格字符串。数组的维数必须用整型常量指定,非const类型或是到运行时才知道其值的const变量都不能用于定义数组的维数。在没有显式提供元素的初始时数组元素会像普通元素一样原创 2014-04-12 10:50:17 · 1050 阅读 · 0 评论 -
C++ Primer笔记(二)标准库类型
1、一个using声明一次只能作用于一个命名空间成员。在头文件中放置using声明,就相当于在包含该头文件的每个程序中都放置了同一using声明。在头文件中,必须总是使用完全限定的标准库名字。因为头文件的内容会被预处理器复制到程序中。通常,头文件中应该只定义确实必要的东西。即最小权原则。2、string支持长度可变的字符串。使用string类型对象时必须包含头文件。 st原创 2014-04-12 10:14:44 · 904 阅读 · 0 评论 -
C++ Primer笔记(一)变量和基本类型
1、每个C++程序都包含一个或多个函数,而且必须有一个命名为main。return 0表明程序成功执行。main函数的返回值必须是int型。2、iostream库的基础是两种命名为istream和ostream的类型,分别表示输入流和输出流。流是指要从某种IO设备上读入或写出的字符序列。cerr对象又叫做标准错误,用来输出警告信息和错误信息给程序的使用者。clog对象用于产生程序执原创 2014-04-12 10:13:12 · 829 阅读 · 0 评论