c++
cleverlemon
hello world !
展开
-
C++ 单例模式 懒汉模式(延时加载)
所谓单例模式就是让一个类只能实例化一个对象。简单的单例模式如下:class Singleton{public: static Singleton* getInstance() { if (NULL == object)//懒加载 { object = new Singleton(); } return object; }private: Singleton() {} Singleton(const S原创 2020-09-06 11:03:34 · 853 阅读 · 0 评论 -
c++ 智能指针 (auto_ptr、unique_ptr、shared_ptr、weak_ptr)
auto_ptr(不建议使用) 所有权唯一,即只允许一个智能指针指向同一块堆内存。如果有两个智能指针,则回收旧智能指针的所有权。 缺点:指针的赋值或拷贝过程中,回收旧智能指针的所有权,导致旧智能指针无效,若之后给旧智能指针赋值,程序会报错。因此,不建议使用。#include<iostream>template<typename T>class Auto_Ptr{public: Auto_Ptr(T* ptr) :mptr(ptr)原创 2020-07-10 18:23:30 · 282 阅读 · 0 评论 -
C++ 工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)
利用工厂模式来生成对象,不需要关注对象的生成过程;还可以简化名称,以便使用。简单工厂模式 同一工厂生产多个产品。 违背开放–封闭规则(开放指新版本设计时可以使用旧版本的代码;封闭指不能修改旧版本的代码)。因此适用于规模固定、不易发生产品改动的工厂。实现如下://简单工厂模式#include<iostream>class Fruit{public: Fruit(std::string nm) :mname(nm) {} virtual原创 2020-07-06 21:45:55 · 1011 阅读 · 0 评论 -
c++ 类的内存布局 菱形继承
菱形继承 菱形继承的方法如下:class A{public: A(int a) :ma(a) {}public: int ma;};class B :public A{public: B(int b) :A(b),mb(b) {}public: int mb;}class C :public A{public: C(int b) :A(b), mc(b) {}public:原创 2020-07-04 21:53:06 · 483 阅读 · 0 评论 -
c++中的四种转换类型 分类的IP地址
const_cast 去除常性static_cast 转换的安全性高reinterpret_cast 常用于指针的转换dynamic_cast RTTI信息分类的IP地址 最基本的编址方法,一个IP地址在整个互联网范围内是唯一的。原创 2020-06-27 23:23:29 · 430 阅读 · 0 评论 -
c++继承 基类 派生类 虚函数
继承 类和类的关系有组合、继承和代理。继承的本质就是代码复用。子类继承父类中的一些东西,父类也称为基类,子类也称为派生类。派生类继承了基类除构造函数以外的所有成员。继承的方式 继承方式有public(公有继承)、private(私有继承)和protected(保护继承)。基类中不同访问限定符下(public、protected、private)的成员以不同的继承方式继承,在派生类中的访问限定也不同,具体如下:基类的布局优先于派生类#include<iostream>class原创 2020-06-15 19:25:39 · 9752 阅读 · 0 评论 -
c++ 初识智能指针
智能指针 智能指针是一种自主的内存回收机制,是一种面向对象的指针。我们知道代码中栈上得内存是由系统开辟和释放(函数结束,退栈)的,而堆上得内存是人为开辟、人为释放的。那么我们在程序中new动态申请了一块堆内存,如果忘记释放该内存或是函数异常退出,程序还没来得及执行delete操作,就会造成内存泄露。 学习了c++中的对象后,我们知道对象的生成有两步,即开辟内存和调用构造函数;对象的销毁也有两步,即调用析构函数和释放内存。而调用析构函数是由系统来完成的,因此智能指针要想实现内存由系统回收,可以借助对象原创 2020-06-08 17:00:46 · 164 阅读 · 2 评论 -
c++ String类的写时拷贝
写时拷贝 系统中默认的拷贝构造函数和赋值运算符重载函数是一种浅拷贝,若类中的成员变量有指针类型,那么多个对象拥有共同的资源,在析构时,会对同一块内存多次释放。此时,我们就需要自己来写拷贝构造函数和赋值运算符重载函数实现深拷贝。但是深拷贝也有缺点,即若资源只是简单共享,不进行写操作,则会使资源浪费。 写时拷贝技术就是在写之前为浅拷贝,而写时为深拷贝。那么使用写时拷贝时,对象的销毁(析构函数)要进行合理的处理。由于多个对象可能共享共享同一块内存单元,所以应该在最后一个对象销毁时,才释放资源。这就涉及到了原创 2020-06-05 11:30:08 · 811 阅读 · 0 评论 -
c++封装一个复数类 实现+ - 输入输出的重载
#include<iostream>class CComplex{ public: CComplex(int real, int image) :mreal(real), mimage(image) {} const CComplex operator+(int val) { return CComplex(mreal+val,mimage); } const CComplex operator+(co原创 2020-05-28 11:46:28 · 573 阅读 · 0 评论 -
C++ 运算符重载
运算符重载的机制是不能改变原有运算符的逻辑。前置++(++i)的处理逻辑是本身先相加,再返回本身。比如int a=10;++a=20;编译正确,a的值为20.后置++(i++)的处理逻辑是本身先生成一个临时量,先使用临时量(常量),表达式结束,本身再++。int a=10;a++=20;编译错误,报错:error C2106: “=”: 左操作数必须为左值#include<iostream>class CInt{public: CInt(int val)原创 2020-05-24 17:39:42 · 156 阅读 · 0 评论 -
C++递归函数来实现统计字符串中第一个空字符前面字符长度
C++递归函数来实现统计字符串中第一个空字符前面字符长度例如:char buf[]={'a','b','c','d','e','f','\0','x','y','z'}; 当输入字符串buff,N=10或者20,期待输出结果是6;当输入N=3或5时,期待输出结果是3或5。代码实现如下:#include <iostream>int mystrlen(char* buf,int N){ if(buf[0]==0||N==0) return 0;//空字符串出现返回0 e原创 2020-05-17 21:36:12 · 328 阅读 · 0 评论 -
C++ 函数模板的使用
函数模板 给出一个简单的例子,实现两个数相加,如下:#include<iostream>template<typename T>T Sum(T a,T b) //Sum为模板名{ return a+b;}int main(){ std::cout<<Sum<int>(10,20)<<std::endl;...原创 2020-05-06 22:03:51 · 187 阅读 · 0 评论 -
c++ 用类简单封装一个带头结点的单链表
本篇博客中代码的实现中采用了友元的使用,但一般写代码尽量不适用友元,除非万不得已,具体代码如下:#include<iostream>typedef int ElemType;class LinkList;//为使用友元,做一个声明class Node{public: Node(ElemType val=0) :data(val),next(NULL) { }...原创 2020-04-29 22:37:40 · 447 阅读 · 0 评论 -
malloc函数和new关键字 C/C++
malloc free malloc是c语言中动态开辟内存时常用的函数,malloc只能单纯地开辟内存,使用malloc后,还需要在使用完之后用free释放掉其所开辟的空间。其函数原型如下:void* malloc(size_t size);//void* 指向的是一个半开半闭的区间,即[ ),因此不安全 C和C++中允许任意类型的指针转成void* ,而若想将void* 转成别...原创 2020-03-24 21:33:17 · 514 阅读 · 0 评论 -
C++ 引用和指针
引用 C++中的引用相当于给变量起了一个别名,而变量的实质就是一个内存单元,因此引用就是给一个变量起了一个别名。 & 和类型结合时,表示引用(比如 int& c=a;表示引用a对应的内存单元);&和变量结合时(比如 int *p=&a;表示取a的地址),表示取这个变量的地址。#include<iostream>using namespace...原创 2020-03-14 22:03:35 · 157 阅读 · 0 评论 -
C/C++的 inline关键字修饰的函数
inline 内联函数(inline),即在线函数或编译时期展开函数。程序中使用inline关键字修饰的函数,编译阶段时在函数的调用点把inline函数的代码直接展开。与普通函数的区别是普通函数在调用时有函数堆栈和清栈操作,而inline修饰的函数没有,效率较高。与宏的区别 宏是在与编译阶段处理的,没有类型和安全检查;而inline是在编译阶段处理的,有类型和安全检查。也可以说,inli...原创 2020-03-11 11:34:51 · 828 阅读 · 0 评论 -
C/C++函数符号生成规则
调用约定_cdecl c语言标准调用约定_stdcall windows标准调用约定_fastcall 快速调用约定_thiscall 类成员方法的调用约定对于形参的开辟和清理:cdecl 由调用方开辟,由调用方清理;stdcall 由调用方开辟,被调用方清理;fastcall 前两个参数不开辟内存,之后的参数由调用方开辟,被调用方清理c/c++符号生成...原创 2020-03-07 22:02:56 · 1742 阅读 · 0 评论 -
编译链接时,计算机内部到底做了什么?
源文件(.c 或 .cpp文件)要想运行起来需要经过预编译、编译、汇编、链接、运行几个阶段。那么,这几个阶段中计算机内部又做了什么呢?预编译阶段: 1.删除 #define (宏定义)并作文本替换; 2.处理 #if #endif 等预编译指令; 3.递归展开 #include (头文件中可能包含其他头文件); 4.删除注释; 5.添加行号和文件标识; 6.保留 #...原创 2020-03-01 14:18:43 · 363 阅读 · 0 评论