- 博客(67)
- 资源 (1)
- 收藏
- 关注
原创 C++异常简介
C++内置了异常处理的语法元素try…catch… try语句处理正常代码逻辑catch语句处理异常情况try语句中的异常由对应的catch语句处理try语句处理正常代码逻辑,catch语句处理异常情况try{ double r = divide(1,0);}catch(...) //"..."表示处理所有异常{ cout << "Divi...
2018-02-12 22:32:52
210
原创 智能指针
#ifndef SMARTPOINTER_H#define SMARTPOINTER_Hnamespace Lib{template typename T>class SmartPoint{protected: T* m_pointer;public: SmartPoint(T* p = NULL) { m_pointer = p;
2018-02-05 21:49:00
206
原创 c++中的抽象类和接口
面向对象中的抽象类可用于表示现实世界中的抽象概念是一种只能定义类型,而不能产生对象的类只能被继承并重写相关函数直接特征是相关函数没有完整的实现c++语言中没有抽象类的概念C++中通过纯虚函数实现抽象类纯虚函数是指只定义原型的成员函数一个C++类中存在纯纯虚函数就成了抽象类纯虚函数的语法规则class Shape{ public: virtual
2018-01-31 21:32:08
1308
原创 泛型编程
函数模板的语法规则 template关键字用于声明开始进行泛型编程typename关键字用于声明泛指类型template T> //template:告诉编译器开始泛型编程 T>告诉编译器T是一个泛指类型void Swap(T& a,T& b){ T t = b; a = b; b = t;}函数模板的使用 自动类型推导的调用具体类型显示调
2018-01-27 19:50:09
186
原创 继承、多态对象模型
在c++编译器的内部类可以理解为结构体子类是由父类成员叠加子类新成员得到的c++多态的实现原理当类中声明虚函数时,编译器会在类中生成一个虚函数表虚函数表是一个存储成员函数地址的数据结构虚函数表是由编译器自动生成与维护的virtual成员函数会被编译器放入虚函数表中存在虚函数时,每个对象都有一个指向虚函数表的指针虚函数效率低于普通成员函数
2018-01-22 20:59:53
160
原创 C++对象模型分析
class是一种特殊的struct在内存中class依旧可以看作变量的集合class与struct遵循相同的内存对齐规则class中的成员函数与成员变量时分开存放的 每个对象有独立的成员变量所有对象共享类中的成员函数运行时的对象退化为结构体的形式所有成员变量在内存中依次排布成员变量间可能存在内存间隙可以通过内存地址直接访问成员变量访问权限关键字在运行时失效类中的成员函数位
2018-01-20 19:50:50
142
原创 多态的概念和意义
函数重写父类中被重写的函数依然会继承给子类子类中重写的函数将覆盖父类中的函数通过作用域分辨符(::)可以访问到父类中的函数函数重写只可能发生在父类与子类之间面向对象中的多态的概念根据实际的对象类型决定函数调用的具体目标同样的调用语句在实际运行时有多种不同的表现形态C++语言直接支持多态的概念通过使用virtual关键字对多态进行支持被virtual声明的函数被重写后具有多
2018-01-17 21:35:52
298
原创 同名覆盖引发的问题
子类对象可以当作父类对象使用(兼容性)子类对象可以直接赋值给父类对象子类对象可以直接初始化父类对象父类指针可以直接指向子类对象父类引用可以直接引用子类对象当使用父类指针(引用)指向子类对象时子类对象退化为父类对象只能访问父类中定义的成员可以直接访问被子类覆盖的同名成员特殊的同名函数子类中可以重定义父类中已经存在的成员函数这种重定义发生在继承中,叫做函数重写函数重写是同
2018-01-16 21:53:22
373
原创 子类与父类的冲突
子类和父类同名的处理方法 子类可以定义父类中的同名成员子类中的成员将隐藏父类中的同名成员父类中的同名成员依然存在于子类中通过作用域分辨符(::)访问父类中的同名成员Child c;c.mi = 100; //子类中的mic.Parent::mi = 1000; //父类中的mi子类中定义的函数是否能够重载父类中的同名函数? 子类中的函数将隐藏
2018-01-16 20:32:29
587
原创 继承中的构造与析构
父类构造函数在子类中的调用方式 默认调用 适用于无参构造函数和使用默认参数的构造函数显示调用 通过初始化列表进行调用适用于所有父类构造函数父类构造函数的调用class Child : public Parent{public: Child() //隐式调用 { cout "Child()" << endl; } child
2018-01-15 20:37:28
379
原创 不同的继承方式
class parent{};class child : pulic parent //":"表示继承关系,parent表示被继承的类,public表示**继承方式**{};C++中支持三种不同的继承方式 public继承 父类成员在子类中保持原有访问级别private继承 父类成员在子类中变为私有成员protected继承 父类中的公有成员变成为保护成员,其他成员保持
2018-01-14 13:32:47
168
原创 继承中的访问级别
面向对象中的访问级别不只是public和private可以定义protected访问级别关键字protected的意义- 修饰的成员不能被外界直接访问- 修饰的成员可以被子类直接访问- protected使得子类能够访问父类成员- 没有protected关键字就无法实现真正意义上的代码复用- protected关键字是为了继承而专门设计的
2018-01-14 12:49:57
219
原创 继承的概念和意义
组合关系的特点-将其他类的对象作为当前类的成员使用- 当前类的对象与成员对象的生命周期相同-成员对象在用法上与普通对象完全一致面向对象中的继承子类之间的父子关系- 子类拥有父类的所有属性和行为- 子类就是一种特殊的父类- 子类对象可以当做父类对象使用- 子类中可以添加父类没有的方法和属性class Parent{ int mv;public:void met
2018-01-13 11:42:17
2836
原创 类类型的转换
C++类中可以定义类型转换函数类型转换函数用于将类对象转换为其他类型语法规则:operator Type () { Type ret; //... return ret; }类型转换函数- 与转换构造函数具有同等的地位- 使得编译器有能力将对象转化为其他类型- 编译器能够隐式的使用类型转换函数- 无法抑制隐式的类型转换函数调用- 类型转
2018-01-13 10:47:02
547
原创 数据类型转换函数
构造函数可以定义不同类型的参数参数满足下列条件时称为转换构造函数 - 有且仅有一个参数- 参数是基本类型- 参数是其他类类型 编译器尽力尝试的结果是隐式类型转换隐式类型转换- 会让程序以意想不到的方式进行工作- 是工程中bug的重要来源工程中通过explicit关键字杜绝编译器的转换尝试转换构造函数被explicit修饰时只能进行显示转换- 转换
2018-01-08 22:58:40
316
原创 前置操作符和后置操作符
现代编译器产品会对代码进行优化优化使得最终的二进制程序更加高效优化后的二进制程序丢失了C/C++的原生语义不可能从编译后的二进制程序还原C/C++程序++操作符可以被重载全局函数和成员函数均可进行重载重载前置++操作符不需要额外的参数重载后置++操作符需要一个int类型的占位符//前置++test& operator ++ (){ ++mvalue(); retur
2018-01-05 22:40:00
236
原创 逗号操作符
逗号操作符(,)可以构成逗号表达式 - 逗号表达式用于将多个子表达式连接为一个表达式 - 逗号表达式的值为最后一个子表达式的值 - 逗号表达式中的前N-1个子表达式可以没有返回值 - 逗号表达式按照从左向右的顺序计算每个子表达式的值(i,j)= 6;//结果为j=6在C++中重载逗号操作符是合法的使用全局函数对逗号操作符进行重载重载函数的参数必须
2018-01-02 23:54:48
152
原创 逻辑操作符
逻辑运算符的原生语义操作数只有两种值(true和false)逻辑表达式不完全计算就能确定最终值最终结果只能是true或者false重载操作符会有陷阱问题的本质 C++通过函数调用扩展操作符的功能进入函数体前必须完成所有参数的计算函数参数的计算次序是不定的短路法则完全失效 逻辑操作符重载后无法完全实现原生的语义建议实际工程开发中避免重载逻辑操作符通过重载比较操作符代替逻辑操作符重载
2018-01-01 22:22:28
206
原创 智能指针
智能指针解决以下问题: - 内存泄漏 - 动态申请堆空间,用完后不归还 - C++语言中没有垃圾回收的机制 - 指针无法控制所指堆空间的生命周期智能指针要求 - 我们需要一个特殊的指针 - 指针生命周期结束时主动释放堆空间 - 一片堆空间最多只能由一个指针标识 - 杜绝指针运算和指针比较解决方案 - 重载指针特征操作符(->和*) - 只能通过类的
2018-01-01 21:46:06
123
原创 创建类
编译器默认提供的函数class test{};等价于,编译器会默认提供以下函数class test{ public: test(); test(const test&); test& oprator = (const test&); ~test();};
2018-01-01 15:55:56
159
原创 默认重载赋值操作符
编译器为每个类默认重载了赋值操作符默认的赋值操作符仅完成浅拷贝当需要进行深拷贝时必须重载赋值操作符赋值操作符与拷贝构造函数有相同的存在意义重载复制操作符,必然需要实现深拷贝
2018-01-01 15:49:56
481
原创 函数对象分析
函数对象使用具体的类对象取代函数该类的对象具备函数调用的行为构造函数指定具体数列项的起始位置多个对象相互独立的求解数列项函数调用操作符(())//int operator()(){}只能通过类的成员函数重载可以定义不同参数的多个重载函数取代函数对象用于在工程中取代指针
2017-12-25 22:37:33
93
原创 数组操作符的重载
数组访问操作符([]) 只能通过类的成员函数重载重载函数能且仅能使用一个参数可以定义不同参数的多个重载函数string类最大程度的兼容了c字符串的用法数组访问的重载能够使得对象模拟数组的行为只能通过类的成员函数重载数组访问符
2017-12-25 20:10:56
207
原创 c++字符串类
应用开发中大多数的情况都在进行字符串处理从c到c++的进化引入了自定义类型在c++中通过类完成字符串类型的定义c++语言中没有原生的字符串类型c++标准库提供了string类型string直接支持字符串连接string直接支持字符串的大小比较string直接支持子串查找和提取string直接支持字符串的插入和替换字符串与数字的转换标准库提供了相关的类对字符串和数字进行转换字符串类(
2017-12-21 20:15:48
392
原创 c++标准库
c++标准库并不是c++语言的一部分c++标准库是由类库和函数库组成的集合c++标准库中定义的类和对象都位于std命名空间中c++标准库的头文件都不带.h后缀c++标准库涵盖了c库的功能c++标准库包含经典算法和数据结构的实现
2017-12-20 20:27:53
306
原创 复数类
复数类应该具有的操作 -运算:+,-,* , /比较:==,!=赋值:=求模:modulusc++ 规定赋值操作符(=)只能重载为成员函数操作符重载不能改变原操作符的优先级操作符重载不能改变原操作数的个数操作符重载不应改变操作符的原有语义操作符重载的本质为函数定义赋值操作符只能通过成员函数实现复数的概念可以通过自定义类实现复数中的运算操作可以通过操作符重载实现
2017-12-20 20:02:22
195
原创 操作符重载
c++中的重载能够扩展操作符的功能操作符的重载以函数的方式进行本质用特殊形式的函数扩展操作符的功能通过operator关键字可以定义特殊的函数operator的本质是通过函数重载操作符语法type operator sign(const type p1,const type p2){ type ret; return ret;}//sign为系统中预定义的操作符,如:
2017-12-18 22:44:03
202
原创 类中的函数重载
函数重载的本质为相互独立的不同函数c++中通过函数名和函数参数确定函数调用无法直接通过函数名得到重载函数的入口地址函数重载必然发生在同一个作用域中类中的成员函数可以进行重载构造函数的重载普通成员函数的重载静态成员函数的重载重载函数的本质为多个不同的函数函数名和参数列表是唯一的标识函数重载必须发生在同一个作用域中重载的意义通过函数名对函数功能进行提示通过参数列表对函数用法进行提示
2017-12-18 22:07:52
240
原创 友元
友元是c++中的一种关系友元关系发生在函数与类之间或者类与类之间友元关系是单向的,不能传递在类中以friend关键字声明友元类的友元可以是其他类或者具体函数友元不是类的一部分友元不受类中访问级别的限制友元可以直接访问具体类的所有成员class point{ double x; double y; friend void func(point& p);
2017-12-18 21:22:26
208
原创 二阶构造模式
构造函数 只提供自动初始化成员变量的机会不能保证初始化逻辑一定成功执行return语句后构造函数立即结束构造函数能决定的只是对象的初始状态,而不是对象的诞生半成品对象的概念初始化操作不能按照预期完成而得到的对象半成品对是合法的c++对象,也是bug的重要来源二阶构造工程开发中的构造过程可分为 资源无关的初始化操作 不可能出现异常情况的操作需要使用系统资源的操作 可能出现异常情况
2017-12-17 21:05:56
279
原创 类的静态成员函数
在c++中可以定义静态成员函数 静态成员函数是类中特殊的成员函数静态成员函数没有隐藏的this参数静态成员函数只能直接访问静态成员变量(函数)静态成员函数属于整个类所有可以通过类名直接访问公有静态成员函数可以通过对象名访问公有静态成员函数静态成员函数的定义 直接通过static关键字修饰成员函数class test{ public: static void
2017-12-17 14:40:12
326
原创 类的静态成员变量
在c++中可以定义静态成员变量 静态成员变量属于整个类所有静态成员变量的生命周期不依赖于任何对象可以通过类名直接访问公有静态成员变量所有对象共享类的静态成员变量可以通过对象名访问公有静态成员变量静态成员变量的特性 在定义时直接通过static关键字修饰静态成员变量需要在类外单独分配空间静态成员变量在程序内部位于全局数据区语法规则Type ClassName::VarName =
2017-12-17 14:05:26
149
原创 析构顺序,const修饰对象,
单个对象创建时构造函数的调用顺序 调用父类的构造过程调用成员变量的构造函数(调用顺序与声明顺序相同)调用类自身的构造函数析构函数与对应构造函数的调用顺序相反 多个对象析构时 析构顺序与构造顺序相反对于栈对象和全局对象,类似于入栈与出栈的顺序,最后构造的对象呗最先析构.堆对象的析构发生在使用delete的时候,与delete的使用顺序相关 ——————————————————————
2017-12-17 13:01:06
339
原创 临时对象
直接调用构造函数将产生一个临时对象临时对象的生命周期只有一条语句的时间临时对象的作用域只在一条语句中临时对象时C++中值得警惕的灰色地带临时对象是性能的瓶颈,也是bug的来源之一现代C++编译器会尽力避开临时对象实际工程开发中需要避开临时对象
2017-12-17 11:43:26
400
原创 对象的销毁
一般而言,需要销毁的对象都应该做清理解决方案 为每个类都提供一个public的free函数对象不再需要时立即调用free函数进行清理class test{ int* p; public: test(){p = new int; } void free(){delete p; };};存在问题 free只是一个普通的函数,必须显示的调用对
2017-12-17 11:16:30
189
原创 对象的构造顺序
对于局部对象 当程序执行流到达对象的定义语句时进行构造对于堆对象 当程序执行流到达new语句时创建对象使用new创建对象将自动触发构造函数的调用对于全局对象 对象的构造顺序是不确定的不同编译器使用不同的规则确定构造顺序
2017-12-17 10:41:49
108
原创 初始化列表
C++中提供了初始化列表对成员变量进行初始化 语法规则ClassName::ClassName(): m1(v1),m1(v1,v2),m3(v3) { //some other initialize operation }注意事项成员的初始化顺序与成员的声明顺序相同成员的初始化顺序与初始化列表中的位置无关初始化列表先构造函数的函数体执行类中的const成员会被
2017-12-16 21:44:16
94
原创 对象的构造3
两个特殊的构造函数 无参构造函数 没有参数的构造函数当类中没有定义构造函数时,编译器默认提供一个无参构造函数,并且其函数体为空拷贝构造函数 参数为const class_name&的构造函数当类中没有定义拷贝构造函数时,编译器默认提供一个拷贝构造函数,简单的进行成员变量的值复制。拷贝构造函数的意义 兼容C语言的初始化方式初始化行为能够符合预期的逻辑浅拷贝 拷贝后对象的物理状态相
2017-12-16 20:27:26
105
原创 构造函数
带有参数的构造函数 构造函数可以根据需要定义参数一个类中可以存在多个重载的构造函数构造函数的重载遵循c++重载的规则class test{public: test(int v) { //use v to initialize member }};构造函数的调用 一般情况下,构造函数在对象定义时被自动调用一些特殊情况下,需要手工调用构造函数
2017-12-15 22:11:21
104
原创 对象的构造1
对象的初始化 从程序设计的角度,对象只是变量,因此: 在栈上创建对象时,成员变量初始值为随机数在堆上创建对象时,成员变量初始值为随机值在静态存储区创建对象时,成员变量初始值为0一般而言,对象都需要一个确定的初始化状态解决方案 在类中提供一个public的initialize函数对象创建后立即调用initialize函数进行初始化构造函数 c++中可以定义与类名相同的特殊成员函数
2017-12-12 23:38:25
150
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人