
C++基础
文章平均质量分 66
Tianttt
这个作者很懒,什么都没留下…
展开
-
三十四、异常(一)异常抛出、异常捕获、异常传播
一、程序错误程序错误包含以下:编译错误,即语法错误。程序就无法被生成运行代码。运行时错误不可预料的逻辑错误可以预料的运行异常 例如:动态分配空间时可能不会成功打开文件可能会失败除法运算时分母可能为0整数相乘可能溢出数组越界……二、C语言处理程序错误的方法(1)、返回值double func(){ int ret = func(原创 2015-02-26 22:20:42 · 635 阅读 · 0 评论 -
七、构造函数和析构函数(一) 默认构造函数、重载构造函数、构造函数和new运算符、析构函数和数组、析构函数和delete运算符
一、构造函数的定义规则构造函数函数名和类名完全相同不能定义构造函数的类型(返回类型),也不能使用void 通常情况下构造函数应声明为公有函数,否则它不能像其他成员函数那样被显式地调用构造函数被声明为私有有特殊的用途。构造函数可以有任意类型和任意个数的参数,一个类可以有多个构造函数(重载)构造函数定义如下:class Test{public: // 如果类不提供任何一个构造原创 2014-12-28 16:54:34 · 807 阅读 · 0 评论 -
二十九、多态、静态绑定与动态绑定、虚函数、虚表指针、object slicing与虚函数、overload、override 、overwrite
一、多态 多态性是面向对象程序设计的重要特征之一。它是指发出同样的消息被不同类型的对象接收时有可能导致完全不同的行为。比如我们定义一个带有Run的虚函数动物类,让鱼,鸟,和狗继承自这个类,当我们用虚基类指针Animal* p;指向不同派生类,调用函数时会调用派生类的函数,比如鱼是水里游,鸟在天上飞,狗在地上跑,实现同一个指针根据不同指向具有不同的行为,这就是多态。多态可以通过以下几种原创 2015-01-17 13:37:34 · 905 阅读 · 0 评论 -
三十一、反射、C++动态对象创建实现
一、反射 反射是指计算机程序在运行时(Run time)可以访问、检测和修改它本身状态或行为的一种能力。用比喻来说,那种程序能够“观察”并且修改自己的行为。它包括动态获取类型信息(包括方法和属性),动态创建对象,动态获取对象的方法,动态操作对象的属性。为了实现反射,必须给每个类添加元数据。这里我们只实现动态创建对象。二、动态对象的创建原创 2015-01-18 11:29:52 · 994 阅读 · 2 评论 -
三十、纯虚函数、抽象类、多态、简单工厂模式
一、纯虚函数 虚函数是多态是实现多态的前提,如果我们需要在基类中定义共同的结构,那么接口就需要定义成虚函数。但是很多情况下基类的接口是无法实现的,比如形状类Shape,定义一个Draw方法。很明显这个方法没法实现,因为我们可以画出圆,正方形,但是不能画出"形状"。此时我们可以将这些接口定义成虚函数。 在基类中不能给出有意义的虚函数定义,这时可以把它说原创 2015-01-17 16:50:56 · 730 阅读 · 0 评论 -
二十七、继承(四) 多重继承、虚继承与虚基类、虚基类及其派生类构造函数
一、多重继承 在现实生活中,经常会有一个对象属于多个类别的情况,比如沙发床同时具有沙发和床的特点,这个时候我们可以使用多重继承来模拟这种关系。例子如下:#include using namespace std;class Furniture{public: Furniture(int weight) : weight_(weight) { } int原创 2015-01-15 21:15:04 · 751 阅读 · 1 评论 -
二十八、继承(五) 虚继承对C++对象内存模型造成的影响
一、虚继承对C++对象内存模型造成的影响先看示例:#include using namespace std;class BB{public: int bb_;};class B1 : virtual public BB{public: int b1_;};class B2 : virtual public BB{public: int b2_;};c原创 2015-01-16 23:51:03 · 846 阅读 · 0 评论 -
八、构造函数和析构函数(二) 转换构造函数、赋值和初始化的区别、explicit
一、转换构造函数转换构造函数是能把一个其他类型转换成类类型的操作,本质上还是构造函数。如下:class Test{public: Test() { cout<<"initnal"<<endl; } Test(int num){ cout<<num<<endl; } void Display(){}; ~Test(){ cout<<"destory"<<endl; }priva原创 2014-12-28 17:25:39 · 536 阅读 · 0 评论 -
九、构造函数和析构函数(三) 初始化列表、对象成员初始化、const,引用成员初始化
一、构造函数初始化列表 构造函数的执行分为两部分,首先执行初始化段,在执行{}内的普通计算段。推荐在构造函数初始化列表中进行初始化,这样执行效率比较高。class Test{public: Test(int a,int b,int c) :x(a),y(b),z(c){}//在初始化列表中初始化,效率较高,若在计算段{ x=a; y=b; z=c; },调用赋值操作,效率较原创 2014-12-28 18:04:05 · 665 阅读 · 0 评论 -
二、从C到C++(二) 引用、引用常见用途、指针和引用区别、const引用
一、引用类型 引用( & )像一个自动能被编译器逆向引用的常量型指针。它通常用于函数的参数表中和函数的返回值,但也可以独立使用。比如:int x;int r = &x;使用引用的一些规则: 当引用被创建时,它必须被初始化。(指针则可以在任何时候被初始化。) 一旦一个引用被初始化为指向一个对象,它就不能被改变为对另一个对象的引用。(指针则可以在任何时候指向另一个对象。)原创 2014-12-03 20:48:23 · 660 阅读 · 0 评论 -
十二、对象的使用(一) static成员变量、static成员函数、类/对象大小计算
一、C语言的static变量和static函数 首先回顾一下C语言的static变量用法。#include using namespace std;//用static修饰变量使变量的状态保留//因为静态变量只能被初始化一次void GetStatic(){ int a = 10; //b只初始化一次 static int b = 10; printf("a:%d原创 2015-01-04 17:41:09 · 915 阅读 · 0 评论 -
十一、构造函数和析构函数(五) 空类默认产生的成员
一、空类默认产生的成员 一个空类默认会产生一下成员函数:class Empty {};Empty(); // 默认构造函数Empty( const Empty& ); //默认拷贝构造函数~Empty(); // 默认析构函数Empty& operator=( const Empty& ); //默认赋值运算符原创 2015-01-04 16:43:48 · 606 阅读 · 0 评论 -
三十五、单例模式的改进、实现sizeof计算变量和类型大小,align计算对齐数
一、单例模式的改进之前实现了一个单例模式这里,这个单例模式的问题是构造的对象在程序退出时无法释放。我们使用了两种方法解决这个问题。第一:使用静态内部类对象,利用对象的确定性析构原理,在成员对象析构的时候释放外部类对象。第二:直接返回静态类对象。显然第一种方法不够简洁,而且这两种方法都使用了静态类对象,所以不是线程安全的。这里我们用智能指针auto_ptr改进单例模式。(注:auto_ptr在C原创 2015-02-28 12:46:19 · 594 阅读 · 0 评论 -
三十五、异常(二)异常和继承、异常和指针、异常规格说明、标准库异常层次
一、异常与继承如果异常类型为C++的类,并且该类有其基类,则应该将派生类的错误处理程序放在前面,基类的错误处理程序放在后面。(否者派生类的异常会被基类类型捕获,而异常要求每种类型捕获对应类型的异常)示例:#include #include using namespace std;class MyException{public: MyException(const原创 2015-02-28 11:16:53 · 620 阅读 · 0 评论 -
三十二、C++内存布局,对象大小计算、虚函数虚继承对类内存模型的影响
一、类大小的影响因素 我们知道,对象的大小是受一下因素影响:成员变量虚函数(产生虚函数表)虚拟继承(使用virtual方式继承,为了保证继承后父类的内存布局只会存在一份)对象大小跟成员函数,静态函数和静态数据无关。二、类大小遵循结构体对齐原则 我们在这里讲过结构体内存对齐的原则,这里我们在通过例子来看结构体对齐是如何影响对象的大小原创 2015-01-23 23:53:15 · 962 阅读 · 0 评论 -
三十三、RTTI(runtime type information)、dynamic_cast运算符、typeid运算符、type_info
一、RTTI(runtime type information) RTTI(Run-Time Type Information)运行时类型检查的英文缩写,它提供了运行时确定对象类型的方法。面向对象的编程语言,象C++,Java,delphi都提供了对RTTI的支持。这里研究一下C++是如何使用RTTI的。二、dynamic_cast运算符 使用d原创 2015-01-24 12:08:22 · 705 阅读 · 0 评论 -
十六、友元函数和友元类、友元函数和友元类注意事项
一、友元函数介绍 一般情况下,非类成员函数是不能访问成员变量的。但是有时候我们为了提高程序运行效率,希望外部函数能直接访问类的成员变量。此时我们可以使用友元。友元是一种允许非类成员函数访问类的非公有成员的一种机制。可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元。二、友元函数友元函数在类作用域外定义,但它需要在类体中进行说明,为了与该类的成员函数加以区原创 2015-01-05 21:37:40 · 1514 阅读 · 0 评论 -
十五、从一个实例看数据封装和抽象
在这个例子里,我们实现一个C语言版本的栈和C++语言的栈,通过比较两者的不同之处学习面向对象中数据的封装和抽象。C语言版本:#include #include #include struct Link{ int data; struct Link* next;};struct Stack{ struct Link* head; int size;};void原创 2015-01-05 20:50:30 · 552 阅读 · 0 评论 -
十三、对象的使用(二)四种对象的作用域与生存期、static用法总结、static与单例模式
一、四种对象的作用域与生存期栈对象:隐含调用构造函数(程序中没有显示调用)堆对象:隐含调用构造函数(程序中没有显示调用)全局对象、静态全局对象:全局对象的构造先于main函数已初始化的全局变量或静态全局对象存储于.data段中未初始化的全局变量或静态全局对象存储于.bss段中静态局部对象已初始化的静原创 2015-01-04 20:52:12 · 791 阅读 · 0 评论 -
十、构造函数和析构函数(四) 拷贝构造函数、默认拷贝构造函数、拷贝构造函数调用几种情况、深拷贝浅拷贝、构造函数和=操作符区别、禁止对象拷贝
一、拷贝构造函数功能:使用一个已经存在的对象来初始化一个新的同一类型的对象声明:只有一个参数并且参数为该类对象的引用注意:如果类中没有说明拷贝构造函数,则系统自动生成一个缺省复制构造函数,作为该类的公有成员下面有一个String的例子,说明拷贝构造函数的使用:#ifndef _STRING_H_#define _STRING_H_class String{p原创 2015-01-04 15:39:53 · 943 阅读 · 0 评论 -
十四、对象的使用(二)const成员函数、const对象、mutable
一、const成员函数const成员函数只能访问数据成员的值,不能修改对象的状态class Test{private: int getA() const { a = 100;//错误,不能修改const对象状态 return a; }public: int a;};二、const对象如果把一个对象指定为const,就是告诉编译器不要修改它,因此const对象原创 2015-01-04 21:19:25 · 564 阅读 · 0 评论 -
二十六、继承(三) 转换与继承、派生类到基类的转换、基类到派生类的转换
一、转换与继承 派生类对象也是基类对象。比如我们可以说汽车是车,机动车也是车。这意味着在使用基类的地方可以用派生类来替换。二、派生类到基类的转换当派生类以public方式继承基类时,编译器可自动执行的转换(向上转型 upcasting 安全转换)派生类对象指针自动转化为基类对象指针派生类对象引用自动转化为基类对象引用派生类对象自动转换为基类原创 2015-01-14 21:56:57 · 814 阅读 · 0 评论 -
二十五、继承(二) 不能自动继承的成员函数、继承与构造函数、友元关系与继承、静态成员与继承
一、不能自动继承的成员函数 有三种函数不能被继承,构造函数,析构函数和=运算符,基类的构造函数和析构函数只负责对基类数据成员的初始化和清理,因为基类并不知道派生类有哪些数据成员。=运算符和构造函数功能类似,所以也不能被继承。二、继承与构造函数 基类的构造函数不被继承,所以派生类中需要声明自己的构造函数来初始化新增的数据成员。在声明构造函数时,只需原创 2015-01-13 21:23:47 · 830 阅读 · 0 评论 -
六、类与对象(二)类作用域、前向声明、嵌套类和局部类
一、类作用域每个类都定义了自己的作用域称为类作用域类作用域中说明的标识符只在类中可见。类有一下几种作用域类型1、块作用域2、文件作用域3、函数原型作用域4、函数作用域5、类作用域二、前向声明 C++中类必须先定义,才能够实例化。这是显而易见的,因为编译器在看到了类的定义之后,才能知道为类对象分配多大的空间。 两个类需要相互引用形成原创 2014-12-21 11:56:33 · 829 阅读 · 0 评论 -
十七、运算符重载(一) 成员函数重载、友元函数重载、运算符重载规则
一、运算符重载 运算符重载允许把标准运算符(如+、—、*、/、等)应用于自定义数据类型的对象,这样我们在用自己的数据类型进行运算时,写出的代码更直观易读。比如我们定义了了复数类Complex,重载了+-运算符之后我们就可以直接Complex c = a+b;在这一点上C++和Java不同,Java不允许运算符重载,但是我们经常在程序里看到String c = a+b;这样的写原创 2015-01-07 21:01:38 · 1092 阅读 · 0 评论 -
C++ template第五章总结
1.如果要访问依赖于模板内部的类型,前面要加上typename,如:tempateclass My{ typename T::Subtype * ptr;};Subtype是定义于T内部的类型2.在多继承中,要使用this指明要访问的本成员函数3.可以重载=让不同的模板之间可以赋值,但是不会忽略类型检查如:Stack int1;Stack f2原创 2013-10-28 19:37:13 · 822 阅读 · 0 评论 -
E盘突然出现以下文件,eula.2052.txt globdata.ini install.exe install.res.2052.dll VC_RED.cab VC_RED.
win7更新之后E盘突然出现了一下文件eula.2052.txt globdata.ini install.exe install.res.2052.dll VC_RED.cab VC_RED.经过查资料得知,VC _RED是vc2008再发行组件包安装文件安装时释放出来的安装包临时文件,一般情况下,安装完成后重起电脑就会自动删除,但是这个组件包存在BUG导致临时文件没有释放到temp目录而是原创 2013-08-08 10:55:03 · 13379 阅读 · 0 评论 -
boost源码剖析3----内存管理shared_ptr
Shared_ptr类末班可以指向动态内存分配的对象,支持比较操作,可以搭配STL关联式容器,可以说是最智能的一种指针了,它与scoped_ptr一样是包装了new分配的动态对象,与scoped_ptr不同的是Shared_ptr引入了计数型的智能指针,可以被自由的赋值和拷贝,当引用为0时,才删除引用指向的对象。它的行为最接近原始指针,因此比auto_ptr和scoped_ptr使用范围更广。原创 2013-08-12 22:26:56 · 1161 阅读 · 0 评论 -
boost源码剖析2----内存管理scoped_array
从名字可以看得出来,与scoped_ptr不同的是,这是一个管理堆内存的指针,scoped_array 类模板存储一个指向一个动态分配数组的指针(动态分配数组是用 C++new[] 表达式分配的)。它提供了一个基本的“资源获取就是初始化”的机制,不包括共享所有权或所有权转让语义。无论它的名字还是语义上的强制要求(noncopyable),它的唯一目的就是在当前作用域内独自保留所有权。因为它是n原创 2013-08-12 08:58:36 · 675 阅读 · 0 评论 -
boost源码剖析1----内存管理scoped_ptr
内存管理一直是C++程序员最头疼的的问题,C++继承了C灵活又高效的指针,使用起来一不小心就会导致内存泄露,在boost之前,智能指针是一个不错的解决方案,不过boost提供了更强大的解决方案,包括,scoped_ptr,scoped_array,shared_ptr,shared_array,weak_ptr,instrusive_ptr,这一篇先重点介绍scoped_ptr.scope原创 2013-08-11 21:27:19 · 992 阅读 · 0 评论 -
fatal error C1083: Cannot open precompiled header file: 'Debug/1.pc
打开->工程->设置->C/C++->预编译头,选择不使用预编译头文件即可原创 2013-08-09 20:18:58 · 1051 阅读 · 0 评论 -
Boost实用工具
boost中有很多小的工具,虽然很小,但是很实用。下面简单介绍一下这几个工具。 第一个:noncopyable,从名字可以看出来,它实现一个禁止复制的类,原理也比较简单,就是把一个类的拷贝构造函数和赋值操作符私有化,我们的类在继承这个类就行了。原理比较简单,就不贴源代码了,直接上例子。比如我们定义一个类:class my_class:boost::noncopyable{.原创 2013-08-18 16:32:06 · 846 阅读 · 0 评论 -
C++检测内存泄露、DebugView的使用
我们的程序用到指针的话,可能编译运行都没问题,但是可能存在内存泄露,如何检测这种泄露呢。可以使用一个好用的软件DebugView,下载之后无需安装,直接运行即可,它就会在窗口显示调试信息。为了检测我们的程序是否有内存泄露问题,我们需要在我们的项目main函数之前加上:#define _CRTDBG_MAP_ALLOC然后在main函数return 0;之前加上 _CrtDumpMe原创 2015-01-29 13:16:31 · 1498 阅读 · 0 评论 -
四、面向对象介绍 结构化程序设计、面向对象程序设计、面向对象设计的特征和优缺点
一、结构化程序设计传统的程序设计方法可以归结为“程序=算法+数据结构”,将程序定义为处理数据的一系列过程。这种设计方法的着眼点是面向过程的,特点是数据与程序分离,即数据与数据处理分离。结构化程序设计的基本思想是采用自顶向下、逐步细化的设计方法和单入单出的控制结构。其理念是将大型程序分解成小型、便于管理的任务。如果其中的一项任务仍然过大,则将它分解为更小的任务。这一过程将一直持续下去原创 2014-12-14 15:04:04 · 5727 阅读 · 0 评论 -
二十三、标准库类型map的使用、map介绍、map常用操作、
一、map介绍 map是STL标准库关联容器,在SGI STL的实现中,底层是用红黑树实现的。使用map需要包含map类所在的头文件#include 。定义一个map对象:map<string,int>mapTest;表示用string作为索引,存储int对象。二、map的常用操作插入查找修改和删除下面是map常用操作的一个例子:#df原创 2015-01-11 11:25:26 · 759 阅读 · 0 评论 -
二十四、继承(一) 代码重用、继承方式、接口继承与实现继承、继承和重定义、继承和组合
一、代码重用 在C语言中重用代码的最主要方式就是封装成函数然后其他地方调用这个函数,但是一个函数往往通用性不是很大。所以C语言中很多代码复用都是修改粘贴代码。C++很重要的一个特征就是代码重用,C++可以用继承或组合或者模板的方式来重用。通过组合或继承现有的的类来创建新类,而不是重新创建它们。我们创建了一个基类,用我们的类去继承基类,我们的类就有了基类的功能。二、继承原创 2015-01-12 23:39:07 · 1122 阅读 · 0 评论 -
二十二、标准库类型vector的使用、vector介绍、vector构造和初始化、vector常用成员函数
一、vector介绍 vector是同一种类型的对象的集合,vector的数据结构很像数组,能像数组一样非常高效和方便地访问单个元素。在STL里,vector的实现是一个类模板(class template),模板参数可以是任意类型。要使用vector必须包含相关头文件#includeusingstd::vector; 二、vector的构造和初始化#incl原创 2015-01-10 22:53:25 · 669 阅读 · 0 评论 -
二十一、标准库类型string的使用、string类介绍、string对象的构造和初始化、string常用成员函数
一、string类介绍string类型是长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作typedef basic_string string; typedef basic_string wstring; 要使用string类型对象,必须包含相关头文件 #includeusingstd::string;二、string对象的构原创 2015-01-10 22:26:36 · 533 阅读 · 0 评论 -
二十、运算符重载(四) Integer类改进、类型转换运算符重载、 ->运算符重载、 new的三种用法、operator new、operator delete重载
一、类型转换运算符重载一般基本数据类型可以通过转换构造函数转换成类类型,但是类类型不能直接转换为基本数据类型。这些是数据类型转换的一般原则:简单类型一般可以转换成复杂数据类型,但是复杂数据类型一般不能直接转换为基本数据类型。这个时候就需要我们重载类型转换运算符。类型转换运算符可以实现从类类型->自定义数据类型 的转换。和构造函数 自定义数据类型->类类型的转换方向正好相反。我们改进原创 2015-01-10 16:11:34 · 614 阅读 · 0 评论 -
十九、运算符重载(三)String类的改进实现、[]运算符重载、+运算符重载、+=运算符重载、<<运算符重载、>>运算符重载
一、String类的实现我们继续实现以下功能:[]运算符重载+运算符重载+=运算符重载>>运算符重载例子代码:#include #include using namespace std;class String{public: String(const char* str=""); String(const String& other); Strin原创 2015-01-10 11:58:15 · 845 阅读 · 0 评论