C++
文章平均质量分 67
douguailove
让不可能变成可能,让可能变成超越期待
展开
-
mallloc/free和new/delete的区别与联系
首先我们来回顾一下在C语言中有哪些可以用于动态内存开辟的函数:注意:这三个函数一定要和free()函数配对使用,否则会造成内存泄漏。原创 2017-09-17 16:53:15 · 583 阅读 · 0 评论 -
多种方法实现加法求和
题目:求1+2+3+……+n的和,要求不能使用乘除法、循环、条件判断、选择相关的关键字。首先来回忆一下求1+2+3+……+n的和的最基础的几种解法:法1:int Sum(int n){ int sum = 0; while (n) sum += n--; return sum;}法2:int Sum(int n){ return (1 + n)*n...原创 2018-03-04 22:36:07 · 635 阅读 · 0 评论 -
不用+-*/实现加法运算
题目:实现一个Add函数,让两个整数相加,但是不能使用+ - * /等四则运算符。 从题目来看这道题还是比较苛刻了,其实解决起来也不难。既然不能使用四则运算,应该是本能的就想到使用位操作了。首先来讲解一下大致的思路,使用 异或^ 操作来完成对应位相加操作,再使用 按位与& 操作来记录有进位的位,将按位与&的结果左移一位来完成进位。将这两个操作放到一个循环中,直到没有进位为...原创 2018-03-04 23:49:19 · 1345 阅读 · 0 评论 -
实现一个类只能在栈(堆)创建对象
禁用new运算符实现只能在栈上创建对象的类 其实只要不使用new操作符,类创建出来的对象就是在栈上创建的。但是,当你声明了一个类,难免会使用new操作符去创建一个对象,就算你能保证自己不使用new,也难以保证别人不去使用new。为了保证一个类的对象都是在栈上创建,那么,最有效的方式就是在代码中禁止使用new操作符。怎么实现禁用new操作符呢?其实很简单,将new和delete进行重载,...原创 2018-03-21 23:18:24 · 538 阅读 · 0 评论 -
SGI一级空间配置器的简单介绍与实现
#pragma once#include <new>#include <iostream>using namespace std;#define THROW_BAD_ALLOC cerr<<"out of memory"<<endl;exit(1)template <int inst>class Alloc_malloc_...原创 2018-05-29 17:12:36 · 322 阅读 · 0 评论 -
二级空间配置器的原理剖析和简单实现
首先来讲一下频繁地向系统申请小内存块的缺点 用户代码与操作都是在用户态,而操作系统是属于内核态的,用户在向系统申请空间的时候是通过操作系统来申请的,所以,每一次空间申请就会进行用户态与内核态之间的切换,会大大降低效率。 系统在将一块空间交给用户去使用的时候,并不是就将这块空间交给用户就行了,这块空间是可读的还是可写的,有多大等相关信息都要告知用户,所以,还会有额外的开销,每一块...原创 2018-06-06 18:22:03 · 862 阅读 · 0 评论 -
Effective C++读书笔记---让自己习惯C++
* 声明式是告诉编译器某个东西的名称和类型。* 签名式是指参数和返回值。一个函数的签名等同于该函数的类型(C++对签名式的官方认定不包括返回值)* 将函数声明为 explicit ,可以阻止他们被用来执行隐式转换,但他们仍可以用来进行下你是类型转换 * 其他静态成员只能在类里边进行声明,类外进行初始化。格式为: 类域::类型 变量名 = 初始值* 类的静态常量成员可以在类里边进行初始...原创 2018-07-29 16:53:47 · 481 阅读 · 0 评论 -
Effective C++读书笔记----构造/析构/赋值运算
对于一个空类,编译器会自动创建构造函数、拷贝构造函数、赋值运算符重载以及析构函数。(当然只有在这些函数在被调用的时候才会被编译器创建出来)如果我们在类中显示的声明了这些函数,编译器将不再自动生成这些函数。当类的成员变量中有引用类型或者有const修饰,编译器不会为该类生成赋值运算符重载函数,尽管该类并没有显示的声明赋值运算符重载。想要防止拷贝可以显示声明拷贝构造函数,并将其设为私有,并且,只...原创 2018-07-30 18:14:52 · 297 阅读 · 0 评论 -
Effective C++读书笔记----资源管理
C++中,我们自己申请的资源,需要我们手动的释放。有时候我们给了显示释放资源的语句,但是存在有些意外情况导致释放语句没能成功被执行。比如说在执行释放语句前函数提前返回;假如释放语句在一个循环内部,循环因为continue或者break提前结束;执行释放语句之前程序抛异常了。为了防止资源泄漏,请使用RAII对象(资源获得即初始化),他们在构造函数中获取资源,并在析构函数中释放资源。auto_...原创 2018-08-04 11:15:07 · 189 阅读 · 0 评论 -
Effective C++ 读书笔记----接口和类的设计
设计接口时要让接口容易被正确使用,不易被误用。应该让接口具有如下这些性质: “促进被正确使用”,接口的一致性(比如STL中各个容器的接口)以及与内置类型的行为兼容。自定义的类型支持的操作尽量与内容类型的使用保持一致。“阻止误用”的办法包括建立新类型、限制类型上的操作,束缚对象值,以及消除对象的资源管理责任。消除对象的资源管理责任。比如说,如果某个函数返回一个指向动态开辟的内存的指针,要求调...原创 2018-08-05 09:59:23 · 192 阅读 · 0 评论 -
斐波那契数列的四种实现方式以及时间、空间复杂度
首先来介绍一下斐波那契数列: 斐波那契数列(Fibonacci sequence),又称黄金分割数列。因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”。指的是这样一个数列:1、1、2、3、5、8、13、21、34、…… 从定义可以看出斐波那契数列就是第一二项都是1,从第三项开始,每一项为前两项之和。那么要...原创 2017-11-25 13:26:07 · 5250 阅读 · 0 评论 -
实现类的单例模式的两种简单方式
类的单例模式就是保证一个类仅有一个实例,并提供一个访问它的全局访问点。 说到设计一个类只能有一个实例,相信很多人第一反应都会想到类的静态成员,毕竟类的静态成员有着自己的特性,它是被所有类对象共享的,也就是他只有一份,而且类的静态成员变量是必须在类外进行初始化的。在了解了这两个特性之后(当然类的静态成员还有很多特性),再来看看怎么通过类的静态成员实现类的单例模式的饿汉模式和懒汉模式。 饿汉模式单例原创 2017-11-22 17:40:51 · 3314 阅读 · 0 评论 -
C++知识总结
原创 2017-11-15 15:32:27 · 238 阅读 · 0 评论 -
类的继承
继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员程序员在保持原有类特性的基础上进行扩展,增加功能。通俗地说就是在一个已经存在的类的基础上建立一个新的类,已存在的类称为“基类”或“父类”,新建立的类称为“派生类”或“子类”。一、继承关系1、继承的定义格式为:2、基类成员在派生类中的访问属性:public 继承:基类的public 成员和 p原创 2017-10-01 13:19:48 · 327 阅读 · 0 评论 -
C++实现简单顺序表
顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。即线性表采用顺序存储的方式存储就称之为顺序表。在C语言中,我们通过创建一个结构体的方式来实现了顺序表,在C++中可通过创建一个类的形式来创建一个顺序表。直接来看代码:#include using namespace std;#include typedef int DataTyp原创 2017-10-01 12:26:36 · 3427 阅读 · 0 评论 -
C++简单实现双链表
首先,来了解一下什么是双向链表。官方解释是这样的:双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。来一波图: 由上图可以看出:其实双向链表是由很多个节点组成的,而每一个节点又分为三个部分,一个数据域,用于存放数据;两个指针,一个用于指向前一个节点,另一个用原创 2017-10-01 13:20:22 · 566 阅读 · 0 评论 -
浅谈static关键字和extern关键字
一、static关键字 在C语言中 static可以用来修饰局部变量,全局变量和函数。不同情况下作用也不同。 (1)、修饰局部变量 局部变量一般存放于栈中,其作用域和生命周期都是在其定义的代码块内。当用static修饰局部变量时,它的生命周期会延长整个程序,且存放到了静态数据区。但是其作用域并没有发生改变,任然是局部变量。 ...原创 2017-10-02 14:58:50 · 671 阅读 · 0 评论 -
C++类型萃取
在利用模板来实现容器vector的时候,由于是泛型编程,所以参数类型是可以说是任意的,而当我们希望实现对一块连续空间进行拷贝的时候,有两种实现方式,一种是memcpy函数实现,另一种则是通过for循环一个一个赋值。 memcpy是一种很高效的方式,但是,当拷贝自定义类型时就会牵扯到深浅拷贝的问题,因为memcpy的实现方式是浅拷贝,在释放内存的时候往往会因为多次释放同一块内存而导致程序崩溃。原创 2017-10-28 19:34:36 · 250 阅读 · 0 评论 -
模板与泛型编程
当我们希望可以用同一个函数处理不同类型的参数时(比如写一个加法函数,可以处理各种不同类型的数据)都有哪些方法呢?1、函数重载(同一作用域;函数名相同;参数列表不同)缺点: a、只要有新类型出现,就必须添加对应的函数 b、除了类型外,所有的函数体都相同,代码的复用率太低 c、如果只是返回类型不同,函数重载不能实现 d、一原创 2017-10-21 17:25:02 · 2495 阅读 · 0 评论 -
多态
什么是多态?多态的定义 多态按字面的意思就是“多种形态”。在面向对象语言中,接口的多种不同的实现方式即为多态。比如说上厕所,男生进男厕所,女生进女厕所。同为上厕所,性别不同去的厕所就不一样,这就是多态。多态的分类 多态的类型是根据对象的类型来决定的,而对象的类型分为静态类型和动态类型。静态类型是对象声明时的类型,在编译时就确定了;动态类型是指对象实际引用或指针...原创 2017-10-14 11:32:24 · 290 阅读 · 0 评论 -
模板类实现顺序表
顺序表在前边已经实现过很多次了,在这里就不多做介绍了,本文主要讲解如果利用模板类的方式实现顺序表和一个顺序从另一个顺序表拷贝内容时的一些注意事项。PS:本文统一采用的是利用for循环一个一个赋值的形式。直接来看代码:头文件和函数声明 Vector.h 部分#include using namespace std;#include template class Ve原创 2017-10-16 20:54:25 · 571 阅读 · 0 评论 -
动态创建二维数组的两种方法
首先来讲解一下什么是二维数组。其实二维数组也可以说是一个一维数组,只是这个一维数组比较特别,它的每一个元素都是一个一维数组。虽然二维数组在底层是按照一维数组的存储方式来存储的,即存完第一行,紧跟着存第二行,后边依次存储剩下的行。但是我们习惯上把它看做矩阵,一般也选择让他以矩阵的方式呈现在我们眼前,所以二维数组也称为矩阵。方法1既然二维数组也可以称为矩阵,那么我们就可以给二维数组的每一行...原创 2017-11-18 10:44:39 · 38295 阅读 · 3 评论 -
C语言和C++的区别(函数重载)
C和C++的区别主要分为三部分: 接下来详细介绍一下函数部分的区别1、返回类型 2、参数列表此外,在C++中还支持缺省参数,而C语言不支持。什么是缺省参数呢?缺省参数是声明或定义时为函数的参数指定一个默认值。在调用函数时,如果没有指定实参,则采用该默认值,否则使用指定的的实参。原创 2017-10-02 13:32:21 · 1099 阅读 · 1 评论 -
Effective C++读书笔记----自定义类型的传参和返回值问题
对于自定义类型,传参的时候尽可能的使用传引用来代替传值。看如下这个例子:#include <iostream>using namespace std;#include <string>class Person{public: Person()//默认的构造函数,如果不给,没法通过编译,因为在创建一个派生类的对象是需要调用。 { ...原创 2018-08-05 13:18:13 · 318 阅读 · 0 评论