
c++笔记
wt0617
这个作者很懒,什么都没留下…
展开
-
C++对象模型分析
class是一种特殊的struct在内存中class依旧可以看作变量的集合class与struct遵循相同的内存对齐规则class中的成员函数与成员变量时分开存放的 每个对象有独立的成员变量所有对象共享类中的成员函数运行时的对象退化为结构体的形式所有成员变量在内存中依次排布成员变量间可能存在内存间隙可以通过内存地址直接访问成员变量访问权限关键字在运行时失效类中的成员函数位原创 2018-01-20 19:50:50 · 145 阅读 · 0 评论 -
逗号操作符
逗号操作符(,)可以构成逗号表达式 - 逗号表达式用于将多个子表达式连接为一个表达式 - 逗号表达式的值为最后一个子表达式的值 - 逗号表达式中的前N-1个子表达式可以没有返回值 - 逗号表达式按照从左向右的顺序计算每个子表达式的值(i,j)= 6;//结果为j=6在C++中重载逗号操作符是合法的使用全局函数对逗号操作符进行重载重载函数的参数必须原创 2018-01-02 23:54:48 · 157 阅读 · 0 评论 -
操作符重载
c++中的重载能够扩展操作符的功能操作符的重载以函数的方式进行本质用特殊形式的函数扩展操作符的功能通过operator关键字可以定义特殊的函数operator的本质是通过函数重载操作符语法type operator sign(const type p1,const type p2){ type ret; return ret;}//sign为系统中预定义的操作符,如:原创 2017-12-18 22:44:03 · 208 阅读 · 0 评论 -
类中的函数重载
函数重载的本质为相互独立的不同函数c++中通过函数名和函数参数确定函数调用无法直接通过函数名得到重载函数的入口地址函数重载必然发生在同一个作用域中类中的成员函数可以进行重载构造函数的重载普通成员函数的重载静态成员函数的重载重载函数的本质为多个不同的函数函数名和参数列表是唯一的标识函数重载必须发生在同一个作用域中重载的意义通过函数名对函数功能进行提示通过参数列表对函数用法进行提示原创 2017-12-18 22:07:52 · 246 阅读 · 0 评论 -
友元
友元是c++中的一种关系友元关系发生在函数与类之间或者类与类之间友元关系是单向的,不能传递在类中以friend关键字声明友元类的友元可以是其他类或者具体函数友元不是类的一部分友元不受类中访问级别的限制友元可以直接访问具体类的所有成员class point{ double x; double y; friend void func(point& p);原创 2017-12-18 21:22:26 · 211 阅读 · 0 评论 -
逻辑操作符
逻辑运算符的原生语义操作数只有两种值(true和false)逻辑表达式不完全计算就能确定最终值最终结果只能是true或者false重载操作符会有陷阱问题的本质 C++通过函数调用扩展操作符的功能进入函数体前必须完成所有参数的计算函数参数的计算次序是不定的短路法则完全失效 逻辑操作符重载后无法完全实现原生的语义建议实际工程开发中避免重载逻辑操作符通过重载比较操作符代替逻辑操作符重载原创 2018-01-01 22:22:28 · 211 阅读 · 0 评论 -
智能指针
智能指针解决以下问题: - 内存泄漏 - 动态申请堆空间,用完后不归还 - C++语言中没有垃圾回收的机制 - 指针无法控制所指堆空间的生命周期智能指针要求 - 我们需要一个特殊的指针 - 指针生命周期结束时主动释放堆空间 - 一片堆空间最多只能由一个指针标识 - 杜绝指针运算和指针比较解决方案 - 重载指针特征操作符(->和*) - 只能通过类的原创 2018-01-01 21:46:06 · 128 阅读 · 0 评论 -
创建类
编译器默认提供的函数class test{};等价于,编译器会默认提供以下函数class test{ public: test(); test(const test&); test& oprator = (const test&); ~test();};原创 2018-01-01 15:55:56 · 162 阅读 · 0 评论 -
默认重载赋值操作符
编译器为每个类默认重载了赋值操作符默认的赋值操作符仅完成浅拷贝当需要进行深拷贝时必须重载赋值操作符赋值操作符与拷贝构造函数有相同的存在意义重载复制操作符,必然需要实现深拷贝原创 2018-01-01 15:49:56 · 488 阅读 · 0 评论 -
二阶构造模式
构造函数 只提供自动初始化成员变量的机会不能保证初始化逻辑一定成功执行return语句后构造函数立即结束构造函数能决定的只是对象的初始状态,而不是对象的诞生半成品对象的概念初始化操作不能按照预期完成而得到的对象半成品对是合法的c++对象,也是bug的重要来源二阶构造工程开发中的构造过程可分为 资源无关的初始化操作 不可能出现异常情况的操作需要使用系统资源的操作 可能出现异常情况原创 2017-12-17 21:05:56 · 284 阅读 · 0 评论 -
类的静态成员函数
在c++中可以定义静态成员函数 静态成员函数是类中特殊的成员函数静态成员函数没有隐藏的this参数静态成员函数只能直接访问静态成员变量(函数)静态成员函数属于整个类所有可以通过类名直接访问公有静态成员函数可以通过对象名访问公有静态成员函数静态成员函数的定义 直接通过static关键字修饰成员函数class test{ public: static void原创 2017-12-17 14:40:12 · 333 阅读 · 0 评论 -
类类型的转换
C++类中可以定义类型转换函数类型转换函数用于将类对象转换为其他类型语法规则:operator Type () { Type ret; //... return ret; }类型转换函数- 与转换构造函数具有同等的地位- 使得编译器有能力将对象转化为其他类型- 编译器能够隐式的使用类型转换函数- 无法抑制隐式的类型转换函数调用- 类型转原创 2018-01-13 10:47:02 · 552 阅读 · 0 评论 -
继承的概念和意义
组合关系的特点-将其他类的对象作为当前类的成员使用- 当前类的对象与成员对象的生命周期相同-成员对象在用法上与普通对象完全一致面向对象中的继承子类之间的父子关系- 子类拥有父类的所有属性和行为- 子类就是一种特殊的父类- 子类对象可以当做父类对象使用- 子类中可以添加父类没有的方法和属性class Parent{ int mv;public:void met原创 2018-01-13 11:42:17 · 2841 阅读 · 0 评论 -
继承中的访问级别
面向对象中的访问级别不只是public和private可以定义protected访问级别关键字protected的意义- 修饰的成员不能被外界直接访问- 修饰的成员可以被子类直接访问- protected使得子类能够访问父类成员- 没有protected关键字就无法实现真正意义上的代码复用- protected关键字是为了继承而专门设计的原创 2018-01-14 12:49:57 · 224 阅读 · 0 评论 -
多态的概念和意义
函数重写父类中被重写的函数依然会继承给子类子类中重写的函数将覆盖父类中的函数通过作用域分辨符(::)可以访问到父类中的函数函数重写只可能发生在父类与子类之间面向对象中的多态的概念根据实际的对象类型决定函数调用的具体目标同样的调用语句在实际运行时有多种不同的表现形态C++语言直接支持多态的概念通过使用virtual关键字对多态进行支持被virtual声明的函数被重写后具有多原创 2018-01-17 21:35:52 · 304 阅读 · 0 评论 -
数据类型转换函数
构造函数可以定义不同类型的参数参数满足下列条件时称为转换构造函数 - 有且仅有一个参数- 参数是基本类型- 参数是其他类类型 编译器尽力尝试的结果是隐式类型转换隐式类型转换- 会让程序以意想不到的方式进行工作- 是工程中bug的重要来源工程中通过explicit关键字杜绝编译器的转换尝试转换构造函数被explicit修饰时只能进行显示转换- 转换原创 2018-01-08 22:58:40 · 318 阅读 · 0 评论 -
c++中的抽象类和接口
面向对象中的抽象类可用于表示现实世界中的抽象概念是一种只能定义类型,而不能产生对象的类只能被继承并重写相关函数直接特征是相关函数没有完整的实现c++语言中没有抽象类的概念C++中通过纯虚函数实现抽象类纯虚函数是指只定义原型的成员函数一个C++类中存在纯纯虚函数就成了抽象类纯虚函数的语法规则class Shape{ public: virtual原创 2018-01-31 21:32:08 · 1313 阅读 · 0 评论 -
同名覆盖引发的问题
子类对象可以当作父类对象使用(兼容性)子类对象可以直接赋值给父类对象子类对象可以直接初始化父类对象父类指针可以直接指向子类对象父类引用可以直接引用子类对象当使用父类指针(引用)指向子类对象时子类对象退化为父类对象只能访问父类中定义的成员可以直接访问被子类覆盖的同名成员特殊的同名函数子类中可以重定义父类中已经存在的成员函数这种重定义发生在继承中,叫做函数重写函数重写是同原创 2018-01-16 21:53:22 · 377 阅读 · 0 评论 -
子类与父类的冲突
子类和父类同名的处理方法 子类可以定义父类中的同名成员子类中的成员将隐藏父类中的同名成员父类中的同名成员依然存在于子类中通过作用域分辨符(::)访问父类中的同名成员Child c;c.mi = 100; //子类中的mic.Parent::mi = 1000; //父类中的mi子类中定义的函数是否能够重载父类中的同名函数? 子类中的函数将隐藏原创 2018-01-16 20:32:29 · 593 阅读 · 0 评论 -
继承中的构造与析构
父类构造函数在子类中的调用方式 默认调用 适用于无参构造函数和使用默认参数的构造函数显示调用 通过初始化列表进行调用适用于所有父类构造函数父类构造函数的调用class Child : public Parent{public: Child() //隐式调用 { cout "Child()" << endl; } child原创 2018-01-15 20:37:28 · 384 阅读 · 0 评论 -
前置操作符和后置操作符
现代编译器产品会对代码进行优化优化使得最终的二进制程序更加高效优化后的二进制程序丢失了C/C++的原生语义不可能从编译后的二进制程序还原C/C++程序++操作符可以被重载全局函数和成员函数均可进行重载重载前置++操作符不需要额外的参数重载后置++操作符需要一个int类型的占位符//前置++test& operator ++ (){ ++mvalue(); retur原创 2018-01-05 22:40:00 · 241 阅读 · 0 评论 -
继承、多态对象模型
在c++编译器的内部类可以理解为结构体子类是由父类成员叠加子类新成员得到的c++多态的实现原理当类中声明虚函数时,编译器会在类中生成一个虚函数表虚函数表是一个存储成员函数地址的数据结构虚函数表是由编译器自动生成与维护的virtual成员函数会被编译器放入虚函数表中存在虚函数时,每个对象都有一个指向虚函数表的指针虚函数效率低于普通成员函数原创 2018-01-22 20:59:53 · 167 阅读 · 0 评论 -
不同的继承方式
class parent{};class child : pulic parent //":"表示继承关系,parent表示被继承的类,public表示**继承方式**{};C++中支持三种不同的继承方式 public继承 父类成员在子类中保持原有访问级别private继承 父类成员在子类中变为私有成员protected继承 父类中的公有成员变成为保护成员,其他成员保持原创 2018-01-14 13:32:47 · 175 阅读 · 0 评论 -
类的静态成员变量
在c++中可以定义静态成员变量 静态成员变量属于整个类所有静态成员变量的生命周期不依赖于任何对象可以通过类名直接访问公有静态成员变量所有对象共享类的静态成员变量可以通过对象名访问公有静态成员变量静态成员变量的特性 在定义时直接通过static关键字修饰静态成员变量需要在类外单独分配空间静态成员变量在程序内部位于全局数据区语法规则Type ClassName::VarName =原创 2017-12-17 14:05:26 · 152 阅读 · 0 评论 -
析构顺序,const修饰对象,
单个对象创建时构造函数的调用顺序 调用父类的构造过程调用成员变量的构造函数(调用顺序与声明顺序相同)调用类自身的构造函数析构函数与对应构造函数的调用顺序相反 多个对象析构时 析构顺序与构造顺序相反对于栈对象和全局对象,类似于入栈与出栈的顺序,最后构造的对象呗最先析构.堆对象的析构发生在使用delete的时候,与delete的使用顺序相关 ——————————————————————原创 2017-12-17 13:01:06 · 341 阅读 · 0 评论 -
函数参数
C++中可以在函数声明时为参数提供一个默认值当函数调用时没有提供参数的值,则使用默认值参数的默认值必须在函数声明中指出函数默认参数的规则 参数的默认值必须从左向右提供 函数调用时使用了默认值,则后续参数必须使用默认值在C++中可以为函数提供占位参数 占位参数只有在参数类型声明,而没有参数声明 一般情况下,在函数体内部无法使用占位参数int func(int x,int){原创 2017-12-05 22:30:28 · 131 阅读 · 0 评论 -
内联函数
C++中推荐使用内联函数替代宏代码片段C++中使用inline关键字声明内联函数inline int func(int a,int b){ return a < b ? a : b;}内联函数声明时inline关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求C++编译器可以将一个函数进行内联编译被C++编译器内联编译的函数叫做内联函数C++编译器直接将函数体插入函数原创 2017-12-05 21:58:30 · 378 阅读 · 0 评论 -
布尔类型、引用
C++在C语言的基本类型系统之上增加了boolC++中的bool可取的值只有true和false理论上只占用一个字节bool类型只有true(非0)和false(0)两个值C++编译器会将非0值转换为true,0值转换为falseC++中的三目运算符可直接返回变量本身 -既可作为右值使用,又可作为左值使用 -三目运算符可能返回的值中如果有一个常量值,则不能作为左值使用引用在C++中新增原创 2017-12-05 21:13:33 · 441 阅读 · 0 评论 -
C++ const
C++在c的基础上对const进行了进化处理 -当碰见const声明在符号表中放入常量 -编译过程中若发现使用常量则直接以符号表中的值替换 -编译过程中若发现下述情况则给对应的常量分配存储空间 — 对const常量使用了extern — 对const常量使用了&操作符 c++编译器虽然可能为const常量分配空间,但不会使用其存储空间的值原创 2017-12-05 19:57:28 · 124 阅读 · 0 评论 -
C到C++
C++所有变量都可以在需要使用时再定义register关键字请求编译器将局部变量存储于寄存器 -在c++中依然支持register -可以取得register变量地址 -c++编译器有自己的优化方式C++中,不允许定义多个同名的全局变量C语言中struct定义了一组变量的集合,并不是一种新的类型 C++中的struct用于定义一个全新的类型C++中所有的标识符都必须显示的声明类型原创 2017-12-05 19:42:13 · 206 阅读 · 0 评论 -
c++字符串类
应用开发中大多数的情况都在进行字符串处理从c到c++的进化引入了自定义类型在c++中通过类完成字符串类型的定义c++语言中没有原生的字符串类型c++标准库提供了string类型string直接支持字符串连接string直接支持字符串的大小比较string直接支持子串查找和提取string直接支持字符串的插入和替换字符串与数字的转换标准库提供了相关的类对字符串和数字进行转换字符串类(原创 2017-12-21 20:15:48 · 396 阅读 · 0 评论 -
对象的构造1
对象的初始化 从程序设计的角度,对象只是变量,因此: 在栈上创建对象时,成员变量初始值为随机数在堆上创建对象时,成员变量初始值为随机值在静态存储区创建对象时,成员变量初始值为0一般而言,对象都需要一个确定的初始化状态解决方案 在类中提供一个public的initialize函数对象创建后立即调用initialize函数进行初始化构造函数 c++中可以定义与类名相同的特殊成员函数原创 2017-12-12 23:38:25 · 154 阅读 · 0 评论 -
c++标准库
c++标准库并不是c++语言的一部分c++标准库是由类库和函数库组成的集合c++标准库中定义的类和对象都位于std命名空间中c++标准库的头文件都不带.h后缀c++标准库涵盖了c库的功能c++标准库包含经典算法和数据结构的实现原创 2017-12-20 20:27:53 · 311 阅读 · 0 评论 -
复数类
复数类应该具有的操作 -运算:+,-,* , /比较:==,!=赋值:=求模:modulusc++ 规定赋值操作符(=)只能重载为成员函数操作符重载不能改变原操作符的优先级操作符重载不能改变原操作数的个数操作符重载不应改变操作符的原有语义操作符重载的本质为函数定义赋值操作符只能通过成员函数实现复数的概念可以通过自定义类实现复数中的运算操作可以通过操作符重载实现原创 2017-12-20 20:02:22 · 201 阅读 · 0 评论 -
类
在用struct定义类时,所有成员的默认访问级别为public在用class定义时,所有成员的默认访问级别为privateC++中的类支持声明和实现的分离将类的实现和定义分开 .h头文件中只有类的声明 成员变量和成员函数的声明.cpp源文件中完成的其他实现 成员函数的具体实现原创 2017-12-11 22:13:05 · 112 阅读 · 0 评论 -
函数重载
函数重载(function Overload) 用同一个函数名定义不同的函数 当函数名和不同的参数搭配时函数的含义不同函数重载至少满足下面的一个条件: 参数个数不同 参数类型不同 参数顺序不同编译器调用重载函数的准则 将所有同名函数作为候选者 尝试寻找可行的候选函数 -精确匹配实参 -通过默认参数能够匹配实参 -通过默认类型转换匹配实参 匹配失败 -最终寻找到的候选函数不原创 2017-12-06 20:47:50 · 129 阅读 · 0 评论 -
C++动态内存分配
动态内存分配 C++中通过new关键字进行动态内存申请 C++中的动态内存申请是基于类型进行的 delete关键字用于内存释放//申请变量type* pointer = new type;//...delete pointer;//数组申请type*pointer = new type[N];//...delete[] pointer;new和malloc的区别new关键字是C原创 2017-12-06 21:29:07 · 140 阅读 · 0 评论 -
C++中的命名空间
在C语言中只有一个全局作用域 C语言中所有的全局标识符共享同一个作用域 标识符之间可能发生冲突C++中提出了命名空间的概念 命名空间将全局作用域分成不同的部分 不同命名空间中的标识符可以同名而不会发生冲突 命名空间可以相互嵌套 全局作用域也叫默认命名空间namespace Name{ namespace internal //嵌套的 { //..原创 2017-12-06 21:41:42 · 161 阅读 · 0 评论 -
临时对象
直接调用构造函数将产生一个临时对象临时对象的生命周期只有一条语句的时间临时对象的作用域只在一条语句中临时对象时C++中值得警惕的灰色地带临时对象是性能的瓶颈,也是bug的来源之一现代C++编译器会尽力避开临时对象实际工程开发中需要避开临时对象原创 2017-12-17 11:43:26 · 404 阅读 · 0 评论 -
对象的销毁
一般而言,需要销毁的对象都应该做清理解决方案 为每个类都提供一个public的free函数对象不再需要时立即调用free函数进行清理class test{ int* p; public: test(){p = new int; } void free(){delete p; };};存在问题 free只是一个普通的函数,必须显示的调用对原创 2017-12-17 11:16:30 · 193 阅读 · 0 评论