![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++
文章平均质量分 67
Everlasting2016
我流我的汗水,华丽如天花乱坠
展开
-
智能指针AutoPtr
问题:使用系统默认生成的拷贝构造,赋值运算符的重载会发生崩溃,一个指针delete多次的问题解决办法:一个对象给了另外一个对象,将自己释放掉(自己置空),自己释放管理权,保证只释放一次代码如下:templateclass AutoPtr{public: AutoPtr(T* ptr)//注意这里为T :_ptr(ptr) {} ~AutoPtr() {原创 2016-03-20 19:23:48 · 471 阅读 · 0 评论 -
理解dynamic_cast
dynamic_cast是c++中的一种强制类型转换1.详细解释dynamic_cast用于将一个子类对象的指针转换为父类对象的指针或引用(动态转换)向上转型:子类对象->父类指针/引用(不需要转换)向下转型:父类对象->子类指针/引用(用dynamic_cast转型是安全的)2、适用范围(1)dynamic_cast只能用于含有虚函数的类(2)dynamic_原创 2016-03-27 20:45:18 · 962 阅读 · 0 评论 -
二叉树之基本操作
一、存储结构1、静态结构只适合完全二叉树,或者一些节点缺省较少的情况,用数组来存储,对应下标的位置存储对应的值,如果缺省较多,则造成过多的空间浪费2.。动态结构(链式存储)分为二叉链和三叉连,三叉练主要是为了回溯,通过子节点找到父节点,本文主要实现的是二叉链二、节点的定义代码如下:templatestruct BinaryTreeNode{public: Bin原创 2016-05-02 23:18:53 · 497 阅读 · 0 评论 -
类模版的分离编译
一、.普通函数不需要分离编译而模版函数需要分离编译1、对于普通函数:vodi Fun()在Fun.h文件中声明如下:void Fun();在Fun.cpp中定义如下:#include"Fun.h"void Fun(){ cout << "Fun()" << endl;}测试用例如下:#include"Fun.h"void TestFun(){Fun原创 2016-05-15 22:32:23 · 579 阅读 · 0 评论 -
位图
一、题目.给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。 二、解题思路1、方法一;(直接遍历)将这些数字加载到内存中直接进行遍历,但是这种方法需要很大的内存空间,存入40亿个int类型的数字,大概需要开辟的内存大小大概是15G2、.方法二:(利用哈希表)利用哈希表可以直接进行定位,并且可以每个数字开辟一个char类型直原创 2016-05-20 10:08:29 · 405 阅读 · 0 评论 -
c++对象模型之菱形继承
当我们谈C++时,我们谈些什么? 封装,继承,多态。这是C++语言的三大特性,而每次在谈到继承时我们不可避免的要谈到一个很重要的问题——菱形继承。a.菱形继承是什么 如上图,菱形继承即多个类继承了同一个公共基类,而这些派生类又同时被一个类继承。这么做会引发什么问题呢,让我们来看一段代码吧#include using namespace s原创 2016-07-13 07:37:59 · 396 阅读 · 1 评论 -
继承与多态
访问限定符*继承访问控制的作用是将继承下来的成员在派生类域内的属性改变而和原本基类的成员访问控制符关。 所有的基类private成员在派生类里是不可见,但它确确实实被继承下来了。 基类的protected成员只对继承它的派生类可见,在类外不可使用派生类列表 在定义派生类的时候我们必须写出派生类列表,但在声明处不可写。1.虚函数的使用(多态的原创 2016-07-13 18:47:12 · 262 阅读 · 0 评论 -
《c++编程思想》读书笔记
以下为博主呕心沥血的总结,看的时候要珍惜一点,答应我!1.函数参数进栈顺序:从右到左2.字符串化预处理特征:在表达式前加上‘#’表示将仍和一个表达式转化成一个字符串。3.解析一个变量的类型:从中间向外扩展,先右再左,大多数的声明以左-右左完成(具体结合运算符的优先级来判断) eg: 1. void*( * ( *pfun )( in原创 2016-07-13 20:27:28 · 443 阅读 · 0 评论 -
int类型转换为string类型的两种方法
方法:先借助sprintf函数将int转换为char类型的数组,然后char*可以转换为string代码如下:#include #include using namespace std;int main(){ int n = 65535; char t[256]; string s; sprintf(t, "%d", n); s = t; cout <原创 2016-07-25 22:40:23 · 1665 阅读 · 0 评论 -
String类的深拷贝
class String{public: String(char* str="") :_str(new char[strlen(str)+1]) { cout << "String()" << endl; memcpy(_str, str, sizeof(char)*(strlen(str) + 1)); } ~S原创 2016-09-01 14:52:57 · 455 阅读 · 0 评论 -
打印虚函数地址的方法
类的定义如下:class Base{public: virtual void func1() { cout << "Base::func1" << endl; } virtual void func2() { cout << "Base::func2" << endl; }private: int a;};class Derive :public Base原创 2016-03-26 20:14:47 · 1092 阅读 · 1 评论 -
C语言实现顺序表
定义顺序表#define MAX_SIZE 5typedef int DataType;typedef struct SeqList{ DataType array[MAX_SIZE]; size_t size;}SeqList;实现的函数声明:void PrintSeqlist(SeqList* pSeq);void InitSeqList(SeqList* pSeq原创 2016-03-25 23:48:53 · 350 阅读 · 0 评论 -
智能指针SharedPtr
引用引用计数的浅拷贝代码如下:templateclass SharedPtr{public: SharedPtr(T* ptr)//这里是正确的,因为是new出来的对象,而String类不是new出来的对象 :_ptr(ptr) // 不写成这样将是错误的,你就新开辟了一份空间,不是以前的空寂 , _pCount(new long(1)) {} ~SharedP原创 2016-03-20 20:41:53 · 569 阅读 · 0 评论 -
智能指针ScopedPtr
防拷贝的两个条件:1、保护限定符;类外无法定义2.、显示进行声明不进行声明,系统将会自动生成默认的,是浅拷贝这种方法简单,粗暴。不让使用拷贝构造和赋值运算符重载,你进行使用会编译错误代码如下:templateclass ScopedPtr{public: ScopedPtr(T* ptr) :_ptr(ptr) {} ~ScopedPtr()原创 2016-03-20 20:06:01 · 391 阅读 · 0 评论 -
String类引用计数的浅拷贝
模拟new[ ] 在前面多开4个字节来存引用计数class String{public: String(const char* str="") :_str(new char[strlen(str) + 5]) { cout << "String()" << endl; _str += 4; _GetRefCount(_str) = 1; strcpy(_str,原创 2016-03-20 22:52:41 · 476 阅读 · 0 评论 -
String类的深拷贝
每个对象自己开辟自己的空间,自己释放自己的空间class String{public: String(char* str="") :_str(new char[strlen(str)+1]) { cout << "String()" << endl; memcpy(_str, str, sizeof(char)*(strlen(str) + 1)); } ~String原创 2016-03-20 22:57:42 · 450 阅读 · 0 评论 -
C语言实现单链表
单链表可以说是基础,有利于对指针的使用结点:typedef int DataType;typedef struct SlistNode{ DataType data; SlistNode* next;}SListNode;实现的函数的声明如下:SListNode* _BuyNode(DataType x);void PrintSlist(SlistNode*原创 2016-03-21 10:51:16 · 341 阅读 · 0 评论 -
C语言实现双链表
双链表一定要注意,前驱指针,Erase的时候,要判断next是否为NULL,要不然不能使用前驱指针实现了的函数的声明如下:ListNode* _BuyNode(DataType x);void PrintNode(ListNode* pHead);void PushBack(ListNode*& pHead, DataType x);void PopBack(ListNode*& p原创 2016-03-21 09:22:44 · 363 阅读 · 0 评论 -
is_a原则和has_a原则
一、is-A继承关系:“表示类与类之间的继承关系、接口与接口之间的继承的关系以及类对接口实现的关系”。has-A合成关系:“是关联关系的一种,是整体和部分(通常为一个私有的变量)之间的关系,并且代表的整体对象负责构建和销毁代表部分对象,代表部分的对象不能共享”二、is_a是继承关系,has_a是组合关系(描述一个类中有另一个类型的实例)简单的理解就可以这样:has-a 就是原创 2016-03-22 22:41:30 · 2395 阅读 · 0 评论 -
模拟实现new、delete和new[] 、delete[]
模拟实现new。deletevoid Test1(){ //1、分配空间 2.显示调用构造函数 AA* p1 = (AA*)malloc(sizeof(AA)); new(p1)AA; //NEW(P1+I)AA(参数列表); //3、析构函数 4、释放空间 p1->~AA(); free(p1);}模拟实现new[]。delete[]原创 2016-03-22 08:35:13 · 362 阅读 · 0 评论 -
c++继承与组合
一、如果类A 和类B 毫不相关,不可以为了使B 的功能更多些而让B 继承A 的功能。 不要觉得“不吃白不吃”,让一个好端端的健壮青年无缘无故地吃人参补身体。二、如果类B 有必要使用A 的功能,则要分两种情况考虑:(1)若在逻辑上B 是A 的“一种”(a kind of ),则允许B 继承A 的功能。如男人(Man)是人(Human)的一种,男孩(Boy)是男人的一种。那么类Man 可以原创 2016-03-23 17:36:10 · 429 阅读 · 0 评论 -
c++定制删除器
定制删除器其实是利用仿函数一、仿函数是什么?不是函数但可以像函数一样使用,因为重载了operator()简单举例:templatestruct Less{ bool operator()(const T& l, const T& r) { return l < r; }};void Test2(){ Lessless1; cout << less1(1,原创 2016-03-25 12:05:59 · 1406 阅读 · 0 评论 -
String的浅拷贝
class String{public: String(const char* str="") :_str(new char[strlen(str) + 5]) { cout << "String()" << endl; _str += 4; _GetRefCount(_str) = 1; strc原创 2016-09-01 14:54:59 · 424 阅读 · 0 评论