自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(46)
  • 收藏
  • 关注

原创 十二种设计模式

作用:面向对象高内聚(Cohesion)和低耦合(Coupling)。因此,无论是封装、继承、多态还是设计模式都是为了这两个目标在努力。设计模式体现的是一种思想,而思想是指导行为的一切,设计模式可以指导程序员设计和开发。​。

2024-02-21 23:14:33 882

原创 C++数据结构与算法(绪论)

数据类型与定义在数据结构上的操作密切相关。

2024-01-24 23:20:38 863

原创 线程概述及操作

线程——参与系统调度的最小单位。线程是程序最基本的运行单位。当程序启动时,就有一个进程被OS创建,同时一个线程也立刻运行,该线程叫做程序的主线程。应用程序都是以main()作为入口开始执行的,所以main()函数就是主线程的入口函数,main()函数所执行的任务就是主线程需要执行的任务。主线程重要性1)子线程由主线程创建;2)主线程通常会在最后结束运行,执行各种清理工作,譬如回收各个子线程。线程不单独存在,而是包含在进程中;线程是参与系统调度的基本单位;

2024-01-23 21:58:57 392

原创 操作系统原理之线程同步

对互斥锁进行上锁之后,任何其它试图再次对互斥锁进行加锁的线程都会被阻 塞,直到当前线程释放互斥锁。如果释放互斥锁时有一个以上的线程阻塞,那么这些阻塞的线程会被唤醒, 它们都会尝试对互斥锁进行加锁,当有一个线程成功对互斥锁上锁之后,其它线程就不能再次上锁了,只能 再次陷入阻塞,等待下一次解锁。读写锁(共享互斥锁)有多种状态:读模式下的加锁状态(以下简称读加锁状态)、写模式下的加锁状态(以下简称写加锁状态)和 不加锁状态,一次只有一个线程可以占有写模式的读写锁,但是可以有多个线程同时占有读模式的读写锁。

2024-01-23 21:50:44 1731

原创 C++之STL(五)

当小组演讲完后,淘汰组内排名最后的三个选手,然后继续下一个小组的比赛。比赛完毕,淘汰组内排名最后的三个选手,然后继续下一个小组的比赛。第三轮只剩下1组6个人,本轮为决赛,选出前三名。10个评委打分,去除最低、最高分,求平均分每个选手演讲完由10个评委分别打分。该选手的最终得分是去掉一个最高分和一个最低分,求得剩下的8个成绩的平均分。比赛共三轮,前两轮为淘汰赛,第三轮为决赛。1) 请打印出所有选手的名字与参赛号,并以参赛号的升序排列。2) 打印每一轮比赛后,小组比赛成绩和小组晋级名单。

2024-01-22 09:43:51 355

原创 C++之STL(四)

算法主要是由<algorithm> <functional> <numeric>组成。

2024-01-22 09:43:39 384

原创 C++之STL(三)

STL内建了一些函数对象。分为:算数类函数对象,关系运算类函数对象,逻辑运算类仿函数。这些仿函数所产生的对象,用法和一般函数完全相同,当然我们还可以产生无名的临时对象来履行函数功能。重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象,也叫仿函数(functor),其实就是重载“()”操作符,使得类对象可以像函数那样调用。谓词是指普通函数或重载的operator()返回值是bool类型的函数对象(仿函数)。1.函数对象(仿函数)是一个类,不是一个函数。

2024-01-22 09:43:36 472

原创 C++之STL(二)

这在vector是不成立的,因为vector的插入操作可能造成记忆体重新配置,导致原有的迭代器全部失效,甚至List元素的删除,也只有被删除的那个元素的迭代器失效,其他迭代器不受任何影响。所谓”list正确的递增,递减、取值、成员取用”是指,递增时指向下一个节点,递减时指向上一个节点,取值时取的是节点的数据值,成员取用时取的是节点的成员。set拥有和list某些相同的性质,当对容器中的元素进行插入操作或者删除操作的时候,操作之前所有的迭代器,在操作完成之后依然有效,被删除的那个元素的迭代器必然是一个例外。

