c++
文章平均质量分 77
daidaihaha
这个作者很懒,什么都没留下…
展开
-
日期类的实现(其中包括构造函数,拷贝构造,赋值运算符重载,输出运算符重载,友元函数等等)
本篇博客主要是实现一个日期类,这就要求你必须对构造函数,拷贝构造函数,赋值运算符重载,输出运算符重载,友元函数等等都要熟悉#includeusing namespace std;class Date{public: Date(int year = 2000, int month = 1, int day = 1); Date(const Date&d); int IsL原创 2017-10-03 22:40:01 · 696 阅读 · 0 评论 -
智能指针底层简单剖析
很多人都误以为智能指针是一个指针,其实不是,智能指针不是指针,智能指针是一个模板类,由智能指针实例化出来的对象具有和常规指针相似的行为,但是他能够自动的释放所指向的对象,所以称之为智能指针,如果我们用普通指针来创建一个指向某个对象的指针,那么我们最后必须要手动释放这块空间,而智能指针它是一个类,它释放空间通过析构函数完成的,正是因为这一层封装机制,所以智能指针才能够管理一个对象的生命周期。一 :R...原创 2018-03-07 15:25:17 · 473 阅读 · 0 评论 -
模拟实现atof函数
atof()函数atof():double atof(const char* str);功能:把字符串转换成浮点数str:要转换的字符串返回值:返回值为double值。如果该输入无法转换为该类型的值,则返回值为0.0问题:1.跳过空格字符 2.记录正负值 3.遇到数字才开始转换,如果是非数字或字符串结束('\0')结束转换 #include<iostrea...原创 2018-02-28 21:52:16 · 507 阅读 · 0 评论 -
模板
一 :概念:模板是泛型编程的基础,所谓泛型编程就是编写与类型无关的逻辑代码,是一种复用的方式,模板分为模板函数和模板类二:模板函数1:模板函数格式: 2:模板函数的实例化<1>.隐式实例化------》推演为实例化一个步骤,推演形参类型<2>显示实例化三:模板类1:模板类格式:2:模板的模板参数------容器适配器,在上一篇博客中有四 : 非类型模板参数对于函数模板和类模...原创 2018-03-09 09:18:53 · 215 阅读 · 0 评论 -
C++模板的特化(函数模板特化,类模板特化)与实例化区别联系
一:实例化什么是实例化:一个通过使用具体值替换模板参数,从模板产生的普通类,函数的过程1.显示实例化:通过指定的类型,表明要实例化的类型2.隐式实例化:通过编译器自己推演,判断出要实例化的类型 二 :特化=具体化类模板特化类模板template<class T1,class T2>class Date{public:Date(){ cout << "Dat...原创 2018-03-09 14:41:43 · 2020 阅读 · 0 评论 -
类型萃取
在C++中我们可以通过typeid来获取一个类型的名称(内置类型和自定义类型都可以)但是我们不能用这种方式获取来的名称做变量的声明。这就用到了类型萃取。例如:我们在Seqlist中要用到类型萃取,因为内置类型我们可以通过memmove进行拷贝,例如string类我们要通过赋值的方式进行拷贝。类型萃取原理:在模板的基础上区分内置类型和其他类型,主要原理是将内置类型全部特化,然后再进行区分原创 2018-03-09 19:13:22 · 215 阅读 · 0 评论 -
shared_ptr循环引用问题与仿函数实现定制删除器
一 shared_ptr的循环引用问题一:智能指针发展历史智能指针发展历史:二:shared_ptr中的循环引用问题我们前面博客都已经了解了shared_ptr是采用引用计数的方式进行,但是它存在一个问题,就是循环引用,通过底下例子我们来详细看看。struct ListNode{ int _data; ListNode* _next; ListNode* _prev; ~ListN...原创 2018-03-16 20:45:54 · 224 阅读 · 0 评论 -
模板实现顺序表
一 :SeqList.h#pragma once#include<iostream>#include<assert.h>#include <string>using namespace std;template <class T>class SeqList{public: SeqList() :_a(NULL) , _...原创 2018-03-03 15:09:20 · 213 阅读 · 0 评论 -
模板实现双向循环链表
List.h#pragma once#include<iostream>using namespace std;#include<assert.h>//template <class T>//struct ListNode//{//// T _data;// ListNode<T> *_prev;//注意ListNode<T...原创 2018-03-03 22:58:21 · 175 阅读 · 0 评论 -
适配器适配栈和队列
适配器:其他容器转换适配出来,此篇博客就是用双向链表和顺序表适配出栈和队列Queue.h#pragma onceusing namespace std;#include"List.h"#include"SeqList.h"template class Queue{public: void Push(const T&x) { _con.PushBack(x); }原创 2018-03-05 20:18:54 · 206 阅读 · 0 评论 -
如何不用加法,实现两个数相加
首先我们先看5和7相加。a 5 二进制 101 b 17 二进制 10001a+b 22二进制 10100第一步:让a^b得到 10100 与a+b答案相比没有算进位第二步:让a&b得到 00001 (a&b)记录进位原创 2018-03-05 21:15:18 · 1558 阅读 · 0 评论 -
"" "\0" '0' '\0' 0 NULL “NULL” 区别与联系
一:字符'0' :char c='0',它的ASCII码为值48,内存中存放00110000字符'\0' :char c='\0',它的ASCII码值为0,表示一个字符串结束的标志(转义字符)数字0 :它的ASCII码值为0,字符表示空字符,数值表示为0,内存中表示00000000二:在数值上NULL ,‘\0' , 0是一样的,都是0.但是'0'就不同了,在ASCII中编码为48. 三:...原创 2018-04-23 16:34:37 · 1186 阅读 · 0 评论 -
C++中动态内存管理 new/delete 和new[]/delete[] 和 malloc/free
首先我们先要了解,动态内存是在堆上分配的,内存大小可以变化。动态内存的分配很好的解决了传统静态内存分配不能动态增长的缺陷(静态内存分配是在栈上,由系统自动释放)而且栈来说相对较小(为什么栈较小,假如一个函数递归死循环,会产生栈溢出,如果栈小很快就会栈溢出停下来,而如果栈很大的话,就要很久才会出错)一 C语言中的动态内存管理void *malloc ( size_t n)--------...原创 2018-04-23 16:44:13 · 426 阅读 · 0 评论 -
如何实现一个不能被继承的类,如何实现一个只能在堆上生成对象的类,如何实现一个只在栈上生成对象的类
一 如何实现一个不能被继承的类1.类的构造函数给成私有的。2.并且在父类中给一个静态的函数构造对象原因:1.保证了父类的构造函数在子类不可见,但是子类的构造函数是要调用父类的构造函数来合成。 2.但是此时出现了一个问题,把这个类的构造函数弄成私有的,虽然子类不能构造出对象,但是这个类也不能构造出对象了 因此提供一个静态的公有函数来构造对...原创 2018-07-17 19:50:48 · 280 阅读 · 0 评论 -
C++中异常处理
传统的错误处理方法1.终止程序(例如segment error)2.返回错误码3.返回一个合法值,让程序处于非法的状态4.调用一个预先设置的出现错误时掉的函数-------回调函数异常处理异常,当一个函数发现自己无法处理的错误时,抛出异常,让函数的调用者直接或者间接的处理这个问题异常的抛出和捕获1.异常是通过抛出对象引发的,该对象的类型决定了应该激活哪个处理代码...原创 2018-08-06 16:49:10 · 283 阅读 · 0 评论 -
C++11新特性
一 auto/decltype:自动推导类型之前的C++标准库里面,必须显示指定变量的类型,然而随着模板类型的出现,某些东西的类型,尤其是函数参数的返回值不是那么容易表示。在这种情况下,将中间结果存储在某个变量中是件很困难的事,要去了解模板的内部结构。c++11提供以下方式两种来缓解上述问题1.定义有显示初始化变量可以用auto来自动确定变量类型2.decltype可以用来在编译期...原创 2018-08-28 15:23:04 · 1126 阅读 · 0 评论 -
c++四种强制类型的转换
在C语言中我们学习过隐式类型转换(相关类型),以及显示的强制类型转换(不相关类型)void test(){ int i = 1; double d = i;//隐式类型的转换(相关类型) printf("%d,%.f\n", i, d); int *p = &i; int address = (int)p;//显示的强制类型转换(不相关类型) printf("%x,%...原创 2018-08-28 17:45:06 · 228 阅读 · 0 评论 -
c语言模拟实现c++继承和多态
本题主要考的是C语言,和C++的区别,以及C++中继承和多态的概念C语言和C++的区别一 C语言是面向过程的语言,C++是基于面向对象的语言(注意:不是纯面向对象,因为兼容C语言)1 面向过程:面向过程就是分析解决问题的步骤,然后用函数把这些步骤一步一步的进行实现,在使用的时候进行一一调用就行了,注重的是对于过程的分析。 面向对象:就是指把构成问题事务分解成各个对象,建原创 2018-02-07 21:42:38 · 333 阅读 · 0 评论 -
类和对象之再体验-------const&内联&静态成员&友元
一 const修饰成员函数先看下我们之前对const的了解 在成员函数后面加const,const修饰this指针所指向的对象,也就是保证调用这个const成员函数的对象在函数内不会改变const对象不能掉非const成员函数(对象本来不能改,调非const可以改权限放大不可以),const对象可以调const成员函数非const对象可以调const成员函数(权限缩小可原创 2018-01-29 22:40:30 · 241 阅读 · 0 评论 -
实现一个复数类
首先我们先了解一下复数的运算1.加法运算:(a+bi)+(c+di)=(a+c)+(b+d)i2.减法运算:(a+bi)-(c+di)=(a-c)+(b-d)i3.乘法运算:(a+bi)*(c+di)=(ac-bd)*(ad+bc)i4.除法运算:(a+bi)/(c+di)=(ac+bd)/(c^2+d^2)+(bc-ad)i/(c^2+d^2)下来是代码#includ原创 2017-10-03 23:02:32 · 669 阅读 · 0 评论 -
继承那些事
继承概念:通过继承机制,可以利用已有的数据类型来定义新的数据类型,新的数据类型不仅拥有新定义的成员,而且同时还拥有旧的成员。我们称已存在的用来派生新类的类称为基类(父类),派生出来的新类称为派生类(子类)。继承方式:1.公有继承(public)公有继承特点:基类的公有成员,和保护成员,私有成员作为派生类的成员时,他们 都保持原有的状态。2.私有继承(private)私有继承的特原创 2017-10-14 15:44:09 · 263 阅读 · 0 评论 -
如何实现一个不能被继承的类
首先我们要知道,在c++中,子类的构造函数会调用基类的构造进行合成,要想一个类不被继承,只要把它的构造函数定义成私有,子类就没有办法访问基类构造函数,从而就阻止了进行子类构造对象可是问题又来了,你把一个类的构造函数定义为私有的,那它自己也定义不出对象,这该如何解决。这时我们想到了静态函数,静态成员函数没有this指针,可以通过类直接访问。#includeusing namespace s原创 2018-01-31 23:15:18 · 637 阅读 · 0 评论 -
引用相关知识,普通引用,常引用,引用作为参数,引用作为返回值等等
引用概念:引用不是新定义一个变量,而是给以存在的变量取了一个别名,编译器不会为引用变量开辟内存空间,引用和它所引用的变量共用同一块内存空间。引用的特性:1.引用在定义时必须初始化 2.一个变量可以有多个引用 3.引用一旦绑定了一个实体,就不能再成为其他变量的引用如图即可知道abcd表示同一块空间原创 2018-01-24 20:56:00 · 969 阅读 · 0 评论 -
指针和引用的区别
指针与引用的区别与联系:区别:1.引用只能在定义时初始化一次,之后不能改变指向其他变量(从一而终);指针变量的值可变。2.引用必须指向有效的变量,指针可以为空。3.sizeof指针对象和引用对象的意义不一样。sizeof引用得到的是所指向变量的大小,而sizeof(指针)是对象地址的大小。 sizeof(指针)在32位平台是 4,在64位平台是8.4.指针和引用自增(++)原创 2018-01-25 18:50:40 · 267 阅读 · 0 评论 -
构造函数,拷贝构造的优化相关问题
话不多说,直接看题,先看简单一点的。第一题:#includeusing namespace std;class Date{public: Date() { cout << "Date()" << endl; } Date(const Date& d) { cout << "Date(const Date& d)" << endl; } Date& operat原创 2018-02-01 18:58:11 · 164 阅读 · 0 评论 -
c++初识,c++与c语言区别。及函数重载,缺省值等等
1.关键字数量不同2.文件区别,即后缀名不同c语言后缀名为.cc++后缀名为.cpp3.返回值不同c语言,如果一个函数没有指定返回值类型,默认返回值类型为int,c++,如果一个函数没有指定返回值类型,默认返回值类型为void4.参数列表c语言中,函数没有指定参数列表时,默认可以接收任意多个参数。c++中,因为严格的参数类型检测,没有参数列表的函数,默认为voi原创 2017-09-25 19:03:27 · 759 阅读 · 0 评论 -
继承-----新
继承是面向对象复用的重要手段,通过继承定义一个类继承是类型之间的关系建模,共享公有的东西,实现各自本质不同的东西。在前面我们学到类和对象的时候有三种访问限定符,1.public(公有)2.protected(保护)3.private(私有),当时学的时候我们知道,在类外protected和private不能被访问,可是那为什么,还要定义一个protected呢?告诉你吧,他们在继承中体现了不一原创 2018-01-31 21:20:40 · 157 阅读 · 0 评论 -
类和对象基础知识整理
c语言面向过程----------------》就是“变量”和“函数”是分开的c++基于面向对象(不是纯面向对象,包括c语言,c语言是面向过程)---------------》对象指的是类的实例,将对象作为程序的基本单元,将函数(程序)和变量(数据)封装其中,提高软件灵活性,扩展性,重用性。面向对象三大特性:封装 继承 多态1.定义一个简单的类2.成员函数的声明和定义原创 2018-01-26 09:52:55 · 571 阅读 · 0 评论 -
类的默认成员函数,构造函数,拷贝构造,析构函数,赋值运算符重载
1.隐含的this指针1.每个成员函数都有一个指针形参,她的名字是固定的,成为this指针,this指针是隐式的。(构造函数比较特殊,没有这个隐含的 this指针)2.编译器会对成员函数进行处理,在对象调用成员函数时,对象地址作为实参传递给成员函数的第一个形参this指针3.this指针是成员函数隐含指针形参,是编译器自己处理的。我们不能在成员函数的形参中添加this指针的参数定义,原创 2018-01-26 15:53:04 · 313 阅读 · 0 评论 -
深入探索构造函数--------------之构造函数初始化
一 类的成员变量有两种初始化方式: 1.初始话列表 2.构造函数体内进行赋值 但是尽量使用初始化列表进行初始化,因为它更高效,为什么更高效呢? #includeusing namespace std;class Time{public: Time() { cout << "Time()" << endl; } Time&op原创 2018-02-02 18:42:03 · 219 阅读 · 0 评论 -
重写,重载,重定义的区别,联系
原创 2018-02-03 11:20:05 · 167 阅读 · 0 评论 -
虚函数和多态
一 虚函数:在类的成员函数前面加上virtual关键字,则这个成员函数称为虚函数 注意:只有类成员函数加virtual才能称为虚函数,普通函数不可以二 虚函数的重写:在子类定义了一个与父类完全相同的虚函数时,则称子类的这个函数重写(覆盖)了父类的这个虚函数三 多态的两个条件:1.虚函数重写(覆盖 ) 两个要求(1)虚函数 (2)函数全都相同(参数,原创 2018-02-03 12:05:42 · 210 阅读 · 0 评论 -
多态&多态对象模型&虚函数表
所谓多态,就是指多种形态C++中虚函数的主要作用就是实现多态,简单说,父类的指针/引用调用重写的虚函数,当父类指针/引用指向父类对象时,调用的是父类的虚函数,指向子类对象调用的是子类的虚函数。虚函数表虚函数表(虚表)是通过一块连续内存来存储虚函数的地址,这张表解决了继承,虚函数(重写)的问题。在有虚函数的对象实例中都存在一张虚函数表,虚函数表就像一张地图,指名了实际应该调用的虚函数地址原创 2018-02-05 18:00:16 · 246 阅读 · 0 评论 -
深拷贝与浅拷贝
一 深浅拷贝概念首先明白深浅拷贝是针对拷贝构造函数和赋值运算符重载而言的所谓浅拷贝,就是由默认的拷贝构造函数所实现的对数据成员依次赋值,若类中含有指针类型的 数据,这种方式只是简单的把指针的指向赋值给新成员,但并没有给新成员分配内存导致两个成员指针指向同一块内存,要是再分别delete释放时就会出现问题,因此这种方式必然会导致错误,为了解决浅拷贝出现的错误,必须显示定义一个拷贝构造函原创 2018-01-29 18:24:23 · 263 阅读 · 0 评论 -
extern关键字的用法
在进入今天博客正文之前,我们先来说一些基础的概念。一 编译模块对于编译的一些概念很多然已经不再清楚了,很多程序员最怕的是处理连接错误(LINK ERROR),因为它不像编译错误那样可以给出你程序错误的具体位置,这时你就特别崩溃。当在VS这样的开发工具上编写完代码,点击编译生成exe文件时,VS其实做了两步工作,第一步:将每个.C(.Cpp)和相应的.h文件编译成obj文件 第二步:将工程中...原创 2018-02-10 09:13:57 · 504 阅读 · 0 评论 -
谈谈你所了解的封装继承多态?
封装把数据和方法封在一个单元中(称之为类),不想让你看到我就封装成私有的(限制别人去做)提供公共的通道供你访问其实封装本质上就是一种管理,,约束掉自由散漫的访问行为,通过规范的行为做这件事,就像火车站管理一样,你不能随意的进入,如果大家都随意上车,那岂不是乱套了,把火车站封装起来,提供统一通道。封装的意义封装的意义在于保护或者防止代码(数据)被我们无意中破坏,我定义为私有,你没法访问,...原创 2018-08-30 12:42:03 · 353 阅读 · 0 评论