![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++
文章平均质量分 73
pawnsir
这个作者很懒,什么都没留下…
展开
-
c++日期类的实现级运算符的重载
今天写了简单的日期类,有兴趣的可以看一下 其声明Date.h:#define _CRT_SECURE_NO_WARNINGS 1#ifndef __ONCEDATE__#define __ONCEDATE__#includeusing namespace std;class Date{public:Date(int year = 1900, int mouth = 1, i原创 2016-05-28 18:35:30 · 511 阅读 · 0 评论 -
【探索】VS下虚继承实现的方法-1
C++的虚继承主要解决了数据冗余与二义性的问题,起实现方法是什么呢,我们先看一段代码。#includeusing namespace std;class A{public: int _num;};class B1 : public A{};class B2 : public A{};class C : public B1, public B2{};int ma原创 2016-05-28 18:36:13 · 423 阅读 · 0 评论 -
【探索】VS下实现虚继承的方法-2
上篇讲到VS下实现虚继承中成员变量的二义性与数据冗余的解决方案是怎样的,今天我们来看看虚继承的成员函数会如何。 首先,虚继承会不会重写成员函数?我们看一看如下代码:#includeusing namespace std;class A{public: void fun() { cout << "this is fun of A"<<endl; }};class B1 :原创 2016-05-28 18:36:15 · 330 阅读 · 1 评论 -
【代码】模板实现双向链表的去重、拼接、合并、排序
/* 模板实现双向链表的去重、拼接、合并、排序*/#pragma once#includetemplate struct Node{ T _data; Node *_next; Node *prev;};template class SeqList{public: SeqList() :_head(NULL), _tail(NULL) { } Seq原创 2016-05-28 18:36:18 · 604 阅读 · 0 评论 -
【干货】C++通过模板特化实现类型萃取实例--实现区分基本类型与自定义类型的memcpy
类型萃取是一种常用的编程技巧,其目的是实现不同类型数据面对同一函数实现不同的操作,如STL中cout的实现,它与类封装的区别是,我们并不用知道我们所调用的对象是什么类型,类型萃取是编译器后知道类型,先实现,而类的封装则是先定义类型,后实现方法。在这里我们可以用模板的特化实现其编程思想。 我们以memcpy为例,当我们拷贝的是基本类型时,只用拷贝所传递指针上的数据,如果是string类型呢,我原创 2016-05-28 18:36:21 · 975 阅读 · 0 评论 -
【代码】模板实现动态线性表(无类型萃取)
动态表的模板是STL库中最常用的数据结构,其代码如下:template class SeqList{public: SeqList() :_array(new T [3]), _size(0), _capacity(3) { memset(_array,0,sizeof(T)*3); } SeqList(const T &x) :_array(new T[3]),原创 2016-05-28 18:36:24 · 247 阅读 · 0 评论 -
【代码】模板动态线性表&类型萃取
当线性表这个数据结构用模板来完成时,若出现用户自定义类型(这里指的是会存在深浅拷贝的类型时如string),则这个模板的赋值运算符重载与拷贝构造就可能会出现BUG,这种BUG是源于对同一块地址进行了两次析构所导致的。为了解决这个问题,我们可以用类型萃取,当我们获取到的是不涉及深浅拷贝的线性表时,则我们调用普通的memcpy来完成复制,若涉及深浅拷贝,则我们用用户自定义类型已经重载过的赋值运算符进行原创 2016-05-28 18:36:29 · 294 阅读 · 0 评论 -
【干货】share智能指针的模拟实现
智能指针是C++实现自动内存管理的一种手段,本质是通过对象出作用域会自动析构,让对象保存与所需管理的目标指针指向同一片动态开辟空间的地址,出作用域会自动析构。这里模拟了,boost中的share智能指针,代码如下:#pragma oncetemplateclass SharePtr{public: SharePtr(T*ptr) :_ptr(ptr), _Rcount(new s原创 2016-05-28 18:36:32 · 479 阅读 · 1 评论 -
【一张大大的图片】类和对象知识点总结
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/7D/CA/wKiom1bv7fPxfqARAAHaswz2tms830.png" title="C++面向对象.png" alt="wKiom1bv7fPxfqARAAHaswz2tms830.png" /> 自己写的如果有什么不足或者是错误,希望指出,谢谢!本文出自 “pa原创 2016-05-28 18:36:35 · 280 阅读 · 0 评论 -
【总结】C++静态成员函数及测试用例
1.静态成员函数可以用普通函数指针储存,普通成员函数必须用类函数指针储存class A{public: static void fun() { cout << "hello world" << endl; }public: void fun2() { }};int main(){ void(*p)() = &A::fun;//用普通函数指针,正确 void (*p原创 2016-05-28 18:36:10 · 519 阅读 · 0 评论 -
【总结】C++静态成员变量的特性总结及测试用例
静态成员变量存放于数据段,在编译时产生,故有以下特性: 静态成员变量实际为类域中的全局变量,其初始化也应与全局变量一样,不能再头文件里初始化,应与全局变量初始化的方式一样,初始化时,静态成员变量不收访问限定符限定Test.cpp:class A{ static int _num;};int A::_num = 0;//初始化成功 静态成员变量被类内所有成员变量共享,也被派生类原创 2016-05-28 18:36:04 · 270 阅读 · 0 评论 -
C++复数类的运算符重载
在这里实现复数类运算符的重载,网上比较少的是对cout cin的重载,以及数学运算*,/,一下是我实现的声明:Complex.h:#ifndef __COMPLEX__#define __COMPLEX__#include using namespace std;class Complex{public:friend ostream & operator << (ostream& o原创 2016-05-28 18:35:33 · 583 阅读 · 0 评论 -
String类的实现与深浅拷贝问题
C++实现string类是理解类和对象这个概念的基础,也能了解C++语法的特性--用户对内存的自主管理,通过类创建出一个对象的过程,首先要调用构造函数,经过一系列的操作,当退出对象所在的作用域时,便会调用析构函数,C++支持隐式的调用构造、析构等函数,但经常隐式调用并不能正确的管理内存,所以我们需要重写这两个函数,以及拷贝构造,和赋值运算符的重载。 string类的结构设计 s原创 2016-05-28 18:35:41 · 446 阅读 · 0 评论 -
如何限制类仅能创建一个对象
方法一:利用引用计数:#include using namespace std; class Object { public: ~Object() { count=1; } Object() { if (count==0)原创 2016-05-28 18:35:44 · 334 阅读 · 0 评论 -
C++单链表的设计与实现
单链表是一种常见的数据结构,c++不同于C的语言特性是封装、继承和多态。若要实现单链表,首先我们要明确什么是单链表,链表是由一个或多个节点构成的,实现链表的数据结构,我们首先是要明确的是什么是节点。 节点是由数据+该节点类型的指针组成的,如下:class SeqNode{public: friend class SeqList;//定义友元类,使链表类能够访问节点类的私有成员 Se原创 2016-05-28 18:35:47 · 627 阅读 · 0 评论 -
双向链表的C++实现
由于单链表结构简单,但是操作起来比较复杂,所以就有了双向链表来替代单链表,其结构中比单链表多了一个指向前驱的指针,在逆序遍历上极大的提高了效率,其节点设计如下:typedef int DataType;class DSNode{public: friend class DNSList; DSNode(DataType x=0) :_data(x), _next(NULL),原创 2016-05-28 18:35:50 · 178 阅读 · 0 评论 -
【总结】逆置双向链表的三种方法
双向链表的遍历要比单向链表方便很多,所以逆置方法要比单链表丰富很多,因为可以从后向前遍历,所以可以像逆置数组一样进行操作,也可以根据单链表的特性进行逆置,也可以用双链表独有的特性进行逆置。具体方法如下: 链表的类定义如下:typedef int DataType;class DSNode{public: friend class DNSList; DSNode(DataType x原创 2016-05-28 18:35:55 · 4642 阅读 · 0 评论 -
【总结】C++基类与派生类的赋值兼容规则
在初步探索了C++继承的语言特性之后,总结下其赋值兼容规则:1.子类对象可以赋值给父类对象(切割/切片) 在公有继承的前提下,子类是可以赋值给父类对象的,为什么是共有继承(public),因为公有继承会产生“is-a”的关系,这种关系会导致子类中有结构的嵌套这父类的信息,。所以子类可以给父类赋值,期间会发生类似降级的事情,使得赋值成功。若为私有继承,则会产生“has-a”的关系,这种关系是从原创 2016-05-28 18:35:58 · 1970 阅读 · 0 评论 -
【总结】C++静态成员变量的特性总结及测试用例
静态成员变量存放于数据段,在编译时产生,故有以下特性: 静态成员变量实际为类域中的全局变量,其初始化也应与全局变量一样,不能再头文件里初始化,应与全局变量初始化的方式一样,初始化时,静态成员变量不收访问限定符限定Test.cpp:class A{ static int _num;};int A::_num = 0;//初始化成功 静态成员变量被类内所有成员变量共享,也被派生类原创 2016-05-28 18:36:01 · 361 阅读 · 0 评论 -
【智能指针的延伸】两种定制删除器的实现方法
所谓定制删除器,就是向目标模板提供一个可以自由选择析构的接口,这样做的好处就是可以使智能指针模板不再只能单独管理内存,我们还可以用它管理文件指针之类的东西。其实现方法有两种,这里我们以share指针为例。 1.传递一个类的模板参数并给出缺省值,模板中将该类设定为成员变量,通过该类(删除类)的实例化,调用类中所存的删除方法进行删除。 代码如下:#includetemplate str原创 2016-05-28 18:36:38 · 344 阅读 · 0 评论