随笔分类 -  C++

摘要:1)C++允许内置数据类型之间进行隐式转换,比如char转int,int转double,对于内置数据类型的转换有详细的规则,但不管怎么样,这些都是语言提供的,相对安全,而且我们无法更改对于自定义类的类型,其隐式类型可以通过带单一自变量的构造函数和隐式类型转换操作符来实现2)单一自变量构造函数:指能够以单一自变量成功调用的构造函数,该构造函数可能只有一个参数,也可能有多个参数,并且除了第一个参数外其... 阅读全文
posted @ 2019-10-29 15:28 西*风 阅读(248) 评论(0) 推荐(1) 编辑
摘要:1)default constructor:在没有任何外来信息的情况下将对象初始化2)但是有些对象如果没有外来信息,就没有办法完成初始化动作,那么这些对象,就没有必要提供default constructor3)如果一个类缺乏default constructor,那么使用这个类的时候会存在一定的限制限制1:产生数组的时候,没有任何一个方法可以为数组中的对象指定constructor自变量。Equ... 阅读全文
posted @ 2019-10-29 10:13 西*风 阅读(340) 评论(0) 推荐(0) 编辑
摘要:1.在数组与多态混用的情况下,数组元素的访问会出现不可预期的结果(因为数组元素的访问会使用到下标运算)将一个子类对象数组传递给一个父类对象数组声明的函数,编译器会允许这个行为,但是由于子类对象和父类对象的内存结构不同,会导致运行结果异常,因为在这种情况下,编译器仍然假设每一个元素的大小是父类对象元素的大小,但此时实际上每一个元素的大小是子类对象元素的大小#includeusing namespac... 阅读全文
posted @ 2019-10-27 15:51 西*风 阅读(262) 评论(0) 推荐(0) 编辑
摘要:VS中的程序有两种编译模式:Debug模式和Release模式。Debug通常称为调试版本,通过一系列编译选项的配合,编译结果通常包含调试信息,而且不做任何优化,以为开发人员提供强大的应用程序调试能力。Release通常称为发布版本,是为用户使用的,一般客户不允许在发布版本上进行调试,所以不保存调试信息,同时它往往进行了各种优化,以期达到代码最小和速度最优,为用户的使用提供便利。Debug程序通常... 阅读全文
posted @ 2019-10-18 10:24 西*风 阅读(2352) 评论(0) 推荐(0) 编辑
摘要:C的转型方式存在以下两个缺点:1)几乎允许你将任何类型转化为任何类型,不能精确的指明转型意图,这样很不安全如将一个pointer-to-base-class-object转型为一个pointer-to-derived-class-object(改变一个对象的类型)和将一个pointer-to-const-object转型为一个pointer-to-non-const-object(改变对象的常量性... 阅读全文
posted @ 2019-10-17 18:27 西*风 阅读(228) 评论(0) 推荐(0) 编辑
摘要:1)操作符的差别 指针使用“*”和“->”操作符,而引用使用“.”操作符2)初始化的差别 有空指针,但是没有空引用,和const对象一样,引用一旦定义就必须和对象绑定(当然char* pc=0;char& rc=*pc;也合法但无意义)由此造成的影响: 2.1)对于指针的向下转型,如果失败则返回空指针,但由于没有空引用的说法,所以对于引用的向下转型如果失败则会抛异常 2.2)由于引用不能为... 阅读全文
posted @ 2019-10-17 10:42 西*风 阅读(182) 评论(0) 推荐(0) 编辑
摘要:一.vector1.概述动态数组,在内存中具有连续的储存空间,在堆上分配内存,支持快速随机访问,在中间插入和删除慢,但在末尾插入和删除快2.特点1)拥有一段连续的内存空间,并且起始地址不变,因此能非常好的支持随机存取,但由于其内存空间是连续的,所以在中间插入和删除会造成内存块的拷贝,另外,当该数组的内存空间不够时,需要重新申请一块足够大的内存并进行内存拷贝,这些都大大的影响了vector的效率2)... 阅读全文
posted @ 2019-10-08 16:46 西*风 阅读(7330) 评论(0) 推荐(6) 编辑
摘要:一.静态库和动态库的定义及区别程序编译的四个过程:1.预处理 展开头文件/宏替换/去掉注释/条件编译(.i后缀)2.编译 检查语法,生成汇编(.s后缀)3.汇编 汇编代码转换成机器代码(.o后缀)4.链接 链接到一起生成可执行程序(.out后缀)静态库:静态库是在链接阶段被链接的,所以生成的可执行文件就不受库的影响,即使库被删除,程序依然可以成功运行动态库:动态库是在程序执行时... 阅读全文
posted @ 2019-10-08 10:53 西*风 阅读(223) 评论(0) 推荐(0) 编辑
摘要:正面回答:当基类的析构函数不是虚函数,并且基类指针指向一个派生类对象,然后通过基类指针来删除这个派生类对象时,如果基类的析构函数不是虚析构函数,那么派生类的析构函数就不会被调用,从而产生内存泄漏#include#includeusing namespace std;class A{public: A() { cout#includeusing namespace std;... 阅读全文
posted @ 2019-09-30 16:46 西*风 阅读(239) 评论(0) 推荐(0) 编辑
摘要:1)const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间void f1(){ const int x=1; cout<<x<<endl;}void f2(){ static int y=2; cout<<y<<endl; y++;}int main(){ f1();//1 f1();//1 co... 阅读全文
posted @ 2019-09-29 16:52 西*风 阅读(891) 评论(0) 推荐(0) 编辑
摘要:一.宏定义:# define 1.为什么要使用宏? 因为调用宏比调用函数更有效率,函数的调用必须要将程序的执行顺序转移到函数所存放的内存地址中,将函数程序内容执行完后,再返回到执行该函数前的地方,这种转移操作要求执行前要保存现场并记忆执行地址,转回后要恢复现场,并按原来保存的地址继续执行,因此,函数 阅读全文
posted @ 2019-09-29 10:57 西*风 阅读(2558) 评论(0) 推荐(1) 编辑
摘要:一个指针在32位操作系统上,占4个字节一个指针在64位操作系统上,占8个字节但是,编译器为了兼容32位操作系统和64位操作系统,所以指针都是4个字节长度为什么呢?在计算机中,CPU不能直接与硬盘进行数据交换,CPU只能直接跟内存进行数据交换,而CPU是通过数据总线,地址总线,控制总线这三条总线和内存进行数据传输与操作假设我们想通过CPU在内存中寻找一个数字x,首先CPU要通过地址总线,在内存中找到... 阅读全文
posted @ 2019-09-29 09:37 西*风 阅读(4332) 评论(0) 推荐(2) 编辑
摘要:一.什么是虚函数?虚函数是在类中由virtual关键字声明的成员函数,并且每一个含有虚函数的类都至少有一个与之对应的虚函数表,其中存放着该类所有虚函数对应的函数指针在基类中进行如下定义:virtual void show() //由于有virtual修饰所以是虚函数void show()//虽然和前面声明的show虚函数同名,但不是虚函数B的虚函数表中存放着B::foo和B::bar两个函数指针。... 阅读全文
posted @ 2019-09-28 16:29 西*风 阅读(1199) 评论(1) 推荐(0) 编辑
摘要:引文:C++对指针的管理提供了两种解决问题的思路:1.不允许多个对象管理一个指针2.允许多个对象管理一个指针,但仅当管理这个指针的最后一个对象析构时才调用deleteps:这两种思路的共同点就是只允许delete一次,下面将讨论的shared_ptr就是采用思路1实现的ps:智能指针不是指针,而是类,可以实例化为一个对象,来管理裸指针1.shared_ptr的实现原理:shared_ptr最本质的... 阅读全文
posted @ 2019-09-21 16:23 西*风 阅读(1987) 评论(0) 推荐(0) 编辑
摘要:1.scoped_ptr的实现原理及特性特性:scoped_ptr和auto_ptr类似,但最大的区别就是不能转让管理权限,也就是说scoped_ptr禁止用户进行拷贝和赋值实现原理:如何才能禁止一个类进行拷贝和复制呢?我们只需要将类的拷贝构造函数和赋值运算符重载的访问限定符设置为私有的可以样例如下:class ScopedPtr{private: ScopedPtr(const Scope... 阅读全文
posted @ 2019-09-18 17:34 西*风 阅读(671) 评论(0) 推荐(0) 编辑
摘要:背景介绍: RAll机制 定义一个类来封装资源的分配和释放,在构造函数中完成资源的分配和初始化,在析构函数中完成资源的清理,从而保证资源的正确初始化和清理ps:智能指针就是RAll机制的一种应用,智能指针从根本上来说是一个对象1.auto_ptr是什么?auto_ptr是C++标准库提供的类模板,auto_ptr对象通过初始化指向由new创建的动态内存,它是这块内存的拥有者,一块内存不能同时被... 阅读全文
posted @ 2019-09-18 11:34 西*风 阅读(1640) 评论(0) 推荐(0) 编辑
摘要:菱形继承问题样例:#include using namespace std;class A{ public: int x=4; virtual int getx() { return x; }};class B:public A{};class C:public A{};class D:public B,public C{};int main(){ ... 阅读全文
posted @ 2019-09-17 20:21 西*风 阅读(573) 评论(0) 推荐(0) 编辑
摘要:C++目前使用的对象模型: 此模型下,nonstatic数据成员被置于每一个类的对象中,而static数据成员则被置于类对象之外,static和nonstatic函数也都放在类对象之外(通过函数指针指向),而对于virtual函数,则通过虚函数表+虚函数指针来支持: 1)每个类生成一个表格,称为虚表 阅读全文
posted @ 2019-09-17 20:09 西*风 阅读(756) 评论(0) 推荐(0) 编辑
摘要:继承:通过扩展已有的类来获得新功能的代码重用方法组合:新类由现有类的对象合并而成的类的构造方式何时用继承?何时用组合?1.如果二者间存在一个“是”的关系,并且一个类要对另外一个类公开所有接口,那么继承是更好的选择2.如果二者间存在一个“有”的关系,那么首选组合ps:没有找到极其强烈无法辩驳的使用继承的利用的时候,一律采用组合组合体现为现实层面,继承主要体现在扩展方面如果并不是需要一个类的所有东西(... 阅读全文
posted @ 2019-09-17 15:18 西*风 阅读(1488) 评论(0) 推荐(0) 编辑
摘要:static关键字的用法: 1)将全局变量修饰为静态全局变量 存储在静态存储区,整个程序运行期间一直存在 静态全局变量在声明它的文件之外是不可见的,只要声明它的文件可见,而普通的全局变量则是所有文件可见 2)将局部变量修饰为静态局部变量 存储在静态存储区 作用域仍为局部作用域,但是当局部变量离开作用 阅读全文
posted @ 2019-09-17 11:21 西*风 阅读(1639) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示