C++基础
夏目知秋
当云笔记用吧 用U盘存太麻烦了
展开
-
何为智能指针以及QT中的智能指针
*强指针和弱指针:**以上问题引出了强指针和弱指针的概念。**环形引用问题:**但是若对象A与对象B相互引用,想要删除这两个对象时会出现问题,删除A的时候发现被B引用无法删除,删除B的时候发现被A引用无法删除。**目的:**对于指针的使用中有两个导致软件崩溃的问题,一是忘记释放动态申请的内存,二是指针指向的内存被释放,为了解决这个问题,出现了智能指针。特性:强指针,引用计数型的智能指针,可以被自由地拷贝和赋值,在任意的地方共享它,当没有代码使用(引用计数为0)它时才删除指向的对象。原创 2022-11-22 13:54:33 · 653 阅读 · 0 评论 -
友元函数与友元类
一个类需要调用另一个类的时候,我们经常会使用友元类和友元函数。原创 2022-11-15 15:51:29 · 252 阅读 · 0 评论 -
头文件相互包含问题
主要问题就是Computer里包含了Keyboard类的对象,而Keyboard类中又包含有一个Computer指针(因为Keyboard类中的BtnSleep方法要使用到Computer类中的某些功能),所以两个头文件直接相互包含,而相互包含是编译器所不允许的。为了解决这个问题,我们引出了前向声明这个概念原创 2022-11-15 15:27:18 · 849 阅读 · 0 评论 -
从关注公众号讲到观察者模式
观察者模式类似于公众号推送,你接收到推送的前提是你关注了公众号,关注完成后公众号就得到了你的联系方式(和你在网站注册完老是给你发垃圾短信一个道理),你关注了以后就给你发各种推送,而且是点对点发送,群发,肆无忌惮的发,想要停止接收只能是取消关注。接下来就有请受害者://观察者类class Observer{public: virtual void Update(int) = 0;};//观察者1class TureObserver1 :public Observer{public:原创 2020-11-30 16:47:33 · 260 阅读 · 0 评论 -
什么时候需要初始化列表?
在刚接触QT的时候我们都会看到自动生成的主界面构造函数如下:MainWidget::MainWidget(QWidget *parent) : QWidget(parent), ui(new Ui::MainWidget){}这边使用的就是初始化列表,初始化列表主要用于以下几种情况:第一种:类B中包含另一个类A的对象a,但是类A的构造函数含有参数例如A(int x),那么当类B初始化时,若没有初始化列表,无法正常初始化B,正确做法是将B的构造函数写为B():a(x)。代码如原创 2020-11-27 13:55:35 · 1829 阅读 · 1 评论 -
拷贝构造函数与深浅拷贝以及赋值表达式的关系
在C++中,下面三种对象需要拷贝的情况。因此,拷贝构造函数将会被调用。1). 一个对象以值传递的方式传入函数体2). 一个对象以值传递的方式从函数返回3). 一个对象需要通过另外一个对象进行初始化搜索拷贝构造函数与赋值运算的行为相似,用一个已存在的对象去构造一个不存在的对象(构造之前不存在),就是拷贝构造。用一个已存在的对象去覆盖另一个已存在的对象,就是赋值运算,见如下例子。using ...原创 2019-03-03 15:37:56 · 303 阅读 · 0 评论 -
继承中的二义性问题
一、调用不同基类的同名成员时可能出现二义性class A{ public: void setA(int a); int get(); private: int a;} ;class B{ public: void setB(int b); int get(); private:...转载 2019-03-15 09:42:33 · 1938 阅读 · 0 评论 -
父类指针指向子类对象问题
子类与父类指针调用相关注意事项1,如果以一个基础类指针指向一个衍生类对象(派生类对象),那么经由该指针只能访问基础类定义的函数(静态联翩)2,如果以一个衍生类指针指向一个基础类对象,必须先做强制转型动作(explicit cast),这种做法很危险,也不符合生活习惯,在程序设计上也会给程序员带来困扰。(一般不会这么去定义)3,如果基础类和衍生类定义了相同名称的成员函数,那么通过对象指针调用成...原创 2019-03-15 10:06:58 · 657 阅读 · 0 评论 -
指针p++,*p++,(*p)++,*(p++)的区别
p是一个指针,p++,*p++,(*p)++,*(p++)这四个加到底是加在地址上还是加在值上呢?直接上测试代码我们看:int buf1[5] = { 0, 2, 4, 6, 8 };int buf2[5] = { 0, 2, 4, 6, 8 };int buf3[5] = { 0, 2, 4, 6, 8 };int buf4[5] = { 0, 2, 4, 6, 8 };int *p1...原创 2019-06-17 10:17:30 · 6644 阅读 · 0 评论 -
C/C++分配内存的那些事
首先需要知道,编译器将内存分为三部分:静态存储区域、栈、堆。静态存储区:主要保存全局变量和静态变量。栈:调用函数相关的变量、地址等,底层对栈提供支持。堆:存储动态生成的变量,操作由C/C++函数库提供,效率低于栈。一个例子:ClassName *object=new ClassName(param);delete object;通常我们新建一个对象用的都是new,这个时候系统会调用...原创 2018-12-28 10:32:54 · 267 阅读 · 0 评论 -
从long、short与int的长度说到编译器数据模型
以下以VC++的编译器为例:short是short int 的简称,而long是long int的简称。在16位系统中(只有16位编译器):int、short型数据占2个字节(16位);long型数据占4个字节(32位)。int、short可以表示的的最大范围是:-32768<---->32767long 可以表示的最大范围是:-2147483648<原创 2019-01-04 10:19:36 · 1191 阅读 · 0 评论 -
关于编译器的字节对齐 (转)
现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。一.对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在...转载 2019-01-02 08:42:36 · 3269 阅读 · 0 评论 -
C#与C++遍历一维数组二维数组的几种方法
C#中一维数组与二维数组遍历方式: string[] arr =new string[4] { "first", "second", "third", "fourth" }; string[,] arr2 = { { "first", "second" }, { "third", "fourth" } };原创 2019-01-07 16:46:49 · 2310 阅读 · 0 评论 -
何为接口、为什么使用接口、接口的C++与C#实现(顺带提一下C++中的override与final保留字)
何为接口:接口为一个特殊的类,其中只包含有方法、属性、索引器和事件的声明,但并没有其实现,若一个类实现了某个接口,则必须在类中包含接口中所有方法的实现代码。为什么使用接口:有看官可能要问了,这玩意只是声明了一下有啥用,我为什么不直接用类?那么,举一个例子(C#代码):现在有一个类名为car,car中包含了一个Weight方法打印最大速度:class car { public v...原创 2019-01-09 14:10:20 · 660 阅读 · 0 评论 -
继承相关关键字Virtual、Abstract、override、Interface、final、Sealed全解析
因为需要经常切换C++/C#平台编程,一次性解析下这些关键字吧,写多了容易混。。。首先呢这些关键字不是两个平台都有的,具体如下:VirtualAbstractoverridefinalInterfaceSealedC#√√√×√√C++√×√√××**Virtual与override、final、Sealed **C#:1....原创 2019-01-09 17:12:00 · 631 阅读 · 0 评论 -
C++单例模式的一种实现
通常来说,C++中的类中不允许创建自身的实例,这样会出现递归创建的问题,有一种方式例外,就是创建一个静态的实例,此时只申请了一次内存,我们可以使用这个方法实现单例模式,下面举一个例子来说明效果。在.h文件中首先创建了两个类,第一个类plus有一个重载一次的函数,实现的是很简单的加法,第二个BirthWithObject类中含有一个带创建实例的本类静态指针*IMObject(),构造函数中生成了两...原创 2018-12-22 13:47:39 · 248 阅读 · 0 评论