2024-01-22 09:43:31 1006

原创 C++之STL(一)

STL提供了六大组件,彼此之间可以组合套用,这六大组件分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器。容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据,从实现角度来看,STL容器是一种class template。算法:各种常用的算法,如sort、find、copy、for_each。从实现的角度来看,STL算法是一种function template.迭代器。

2024-01-22 09:43:12 1341

原创 Dev-C++的简单使用步骤

1)打开 Dev-C++,点击File——>New——>Source File。

2024-01-22 09:42:42 308

原创 C++输入流和输出流

< setiosflags(ios::showbase) //基数。cout.write() //从buffer中写num个字节到当前输出流中。

2024-01-21 21:57:44 344

原创 C++异常

异常被抛出后,从进入try块起,到异常被抛掷前,这期间在栈上构造的所有对象,都会被自动析构。析构的顺序与构造的顺序相反,这一过程称为栈的解旋(unwinding)。如果使用指针变量,需要自己delete,否则出现下面的结果。

2024-01-21 21:52:03 349

原创 C++类型转换

类型转换(cast)是将一种数据类型转换成另一种数据类型。例如,如果将一个整型值赋给一个浮点类型的变量,编译器会暗地里将其转换成浮点类型。应该小心类型转换,因为转换也就相当于对编译器说:忘记类型检查,把它看做其他的类型。一般情况下,尽量少的去使用类型转换,除非用来解决非常特殊的问题。

2024-01-21 21:48:08 320

原创 C++模板(二)

注意:一般在头文件中不会出现 #include"Person.cpp",所以需要将Person.cpp中的成员函数实现拷贝到Person.h中,并且将Person.h命名为Person.hpp,同时需要把main.cpp中的#include"Person.cpp"改为#include"Person.hpp"即可。

2024-01-21 21:46:31 346

原创 C++模板(一)

练习:使用函数模板对char和int类型数组进行排序。

2024-01-21 21:42:13 340

原创 C++基础知识(多态)

在设计时,常常希望基类仅仅作为其派生类的一个接口。这就是说,仅想对基类进行向上类型转换,使用它的接口,而不希望用户实际的创建一个基类的对象。同时创建一个纯虚函数允许接口中放置成员原函数,而不一定要提供一段可能对这个函数毫无意义的代码。如果出现了纯虚析构函数,这个类也算抽象类,不可以实例化对象。虚析构:用于解决 在释放基类指针(指向的是子类对象)时,不能调用子类的析构函数的问题。可以看出,子类将speak()重写为自己的,所以输出才会是“小猫在说话”。类内声明 类外实现。向下类型转换 不安全的。

2024-01-21 21:38:26 741

原创 C++基础知识(继承)

多继承会带来一些二义性的问题, 如果两个基类中有同名的函数或者变量,那么通过派生类对象去访问这个函数或变量时就不能明确到底调用从基类1继承的版本还是从基类2继承的版本?c++最重要的特征是代码重用,通过继承机制可以利用已有的数据类型来定义新的数据类型,新的类不仅拥有旧类的成员,还拥有新定义的成员。一个B类继承于A类,或称从类A派生类B。两个派生类继承同一个基类而又有某个类同时继承这两个派生类,这种继承被称为。注意:不管公有继承 保护 还是私有 基类中的私有属性 ,都不可以继承下去。

2024-01-21 21:30:13 783

原创 C++基础知识(字符串封装)

【代码】C++基础知识(字符串封装)

2024-01-21 21:16:11 292

原创 C++基础知识(运算符重载二)

【代码】C++基础知识(运算符重载二)

2024-01-21 21:14:00 345

原创 C++基础知识(运算符重载一)

运算符重载(operator overloading)只是一种”语法上的方便”,也就是它只是另一种函数调用的方式。运算重载符是多态的一种表现。对于内置数据类型,编译器知道如何做运算。

2024-01-21 21:12:03 354

原创 C++基础知识(单例模式)

