C++快速入门
文章平均质量分 84
C++快
远近长安
璀璨星河,伴我同行。
展开
-
4.2 设计模式_桥接模式
最后,总结一下修改。我们将电脑类定义为了一个抽象类,它含有抽象部分——InstallOS函数。将操作系统类定义为了一个实现类,它包含实现部分——InstallOS_impl函数。它们之间通过一个指针impl建立了连接,抽象类会调用实现类中的实现函数InstallOS_impl,来实现操作系统的安装。而电脑类中仅提供了一个抽象的接口InstallOS,它不负责实现具体的功能。这样,以后不论实现类有做什么更改,抽象类都可以不需要变动。impl = implement(实现)...原创 2022-09-01 00:45:08 · 386 阅读 · 0 评论 -
4.1 设计模式_单例模式
就new Person。原创 2022-08-31 09:00:00 · 217 阅读 · 0 评论 -
3.10 C++高级编程_Android强弱指针的实现与使用
上节通过一个死锁的问题,引入了强弱指针的概念。本节来讨论Android强弱指针的实现与使用。原创 2022-08-30 09:00:00 · 651 阅读 · 0 评论 -
3.9 C++高级编程_Android弱指针的引入
修改代码,在Person类中增加两个sp类成员,father和son,并且增加两个成员函数setSon和setFather。修改测试函数,创建两个sp 对象father 和 son,它们就相当于开头描述的A和B。那么我们将无法释放A和B,因为A引用了B,B的引用计数会加1,同理A的引用计数也会加1。这样,当我们尝试释放A或B的时候,引用计数永远也不会为0,即A和B永远也不会释放。比如说有两个智能指针 A 和 B,它们互相引用,即A引用到B,B也引用到A。...原创 2022-08-27 17:11:41 · 667 阅读 · 0 评论 -
3.8 C++高级编程_Android轻量级指针
在上一节的代码中,我们定义了一个基类RefBase,在RefBase中定义了一个引用计数count,还有一些列count加1和减1操作。,一旦在操作的过程中被打断,且在打断过程中有别的进程对 count 值进行操作,那么就可能出现错误。上一节我们使用了一个智能指针的方法,来防止C++中由于申请的内存未释放引起的内存泄漏的问题。内存中的count值在经过A,B两个进程的引用后,应该为3,但是此时结果却为2。需要注意一点是,在之前的代码中,我们在sp类的析构函数中,执行delete操作。原创 2022-08-25 09:00:00 · 126 阅读 · 0 评论 -
3.7 C++高级编程_自己实现智能指针
先定义一个Person类,在Person类中定义一个构造函数,一个析构函数,一个普通的成员函数。然后编写一个测试函数test_func,从内存中申请了一块Person类大小的空间。最后,在main函数中调用test_func函数。这个代码有什么问题呢?我们编译执行一下,可以看到Person类的构造函数被调用了,但是,。也就是说,在程序运行退出后,没有将之前申请的内存释放掉,这时候,就发生了。......原创 2022-08-23 09:00:00 · 583 阅读 · 0 评论 -
3.6 C++高级编程_异常
假设有A,B,C三个函数,其中A调用了B,B调用了C(A > B > C)。如果C执行过程中出现异常,那么首先要将异常情况返回给B,然后由B再返回给A。在C++中,可以使用来处理这种情况。。修改代码,在函数C中抛出一个异常,异常值为1;对应的,在函数A中会捕捉这个异常,并且将异常值输出。编译测试,可以看到函数A成功捕捉到了函数C抛出的异常。.........原创 2022-08-15 08:00:00 · 147 阅读 · 0 评论 -
3.5 C++高级编程_类模板
对于代码相似的,我们可以使用。类似的,对于那些代码相似的,我们也可以使用。原创 2022-08-14 16:28:44 · 297 阅读 · 0 评论 -
3.4 C++高级编程_函数模板_重载
此时,在main函数中调用my_max函数,传参均为int型,发现调用的是第二个模板函数,也就是传参为非const类型的模板函数。修改代码,分别定义两个函数模板,它们名字相同,但是传入的参数类型不同,一个是const,一个是非const。此时,两个模板函数,一个普通函数,他们都可以匹配这个my_max,my_max会调用哪个函数呢?那么,为什么此时调用的是my_max函数?增加一个函数my_max,传参的类型为int类型的引用。我们可以重载函数,同样的,我们也可以。同时,他们的输出信息中的序号也不同。...原创 2022-08-14 13:19:37 · 656 阅读 · 0 评论 -
3.3 C++高级编程_函数模板_引入
在C++中,模板分为两种:本节主要讲解函数模板。所谓模板,就是为了节省代码,对于那些相似的代码,我们可以重复使用。假设我们要写一个比较两个 int 类型变量谁大的函数,那么可以这样写:比较两个 double 型:两个 float 型:可以看到,后面两个double和float的比较函数,其实都是对第一个函数的重载。这些函数这么相似,是否有什么办法可以简化代码,不用定义这么多函数呢?答:可以的,使用函数模板。函数模板的格式如下:代码如下,将输入参数的类型和返回值的类型都用T代替,同时使原创 2022-08-13 17:26:18 · 611 阅读 · 1 评论 -
3.2 C++高级编程_抽象类界面
通常,我们在头文件中声明类,然后在cpp文件中实现他们。原创 2022-08-11 19:37:14 · 489 阅读 · 0 评论 -
3.1 C++高级编程_抽象类_概念
virtual 函数声明时,后面加上 “=0”,例如virtual void eating(void) = 0;纯虚函数不需要定义,只需声明;抽象类:含有纯虚函数的类。抽象类不能实例化对象;若子类没有覆写完所有的纯虚函数,则子类还是抽象类;抽象类的作用:向下定义好框架,向上提供统一的接口。.........原创 2022-08-07 11:25:13 · 263 阅读 · 0 评论 -
2.5 C++面向对象编程_类型转换
格式将expression转换为type-id类型,但是运行时没有类型检查来保证转换的安全。1、用于类层次结构中,基类和子类之间指针或引用的转换;2、用于上行转换(子类转为基类)是安全的;3、用于下行转换(基类转为子类),由于没有动态类型转换,所以是不安全的;4、用于基本数据类型之间的转换,如把int转换成char,把int转换成enum;这种转换的安全性也要开发人员来保证;5、把void指针转换成目标类型的指针(不安全!!!)6、把任何类型的表达式转换成void类型。...原创 2022-08-02 09:00:00 · 214 阅读 · 0 评论 -
2.4 C++面向对象编程_多态
此时,Human类的内存占用变成了4,而Englishman和Chinese类都为8,因为Englishman和Chinese类除了自身的变量外还继承了Human类的变量。比如,如果没有申明virtual,那么在编译时就确定了test_eating函数中的h.eating调用的是Human类中的eating函数。调用关系如下,当使用虚函数时,是通过对应的虚函数表来映射到对应的虚函数代码上的。前面说了,在拥有虚函数的类中,会有一个指针指向对应的虚函数表,下面就来测试一下。......原创 2022-07-24 09:00:00 · 261 阅读 · 0 评论 -
2.3 C++面向对象编程_再论构造函数
一个派生类可以能有一个或多个基类,这些基类里面还可能是虚拟基类,并且类本身也有对象成员。然后,根据之前说的顺序原则,来推测一下构造函数调用的顺序。原创 2022-07-23 13:30:06 · 259 阅读 · 0 评论 -
2.2 C++面向对象编程_多重继承
一个派生类可以有多个基类;多个基类可能引入一个问题——二义性;解决二义性的方法——使用虚拟继承。虚基类使得多个类派生出的对象只继承一个基类对象,即Sofabed的基类Sofa,Bed共享一个Furniture对象。httpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttps。...原创 2022-07-22 09:00:00 · 275 阅读 · 0 评论 -
2.1 C++面向对象编程_访问控制和继承
本节来学习继承。原创 2022-07-21 09:00:00 · 336 阅读 · 0 评论 -
1.8 C++基础知识_运算符重载_成员函数
上一节重载的运算符都是在类外面实现,并且是类的友员,这节尝试在类里面实现运算符重载。原创 2022-07-18 12:00:00 · 171 阅读 · 0 评论 -
1.7 C++基础知识_运算符重载_类外函数
假设有下列代码,创建了三个变量a,b,c,其中c=a+b。事实上,c = a + b中的“+”也是一个函数,不过这个函数是由编译器实现的。在之前的point.cpp代码中,如果使用+将两个坐标相加,看看会有什么结果。直接使用+将两个坐标相加。 此时编译会报错,这是因为默认的+号是不支持两个坐标相加的。可以通过重载运算符将+号重载,让它支持坐标相加。首先,增加operator+函数。然后让它成为Point类的友员函数,这样就可以直接使用p1.x,p1.y,而不是通过getX这些函数获取坐标值。 最原创 2022-07-01 12:00:00 · 566 阅读 · 0 评论 -
1.6 C++基础知识_静态成员_友员
问:假设在main函数中创建了许多个Person类对象,要怎么在代码中统计一共创建了多少个Person类对象呢?答:可以使用静态成员,在Person类中创建一个静态成员cnt,在构造函数中,将cnt++。同时,由于cnt是private成员,需要在创建一个公共的成员函数getCnt来获取cnt,注意getCnt也需要是静态的。然后在main函数中调用getCnt函数,就可以获取cnt值了。注意一点,我们需要创建一个全局变量Person::cnt,否则,cnt实际上是不会存在的,因为只是在Person类的定义原创 2022-06-16 00:15:50 · 938 阅读 · 0 评论 -
1.5 C++基础知识_构造函数
之前都是先创建一个对象,然后调用类的成员函数对对象赋值。本节尝试使用析构函数,在创建变量的时候直接对变量赋值。所谓构造函数,就是跟类名相同和函数,需要注意的是,构造函数不可以指定返回值。如下图所示,在 Person 类中创建了三个构造函数,函数名与类相同,都是Person,区别在于函数的传参不同。然后创建类时,就可以调用构造函数。如下图所示,根据传入的参数,编译器会调用上图中第三个构造函数,这个函数中会给类的name成员和age成员赋值。增加一个对象per1,只传入name,那么per1应该调用第二个构造函原创 2022-06-15 12:00:00 · 521 阅读 · 0 评论 -
1.4 C++基础知识_重载_指针_引用
本节讨论重载,指针,引用。所谓重载,就是函数名相同,参数不同(类型,数量,顺序不同)。也就是说,C++允许多个函数拥有相同的函数名,通过函数参数来区分调用的是哪个函数。如下图所示,创建了两个名字相同,但是传入的参数类型不同的函数add_a_b。在main函数中调用add_a_b,首先传入的是int类型的参数,然后是char类型的参数,看看编译器是否可以区分调用的是哪个函数。执行结果如下,程序先进入了传入int类型的add_a_b函数,然后进入了传入char类型的add_a_b函数。也就是说,编译器通过传入的原创 2022-06-03 12:33:25 · 225 阅读 · 0 评论 -
1.3 C++基础知识_程序结构
本节讨论C++的程序结构。之前将函数在类中定义,现在首先将函数定义到类的外部,仅在类中申明。注意定义在外部的函数,函数名前面需要加上Person::,表示属于Person类,其他规则和在类中定义一致。当函数内容比较简短时,写在类中也可以,但是如果篇幅较大,最好还是在外部实现,这样代码会更简洁些。假设一个团队在做某个设备:那么,A需要创建两个文件:其中头文件 person.h 需要提供给B使用,person.cpp 则由A自行保管维护即可。B只需要实现一个文件 main.cpp 即可,在 main.cpp 文原创 2022-06-02 00:48:59 · 450 阅读 · 0 评论 -
1.2 C++基础知识_访问控制
在上一节中,我们编写了一个C++程序,创建了一个名字叫person的类。方便起见,我们将这个类的所有成员的权限设置为了public。#include <stdio.h> #define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) class person {//方便起见,类的成员都设置为了publicpublic: char *name; int age; void printfInfo() {原创 2022-05-31 01:14:34 · 246 阅读 · 6 评论 -
1.1 C++基础知识_c++类的引入
C语言(面向过程)已经这么强大,甚至于Linux都是由C语言编写的,我们为什么还要引入C++(面向对象)?假设有这样一个需求:写一个程序,输出张三、李四两个人的姓名、年龄C语言实现首先尝试用C语言实现,定义一个person结构体,在结构体中定义两个成员分别表示姓名和年龄。#include <stdio.h>#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))typedef struct person { char原创 2022-05-29 01:27:53 · 331 阅读 · 0 评论