C++
HOVL_C++
这个作者很懒,什么都没留下…
展开
-
设计模式---观察者模式
观察者模式首先看一下他的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。然后看一下菜鸟教程的有缺点优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生原创 2021-11-10 16:59:23 · 319 阅读 · 0 评论 -
设计模式----单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。注意:1、单例类只能有一个实例。2、单例类必须自己创建自己的唯一实例。3、单例类必须给所有其他对象提供这一实例。使用场景:1、要求生产唯一序列号。2、WEB 中的计数器,不用每次刷.原创 2021-10-28 16:39:04 · 190 阅读 · 0 评论 -
C++11 auto的应用
auto 自动类型推导C++11之前和c语言 auto用来声明变量的存储类型(自动变量 栈区)在编译期间 编译器能够根据变量或者表达式推导七类型auto 与 const 时: 普通数据在推导时const属性会被抛弃 但是指针或者引用有const时 自动推导时不会抛弃auto的限制: 1.不能用于函数的参数列表 2.auto不能作用于类的非静态成员 3.auto 关键字不能定义数组 4.auto不能作用于模板参数auto的应用 1.for循环 for(auto& var:原创 2021-10-19 11:00:44 · 245 阅读 · 0 评论 -
C++ 容器详解
首先说一下六大组件:算法,容器,迭代器,仿函数(函数对象),分配器,适配器简述:线性容器:vector(向量): 好比C语言中数组 顺序表 seqtable(a)内存连续 支持[]运算符 下标访问(b)动态内存管理 自动扩容(c)通过分配器来管理动态内存 预分配内存空间 减少动态内存管理的额外开销(d)可以随机位置做插入和删除,但只有在接近末尾进行插入和删除时才是高效的预分配内存和初始化vector v3(10); //10个int元素,初始值为0vec原创 2021-10-17 10:05:27 · 3186 阅读 · 1 评论 -
STL全特化 偏特化 成员特化
模板有两种特化,全特化和偏特化(局部特化)模板函数只能全特化,没有偏特化(以后可能有)。模板类是可以全特化和偏特化的。全特化:template<>class cla_template_name<特化类型>{ };成员特化:template<>ret_type cla_template_name<特化类型>::memb_func_name(arglist,..){ }类模板在实例化时一定要显示类型实例化类模板可以有缺省类型,原创 2021-10-03 09:38:37 · 128 阅读 · 0 评论 -
STL模板实现stack
#include <iostream>#include <stdexcept>using namespace std;//类模板template<typename T=int>class Stack{private: T *elems; size_t size; size_t cap;public: Stack(size_t cap = 10):cap(cap){ elems = new T[cap]; size = 0; } ~Stac原创 2021-10-02 10:01:31 · 106 阅读 · 0 评论 -
C++类模板的基础
类模板不能根据参数进行类型推导实例化模板类,只能显示#include <iostream>using namespace std;template<typename T>T msum(T a,T b){ return a+b; }int main(){ cout << msum(1,2) << endl; //cout << msum(1,3.1) << endl; //不能根据实参进行类型推导 cout &l原创 2021-10-01 10:10:39 · 78 阅读 · 0 评论 -
C++ STL实现sort
sort#include <iostream>#include <algorithm>using namespace std;template<typename T>void mswap(T& t1,T& t2){ T t = t1; t1 = t2; t2 = t;}template<typename T>void msort(T elems[],size_t cnt){ for(int i=0;i<cnt原创 2021-10-01 10:02:52 · 105 阅读 · 0 评论 -
C++ 标准模板库STL初理解
定义标准模板库(Standard Template Library,STL)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。虽说它主要表出现到C++中,但在被引入C++之前该技术就已经存在了很长时间。STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说原创 2021-09-27 09:01:46 · 84 阅读 · 0 评论 -
c++实现成绩管理系统
成绩管理系统 1.增加学生信息 2.删除学生 3.修改学生 4.列出 5.查找 0.退出 把学生信息保存到文件#include <iostream>#include <fstream>#include <algorithm>#include <cstring>#include <vector>using namespace std;class Stu{private: int no; string name;原创 2021-09-26 14:41:40 · 520 阅读 · 0 评论 -
C++异常处理
C++的异常处理1.通过返回值表达错误( 如果是调用系统函数出错 设置全局的errno )层层判断返回值,流程变得繁琐错误处理和正常逻辑 代码是混在一起局部对象能够正常析构2.通过setjmp/longjmp远程跳转可以一步到位进行错误处理,流程简单#include <iostream>#include <cstdio>#include <csetjmp>using namespace std;class A{public: A(){ c原创 2021-09-24 10:42:44 · 113 阅读 · 0 评论 -
C++ 重载 覆盖 隐藏 详细区分
重载:重载在之前已经讲过,这里不在赘述详细的link.在同一个作用域下,函数名相同,参数列表不同即构成重载条件:必须在同一个作用域(类)下函数名相同参数列表不同: 参数类型和参数的个数不一样 对于指针和引用常属性不一样也构造重载与返回值类型无关与函数是否是虚函数无关在编译时,根据调用时传递的实参类型和个数来绑定调用的函数,静态绑定覆盖(重写):说起覆盖先说一下虚函数在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数,用法格式为:virtual 函数返原创 2021-09-22 12:03:24 · 106 阅读 · 0 评论 -
C++ 继承解析
面向对象编程三大特征:封装、继承、多态定义继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一。继承就是不修改原有的类,直接利用原来的类的属性和方法并进行扩展。原来的类称为基类,继承的类称为派生类,他们的关系就像父子一样,所以又叫父类和子类。该派生类拥有另外一个类的所有的属性和方法如果一个类继承另外一个类,那么该类拥有另外一个类所有的属性和方法人类 人类 基类 父类原创 2021-09-22 10:32:54 · 137 阅读 · 0 评论 -
C++中普通指针 vs 成员函数指针 vs 成员属性指针
什么是指针?指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:type *var-name;在这里,type 是指针的基类型,它必须是一个有效的 C++ 数据类型,var-name 是指针变量的名称。用来声明指针的星号 * 与乘法中使用的星号是相同的。但是,在这个语句中,星号是用来指定一个变量是指针。普通指针:数据类型 *指针变量;成员属性指针:定义: 数据类型 类原创 2021-09-22 09:13:07 · 204 阅读 · 0 评论 -
C++面试题---String类实现
C++的String在C语言里,字符串是用字符数组来表示的,而对于应用层而言,会经常用到字符串,而继续使用字符数组,就使得效率非常低.所以在C++标准库里,通过类string从新自定义了字符串。#include <iostream>#include <cstring>using namespace std;//写一个string类class String{private: char *m_str; //指针成员public://构造函数 String原创 2021-09-21 13:55:01 · 276 阅读 · 0 评论 -
C++ 拷贝赋值
拷贝赋值函数当存在的两个同类型的变量进行赋值操作时,会调用拷贝赋值函数 如果一个类没有实现拷贝赋值函数,则编译器会自动生成一个拷贝赋值函数,默认实现是浅拷贝赋值如果需要实现深拷贝赋值,则需要手动实现注意:当类持有其它资源时,例如动态分配的内存、打开的文件、指向其他数据的指针、网络连接等,默认的赋值运算符就不能处理了,我们必须显式地重载它,这样才能将原有对象的所有数据都赋值给新对象。拷贝赋值函数形如:class CLA_NAME{ //拷贝赋值函数 CLA_NAME& opera原创 2021-09-21 10:43:16 · 774 阅读 · 0 评论 -
C++ 拷贝构造
拷贝构造函数定义拷贝构造函数,又称复制构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。其形参必须是引用,但并不限制为const,一般普遍的会加上const限制。此函数经常用在函数调用时用户定义类型的值传递及返回。拷贝构造函数要调用基类的拷贝构造函数和成员函数。如果可以的话,它将用常量方式调用,另外,也可以用非常量方式调用。是特殊的构造函数如果一个类没有添加拷贝构造函数,那么编译器将自动生成一个拷贝构造函数,实现是浅拷贝如果一个类需要实现深拷贝,则需要原创 2021-09-21 10:01:20 · 721 阅读 · 0 评论 -
C++ 析构函数
析构函数//当一个对象消亡(消失,离开了生命周期) ,即当对象的生命周期结束时,撤销类对象时候会自动调用析构函数~CLA_NAME(void){ };1)对象在生命期结束,撤销类对象时会自动调用析构函数。如果在一个函数中定义了一个非静态局部对象,那当函数调用结束时候,对象被释放,在对象被释放前调用析构函数。 函数中的静态局部对象在函数调用结束时候对象并不释放,因此不调用析构函数。静态局部对象或全局作用域的对象只有在主函数结束时候,才会调用析构函数。2)如果用new运算动态地建立一个对象原创 2021-09-20 15:56:33 · 307 阅读 · 0 评论 -
C++中的this指针
this指针在 C++ 中,每一个对象都能通过 this 指针来访问自己的地址。this 指针是所有成员函数的隐含参数。因此,在成员函数内部,它可以用来指向调用对象。在成员函数中,可以直接访问成员属性 和 调用 成员方法在类外面调用成员方法 对象.成员方法名(实参列表);在所有的成员函数(构造函数)中,都隐含了一个参数this, this是一个该类类型的指针 对象.成员方法名(实参列表); ---> 成员方法名换名之后(&对象,实参列表) 成员方法名换名之后(类型 *this,原创 2021-09-20 15:21:19 · 149 阅读 · 0 评论 -
C++ 实例化对象
实例化对象:意味着一定有调用构造函数 实例化就是给,数据成员分配内存,构造对象。对象的成员函数和普通函数的区别就是,成员函数有个指向当前对象的this指针,可以访问对象的成员变量,其依赖于对象。静态函数就更像一个全局函数,没有this指针,可以通过类名直接访问,可以被对象的成员函数访问,静态函数只能访问类的静态成员。这些可访问属性是由编译器来实现的,编译之后就没有对象、成员这些东西了,都是数据和方法。一.在栈区实例化对象1.调用无参构造函数实例化对象 类型名 --- class/struct原创 2021-09-20 15:10:58 · 2522 阅读 · 0 评论 -
C++类型转换大汇总
隐式类型转换可以用单个实参来调用的构造函数定义了从形参类型到该类型的一个隐式转换。首先要单个实参,你可以把构造函数colour的默认实参去掉,也就是定义一个对象必须要两个参数的时候,文件编译不能通过。然后满足这个条件后,系统就知道怎么转换了要注意的是:只存在一个用户定义的类型转换,但存在多个算术类型转换。int* ----> void* 隐式类型转换void* ---> int* 不能隐式类型转换基础数据类型之间都可以进行隐式类型转换C++四种显示类型转换1.静态类型原创 2021-09-16 10:56:05 · 702 阅读 · 0 评论 -
C++的引用 VS 指针
引用定义:引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。语法数据类型& 变量名 = 目标对象;注意事项:1.引用必须直接初始化 形参列表引用没有直接初始化(在函数调用时初始化)**声明引用的同时必须对其初始化,否则系统会报错**2.引用一旦初始化 不能更改引用对象(不能指向其他对象) 从一而终3.对引用对象的操作,直接影响其目标对象4.&不是求地址运算符,而是起标志作用5.引用的类原创 2021-09-15 19:46:00 · 133 阅读 · 0 评论 -
C++函数重载
概念:C++中,在同一个作用域下面,函数名相同,参数列表不同,即构成重载重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。前提条件:在同一个作用域下面(如果作用域不同,不是重载)这里重点说明:函数名相同是指函数名一模一样,参数列表不同: 1.参数类型不同(对应位置) 2.参数个数不同 3.常属性不同 是指 指针or引用类型的常属性不一样与函数返回值类型无关C++中,在调用重载的函数时,编译阶段根据函数调用时所原创 2021-09-14 18:21:02 · 142 阅读 · 0 评论 -
C++ 中的结构体、联合和枚举浅析
结构体结构体就是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型,它的特点和数组主要有两点不同,首先结构体可以在一个结构中声明不同的数据类型。第二,相同结构的结构体变量是可以相互赋值的,而数组是做不到的,因为数组是单一数据类型的数据集合,它本身不是数据类型(而结构体是),数组名称是常量指针,所以不可以做为左值进行运算,所以数组之间就不能通过数组名称相互复制了,即使数据类型和数组大小完全相同。我们学过C语言中的结构体,C++中的结构体和C语言的结构体大体相同,但是C++也对C语言中原创 2021-09-11 10:25:20 · 224 阅读 · 0 评论 -
c++ 名字空间 namespace
定义namespace 名字空间的名字{全局变量类型定义函数}意义对于一个较大型的C++程序来说,需要由多个程序员相互协作编写,这样的情况下容易出现不同程序员在需要负责的程序部分使用相同名字的变量或函数,导致程序合并后出现问题。名字空间的作用,就是将不同程序员编译的程序放入相应的名字空间,每个名字空间相对独立,空间内的变量和函数名只局限于当前空间下,从而解决命名冲突的问题。名字空间的三种使用方法(1)作用域限定符 名字空间名::标识符 表示明确访问是特定名字空间中的特定标识符 最原创 2021-09-07 20:58:20 · 438 阅读 · 1 评论 -
C++小白初入门
c++历史发展第一阶段从80年代到1995年。这一阶段C++语言基本上是传统类型上的面向对象语言,并且凭借着接近C语言的效率,在工业界使用的开发语言中占据了相当大份额;第二阶段从1995年到2000年,这一阶段由于标准模板库(STL)和后来的Boost等程序库的出现,泛型程序设计在C++中占据了越来越多的比重性。当然,同时由于Java、C#等语言的出现和硬件价格的大规模下降,C++受到了一定的冲击;第三阶段从2000年至今,由于以Loki、MPL等程序库为代表的产生式编程和模板元编程的出现,C++出原创 2021-09-06 18:36:19 · 375 阅读 · 1 评论