Singleton(单例):在单例类的内部实现只生成一个实例,同时它提供一个静态的getInstance()工厂方法,让客户可以访问它的唯一实例;在单例类内部定义了一个Singleton类型的静态对象,作为外部共享的唯一实例。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。在程序启动时就创建单例对象,这种实现方法的优点是线程安全,因为再程序启动时就已经创建了单例对象,所以不需要考虑多线程同步问题。缺点是可能造成资源浪费,因为即使程序中并没有使用单例对象,它也已经被创建了。

2024-01-21 21:05:28 836

原创 C++基础知识(深拷贝与浅拷贝)

没有任何副作用,但是当类中有指针,并且指针指向动态分配的内存空间,析构函数做了动态内存释放的处理,会导致内存问题。同一类型的对象之间可以赋值,使得两个对象的成员变量的值相同,两个对象仍然是独立的两个对象,这种情况被称为。如果属性里有指向堆区空间的数据,那么简单的浅拷贝会导致重复释放内存的异常;做了释放处理,往往需要自定义拷贝构造函数,自行给指针动态分配空间,,深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经。当类中有指针,并且此指针有动态分配空间,浅拷贝只是对指针的拷贝,

2024-01-21 21:02:24 324

原创 C++基础知识(友元)

友元关系不具有传递性。类B是类A的朋友,类C是类B的朋友,但类C不一定是类A的朋友。全局函数写到 类中做声明 并且前面加上关键字 friend。friend class 类名。成员函数作为友元函数。

2024-01-21 20:58:49 323

原创 C++基础知识(常函数和常对象)

2、常函数 修饰是 this指针 const Type * const this。4、常对象 在对象前面加上const修饰 const Person p1。1、常函数 void func() const {} 常函数。6、用multable关键字修饰的成员变量在常函数中可以修改。5、常对象不可以调用普通的成员函数,可以调用常函数。3、常函数 不能修饰this指针指向的值。

2024-01-21 20:57:24 324

原创 C++基础知识(空指针)

2、如果成员函数用的this指针,就要注意,可以加if判断,如果this为空,就return掉。1、如果成员函数没有用到this,那么空指针可以直接访问。

2024-01-21 20:56:28 347

原创 C++基础知识(this指针)

4、非静态的成员函数才有this指针。3、*this指向对象本体。1、指针永远指向当前对象;2、解决命名上的冲突;

2024-01-20 15:21:24 292

原创 C++基础知识(函数重载)

C++中允许出现同名函数,这种现象就叫函数重载。函数重载的目的是为了方便使用函数名。

2024-01-20 15:17:01 346

原创 QT学习之QT概述

Qt是一个跨平台的C++图形用户界面应用程序框架。跨平台,几乎支持所有的平台接口简单,容易上手,学习QT框架对学习其他框架有参考意义。一定程度上简化了内存回收机制开发效率高,能够快速的构建应用程序。有很好的社区氛围,市场份额在缓慢上升。可以进行嵌入式开发。

2024-01-20 15:10:35 848

原创 QT学习之创建项目

如果要结合VS使用的话,需要下载额外插件(或者打开VS直接在线安装即可)找到所在安装路径Qt5.14.1\Tools\。至此,运行没有出现问题,说明安装无误。当前暂时选择32位,之后点击完成。输出Hello World。运行快捷键:Ctrl+R。

2024-01-20 15:02:09 409

原创 C++基础知识(成员变量和成员函数)

3、只有非静态成员属性才属于对象身上。1、成员变量和成员函数是分开存储的;

2024-01-20 12:49:06 396

原创 C++基础知识(默认拷贝构造函数调用时机)

Person p1;//拷贝的数据以引用的方式进行传递,因此,操作的p1是之前的p1.1、用已经创建好的对象初始化新的对象;Release下优化成什么样?分析:两种模式下的结果不同。的方式对函数参数进行传值;3、以值方式返回局部对象。

2024-01-20 12:47:53 343

原创 C++基础知识(类和对象)

