![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 70
persistence_s
这个作者很懒,什么都没留下…
展开
-
C++之类型萃取
在初识类型萃取之前,我们可以先写一个通用的Copy函数,当然选择使用模板void Copy(T*dst, T*src, size_t size)//通用拷贝函数{ memcpy(dst, src, sizeof(T)*size);}int main(){ String s1[10]={"dddd", "sss", "ccc"}; String s2[10] = { "原创 2017-03-20 22:39:28 · 352 阅读 · 0 评论 -
C语言异常处理
程序消亡的三种形式:无疾而终(程序正常运行结束)、他杀(系统对异常进行处理使程序终止)、自杀(在程序里自己设置的对异常处理使程序运行终止)。 在C语言里有几种对异常进行处理的方式: 1、终止程序(除数为0):int Div(int Left, int Right){ if (Right == 0) { exit(1); } return L原创 2017-03-25 11:37:37 · 579 阅读 · 0 评论 -
浅析为什么要有auto_ptr_ref这个类
首先在VS2013的环境下的一段测试代码#include<iostream>using namespace std;template<class T>class AutoPtr{public: AutoPtr(T* pStr = NULL) : _pStr(pStr) { cout << "AutoPtr()" << endl; }原创 2017-04-01 17:19:25 · 475 阅读 · 0 评论 -
C++之异常处理
程序消亡的三种形式:无疾而终(程序正常运行结束)、他杀(系统对异常进行处理使程序终止)、自杀(在程序里自己设置的对异常处理使程序运行终止)。 在C语言里有几种对异常进行处理的方式: 1、终止程序(除数为0):int Div(int Left, int Right){ if (Right == 0) { exit(1); } return Lef原创 2017-03-25 00:54:54 · 306 阅读 · 0 评论 -
如何创建一个只能在堆上创建对象的类
C++创建对象有两种方式,一种是静态的创建对象,一种是动态的创建对象。静态创建对象:在编译期间就已经为对象分配了内存空间编译器自动调用构造函数动态创建对象:程序在运行期间才为对象开辟空间如果我们想要只能在堆上创建对象,可能我们会想到在类里把构造函数声明成为私有的,这样一来我们就不能在外面直接定义对象,以为系统无法调用构造函数了。但此时如果我们直接在类外面创建对象,那么在new 的时原创 2017-04-12 12:16:02 · 543 阅读 · 0 评论 -
shared_ptr循环引用问题
shared_ptr循环引用会造成内存泄漏如下所示#include<iostream>#include"boost\shared_ptr.hpp"#include"boost\weak_ptr.hpp"#include<stdlib.h>using namespace std;struct Node{ boost::shared_ptr<Node> pNext; boos原创 2017-04-03 15:49:56 · 801 阅读 · 0 评论 -
标准库里的weak_ptr如何解决循环引用所带来的问题
#include#include#includeusing namespace std;templateclass T>class Node{public: Node(T num) :value(num) { } ~Node() { cout "~Node()" << endl; } weak_原创 2017-04-04 15:14:31 · 2629 阅读 · 0 评论 -
智能指针AutoPtr去管理空间
关于在抛异常中我们可能会忘记将内存释放掉造成内存泄漏,为了避免这种情况的发生我们引入了智能指针,我们把自己申请的内存交给这个AutoPtr类对象去管理,系统会自动调用析构函数就能将资源清理防止内存泄漏。template<class T>class AutoPtr{public: AutoPtr(T* p) : _p(p) { cout << "A原创 2017-03-28 00:10:02 · 567 阅读 · 0 评论 -
ScopedPtr和SharedPtr
除了使用移交管理权来解决多次释放同一块内存的方式外,我们还可以强制的不允许许程序进行拷贝构造和给赋值的操作template <class T>class ScopedPtr{public : ScopedPtr( T * pStr = NULL) :_pStr( pStr ) { } T & oper原创 2017-03-28 22:10:42 · 401 阅读 · 0 评论 -
浅谈C++多态
多态意思是一个事物有多种形态,运算符的重载,函数的重载都是多态现象。从系统实现的角度看,多态性分为两类:静态多态和动态的多态,之前函数的重载和运算符的重载都属于静态的多态,在程序编译时系统就能决定调用的是哪一个函数,因此静态的多态又称为编译时的多态性,动态的多态性是在程序运行过程中才动态的确定操作所针对的对象,因此又称为运行时的多态。动态的多态性是通过虚函数实现的。#define Ne原创 2017-02-28 23:40:10 · 982 阅读 · 0 评论 -
单例模式
单例模式也叫单件模式。 Singleton是一个非常常用的设计模式,几乎所有稍微大一些的程序都会使用到它,所以构建一个线程安全并且 高效的Singleton很重要。 1. 单例类保证全局只有一个唯一实例对象。 2. 单例类提供获取这个唯一实例的接口。 设计单例模式有两种方式: 1、懒汉模式: 什么叫做懒汉模式呢?就是只有在第一次来调用的时候才会实例化这个对象。 简单的实现一个懒汉模式下原创 2017-08-03 11:44:44 · 300 阅读 · 0 评论 -
关于对new和delete的认识
/ new-->申请空间+调用构造函数?先申请空间再调用构造函数// delete-->释放空间+调用析构函数?先调用析构函数再去释放空间// 有没有问题?--什么问题?void FunTest1(){Test* p1 = (Test*)malloc(sizeof(Test));Test* p2 = new Test;// free(p1);// delet原创 2017-02-19 12:41:06 · 510 阅读 · 0 评论 -
VS2013环境下Boost库配置
最近在学习智能指针这块,提到智能指针就不得不提到Boost库里的智能指针,在Boost库里实现了五大智能指针的类模板 1、template<typename T> class scoped_ptr; 2、template<typename T> class scoped_array; 3、template<typename T> class shared_ptr; 4、templat原创 2017-03-31 00:57:51 · 944 阅读 · 0 评论 -
C++定制删除器
上一篇博客提到的智能指针采通过引用计数我们能解决多次释放同一块内存空间的问题,并且和之间直接移交管理权的方式比较这种方式更加灵活安全。但是这种方式也只能处理new出来的空间因为new要和析构中的delete匹配,为了使能和new,malloc,fopen的管理空间匹配,我们需要定制删除器#include<iostream>#include<stdlib.h>using namespace std原创 2017-03-28 22:18:50 · 1049 阅读 · 0 评论 -
模板的分离编译
首先我们需要知道程序运行起来需要四个阶段: 1、预处理(进行宏替换,去注释,条件编译,加行号,头文件展开等一系列工作) 2、编译(把进行完预处理之后的程序进行翻译转换成汇编代码) 3、汇编(把对应的汇编代码转换成机器能够识别的二进制序列) 4、链接(把一个工程中所有的obj文件链接起来变成一个可执行的exe的程序) 接下来我们分析模板的分离编译会产生什么样的结果: 首先我们在工程里建立原创 2017-03-21 19:23:15 · 284 阅读 · 0 评论 -
模板模拟实现栈
栈的特点是先进后出,可以用vector实现栈(顺序的存储结构,存储空间是连续的)通过先实现Vector作为底层来实现栈#include#include#includeusing namespace std;templateclass Vector{public: typedef T ValueType; typedef ValueType* Pointer; typed原创 2017-03-15 20:56:53 · 288 阅读 · 0 评论 -
模拟实现Vector
头文件:#include#include#includeusing namespace std;typedef int DataType;class Vector{public: explicit Vector(size_t capacity = 3)//C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生dndhh { _pData原创 2017-02-24 23:21:05 · 259 阅读 · 0 评论 -
关于浅拷贝和深拷贝
关于浅拷贝会出现什么问题我们可以看这个例子:#define _CRT_SECURE_NO_WARNINGS 1#include#includeusing namespace std;class String{public: String(const char*pStr = "")//定义一个构造函数 { if (pStr == NULL) { _pStr = ne原创 2017-02-23 22:29:20 · 257 阅读 · 0 评论 -
关于this指针
在每个成员函数中都包含一个特殊的指针,即this指针,它的名字是固定的。this指针是指向当前对象的指针,它的值是当前被调用的成员函数所在对象的起始地址。例1、class Student{public: int FunTest(int a, int b) { int c = 0; c = a + b; return c; }private: int age; i原创 2017-02-16 13:01:36 · 310 阅读 · 0 评论 -
构造函数的认识
关于构造函数的认识:在建立一个对象时,常常需要做某些初始化工作,例如如何给数据成员赋初值。如果一个数据成员未被赋值,则他的值是不可预知的,因为系统在为它分配内存时,保留了这些存储单元的原状,这就成为了数据成员的初始值。这种情况显然是与人们的要求不相符的,对象是一个实体,它反映了客观事物的属性,是应该有确定值的。但是数据成员是不能在声明类时初始化如例1、class Data{ int原创 2017-02-15 23:57:31 · 357 阅读 · 0 评论 -
C++的类和对象
关于类的认识:类和结构体的异同类:在C++中对象的类型称为类,类是对象的抽象,对象是类的具体实例,类是抽象的,不占内存,而对象确是具体的占有一定的内存。在C++中结构体不仅可以存放数据还可以存放函数。举例1:struct student{ char name[20]; int age; char gender[3]; void PrintStudent() { cou原创 2017-02-13 23:43:55 · 313 阅读 · 0 评论 -
C++浅谈组合和继承
C++有三大特性:封装、继承和多态。之前提到过继承是为了实现代码的复用,如果子类继承了父类那么就会继承父类所有的数据成员及成员函数,在公有继承的时候保持is-a原则,即每个子类的对象也是父类对象。因此引入了单继承、多继承以及菱形继承等方式。但是正是因为继承太有用、太容易用、很容易实现代码的复用性因此我们需要选择性的继承。如果A类和B类毫无关系,我们不应该为了让B类多一个功能而去让B继承原创 2017-03-08 22:44:29 · 3524 阅读 · 0 评论 -
C++之模板函数、类模板
在编程的时候,一般是一个函数对应一种功能但有时候我们需要实现的是同一类的功能。这时候就引入了函数模板,所谓函数模板,实际上是建立一个通用函数,其函数返回值类型和参数类型不具体指定,用一个虚拟类型来代替,这个通用用函数就是函数模板例一:#include#includeusing namespace std;template//对模板类型进行声明,其中T为类型参数,可以给任意原创 2017-03-12 13:42:23 · 722 阅读 · 0 评论 -
智能指针剖析(2)
在上一篇博客里的智能指针的剖析中,我们是采用移交管理权的方式,并且把给出管理权的一方的指针空。 在对智能指针的再次剖析中我们仍然采用移交管理权的方式,但是在这种方式下我们并没有把管理权的一方的指针空,仍然可以对这块空间进行解引用、访问等操作,但是我们是没有权利去析构的。这样就会避免因为多次析构同一块内存空间而造成程序崩溃。 因此我们采用另一种方法: 在类的成员变量里多添加一个bool类型原创 2017-03-28 16:18:33 · 188 阅读 · 0 评论 -
浅谈C++继承
关于C++有三大特性:封装、继承和多态关于继承我们可以实现代码复用减少工作量,在C++里面所谓继承就是在已经存在的类的基础上建立一个新的类。原有的类我们称为基类(父类),新类我们称为派生类(子类),这个新类从已有的类里获取已有类的特性,这种现象叫做继承派生类的声明为:class +派生类类名+ :+[继承方式]+基类名例1、公有继承的方式#include#includeclas原创 2017-02-24 22:23:08 · 449 阅读 · 2 评论