定义一个结构体用来表示一个对象所包含的属性,函数用来表示一个对象所具有的行为,这样就可以表示一个事物。在C中,行为和属性是分开的。属性和行为应该放在一起,一起表示一个具有属性和行为的对象。封装提供一种机制能够给属性和行为的访问控制权。所以说,封装包含两个方面:1)属性和变量合成一个整体;2)给属性和访问增加权限。class默认访问权限是private,struct默认访问权限是public。现实世界中,将事物的属性和行为表示出来,就可以抽象出这个事物。1)可赋予客户端访问属性的一致性;访问权限------

2024-01-20 12:44:59 408

原创 C++基础知识(内联函数及默认参数设置)

当调用一个内联函数时,编译器首先确保传入参数类型是正确匹配的,或者如果类型完全不匹配,但是可以将其转换为目标类型,内联函数就会直接替换函数调用,这就消除了函数调用的开销。内联函数只是给编译器的一个建议,编译器不一定会接受这种建议,如果没有将函数声明为内联函数,那么编译器也可能将此函数作内联编译。为了保持预处理器宏函数的效率,没有函数调用时开销,然后又可以像普通函数那样,可进行参数、返回值得安全检查,又可以作为成员函数。C++在声明函数时,可以设置占位参数,占位参数只有参数类型声明,而没有参数名声明。

2024-01-20 12:40:20 345

原创 C++基础知识(常量)

在C++中定义const时,编译器为他创建空间,所以如果两个不同文件中定义多个同名的const,链接器就会发生链接错误,简而言之,在C++中,const用的更好。首先,它能够明确指定类型。:如果C中出现两个文件中都包含const int a时,编译器会报重定义错误,而在C++中则不会报错,因为C++中是默认内部连接,如果想让C++中的const具有外部连接,必须显式声明为:extern const int a=10;1、const有类型,可进行编译器类型安全检查,#define无类型,不可进行类型检查。

2024-01-20 12:37:33 346

原创 C++基础知识(命名空间)

eg5:没有命名空间,意味着命名空间中的标识符只能在本文件中访问,相当于给这个标识符加上了一个static,使得其可以作为内部链接。作用:通过命名空间来控制对名字的访问,避免发生命名冲突,可以更好地控制标识符的作用域。eg4:命名空间中的成员函数声明和实现相互分离。eg3:命名空间可随时添加新成员。eg2:命名空间可嵌套命名空间。eg1:创建一个命名空间。eg6:命名空间别名。

2024-01-20 11:19:43 318

原创 C++基础知识(常函数)

特点:①可以使用数据成员,不能进行修改,对函数的功能有更明确的限定;③常函数的this指针是const CStu*.②常对象只能调用常函数,不能调用普通函数;形式: void fun() const {}构造函数和析构函数不可以是常函数。

2024-01-20 11:14:48 345

原创 C++基础知识(析构函数)

2、指针对象(堆区,不会自动释放==》不会自动调用析构,需手动释放,用delete)1、局部对象(栈区,会自动调用析构函数)3、临时对象(作用域:所在语句)

2024-01-20 11:11:56 305

原创 C++基础知识(初始化列表)

多个构造函数,初始化列表绑定所在的构造函数。2 通过构造函数参数对数据成员进行初始化。1 通过数值对数据成员进行初始化;3 通过成员之间相互初始化。

2024-01-20 11:01:32 300

原创 C++基础知识(构造函数)

析构函数,常函数,拷贝函数,内联函数以及静态成员函数。构造函数,自动调用,没有返回值。作用:对数据成员进行赋值(初始化)。

2024-01-20 10:50:17 337

原创 C++基础知识(友元)

①不受访问修饰符的影响,即友元函数或者友元类的访问修饰符可以是public\protected任意一种;缺点:破坏类的封装性,不是迫不得已不使用。使用protected成员有两种方法:继承和友元。使用private成员:友元。关键字:friend。

2024-01-20 10:32:52 397

现代C++白皮书电子书

C++作为一门拨打精深的语言,其发展演化历程堪称波澜壮阔。本书介绍了C++的相关背景及其演化供大家学习。

2024-01-20

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除