c++
文章平均质量分 60
xuzhangze
这个作者很懒,什么都没留下…
展开
-
类之构造函数与析构函数
类的构造函数与析构函数是类中非常重要的两个成员函数,这两个函数都是由系统自动调用,而且在对象的声明周期中都只调用一次,当没有显示定义这两个函数时,系统就会生成默认的来进行调用,也就是说这两个函数是必须有的,本文则是对这两个函数进行探讨。一、构造函数 构造函数是一个特殊的成员函数,其名字与类名相同,创建对象时由系统自动调用,而且在对象的整个生命周期内只调用一次以保证对象的每个数据原创 2017-09-14 22:53:05 · 693 阅读 · 0 评论 -
派生类对象模型之虚继承派生类对象模型
虚继承的出现是为了解决菱形继承的二义性和数据冗余问题。什么是菱形继承的二义性和数据冗余问题呢?我们先给出一个菱形继承关系:class A{public: A() : a(0) { std::cout << "A()" << std::endl; } int a;};class Base1 : ...原创 2018-03-13 23:57:55 · 231 阅读 · 0 评论 -
派生类对象模型之菱形继承派生类对象模型
当继承关系超过两重后,就不可避免地出现菱形继承的问题,什么是菱形继承呢?我们来看一个图: 像这样,类B1、B2继承自类A,而类C又与类B1、B2是多继承的关系,整个继承关系呈菱形,这就是菱形继承。那么菱形继承存在什么问题呢?先给出这样一个继承关系:class A{public: A() : a(0) { std::cout <...原创 2018-03-13 20:34:50 · 380 阅读 · 0 评论 -
派生类对象模型之多继承派生类对象模型
C++是支持多继承的,那么多继承关系中派生类对象模型和单继承关系中有什么不一样呢?我们来看一看。 首先给出一个多继承关系:class Base1{public: Base1() : b1(1) { std::cout << "Base1()" << std::endl; } int b1;};...原创 2018-03-13 18:01:26 · 290 阅读 · 0 评论 -
派生类对象模型之单继承派生类对象模型
继承作为C++三大特性之一,无疑是非常重要的,而深入内存,弄懂派生类对象模型又是重中之重。本文我们来看看单继承中的派生类的对象模型。 首先我们建立一个简单的继承体系:class Base{public: Base() : b(1) { std::cout << "Base()" << std::endl; ...原创 2018-03-13 17:09:55 · 294 阅读 · 0 评论 -
进程间通信之管道
我们将一个进程到另一个进程的数据流称为管道,它是进程间通信最古老的方式。 管道分为两种:匿名管道与命名管道。 匿名管道 顾名思义,所谓的匿名管道自然就是没有名字的管道,这种管道通常用于有亲缘关系的进程间的通信。匿名管道通常由pipe函数来创建,当一个进程创建了一个匿名管道后,它们的模型就是这样的: 可以看出,仅连接了一个进程的管道于这个进程而言是无意义的,所以通常还会在创建管道后调用f...原创 2018-03-16 13:03:48 · 247 阅读 · 0 评论 -
派生类对象模型之单继承关系中的虚表剖析
我们都知道C++中利用虚函数实现动态多态,而这里多态的实现又于虚表(要与虚继承中的偏移量表区分开)有关,因此,在这里我探讨一下简单含虚函数的单继承关系中派生类对象模型与虚表问题。 首先给出如下继承关系:class Base{public: Base() : b(1) {} virtual void Print() { std...原创 2018-03-15 13:33:40 · 409 阅读 · 0 评论 -
替换字符串中的空格
替换字符串中的空格的方法有很多,在这里我们实现一种时间复杂度与空间复杂度都为O(N)的方法,使用C++语言实现。 例如字符串talk is cheap show me the code,我们要将其替换为talk***is***cheap***show***me***the***code,并且打印到屏幕上。 方法论述: 定义一个字符型指针str,用于遍历字符串。再定义两个size_t型变原创 2018-02-05 17:34:38 · 724 阅读 · 0 评论 -
设计一个不能被继承的类
要设计一个类不能被继承有很多种方法,这里实现一种非常简单且常见的方法。我们知道类的私有成员不能在类域外被调用,那么如果将类的构造函数和析构函数都放入类的私有成员中,在子类调用基类的构造函数和析构函数时就会发生编译错误,这样的基类就是不能被继承的类。 当然,这个类也不能直接实例化,而是通过特殊的方法来得到这个类的实例,我们来看这个不能被继承的类:class SealedClass{pr原创 2018-01-28 20:47:39 · 554 阅读 · 1 评论 -
继承
得到钱的最快的方式是什么?答曰:继承!这个网络段子程序员都听过,今天就来学习一下c++中的继承。什么是继承? C++中继承的概念:继承机制是面向对象程序设计使代码可以复用的最重要的手段,他允许程序员在保持原有类的基础之上进行扩展,增强其功能。这样产生新的类称为派生类或子类,被继承的类称为基类或父类。继承的定义格式: 与类成员的访问类型相似,继承可分为publ原创 2017-10-01 11:47:31 · 409 阅读 · 0 评论 -
多态
什么是多态? 顾名思义,多态就是多种形态。说得准确一点就是同一种事物在不同环境下的不同形态。多态分类 我们知道对象的类型有静态类型和动态类型。静态类型就是对象定义时所采用的类型,在编译期间确定;动态类型就是当前所指的类型,在运行时确定。由此可引出对象的静态绑定和动态绑定。静态绑定又名前期绑定,所引用的函数或属性依赖于对象的静态类型,其发生在程序编译时;动态绑定又原创 2017-10-12 20:42:22 · 434 阅读 · 0 评论 -
泛型编程之模板
泛型编程 泛型编程是指编写与类型无关的逻辑代码,是代码复用的一种手段。进行泛型编程的基础是模板。模板 这里的模板与我们生活中的模板类似,我们可以用一个模板产生非常多的实例,比如印刷试卷时,机器上用一个模板可以印刷成千上万张试卷,在这里我们也可以用一个模板来产生很多代码。 模板分类;函数模板初介绍 一个函数模板代表着一种函原创 2017-10-21 11:42:16 · 309 阅读 · 0 评论 -
C++之类型萃取
类型萃取有什么用? 类型萃取一般用于模板中,当我们定义一个模板函数后,需要知道模板类型形参并加以运用时就可以用类型萃取。 比如我们需要在函数中进行拷贝,通常我们可以用内置函数memcpy或者自己写一个for循环来进行拷贝。比如:template<typename T>void Copy(T *dest, const T *src, size_t sz){原创 2017-10-28 13:12:31 · 4175 阅读 · 0 评论 -
动态内存管理
C语言中的动态内存管理: 我们一般在堆上开辟动态空间,在C语言中我们一般用到4个函数来管理动态开辟的空间------malloc、calloc、realloc和free。我们先来认识一下这4个函数:malloc------原型为void *malloc(size_t size); 在堆上开辟size个字节未初始化的空间,这片空间类型为void,并返回一个void*类型的指针。原创 2017-10-02 14:19:08 · 295 阅读 · 0 评论 -
操作符重载之输入输出重载
类是自定义类型,输入输出cin>>与cout输入运算符重载: 我们先给出如下日期类:class Date{private: int _year; int _month; int _day;};我们的目的是要用Date d;cin>>d;的方式对类成员进行输入,我们知道cin>>只能作用于内置类型,因此这里必须给出输入运算符的重载。要对类的私有成员原创 2017-10-02 12:50:16 · 3356 阅读 · 1 评论 -
操作符重载之二
此文同样用与上一篇文章相同的类作示例:class Complex{public: Complex(int _real = 0, int _image = 0) :real(_real), image(_image) { real = _real; image = _image; cout << "Complex1:" << this << endl; } Complex原创 2017-09-18 14:46:01 · 433 阅读 · 0 评论 -
类的静态成员
类的静态成员是指声明为static的成员(包括成员函数和成员数据)。静态成员和类的普通成员一样,也有public、protected、private3种访问级别,也可以具有返回值,const修饰符等参数;静态成员的声明即在普通成员的声明前加static,其必须在类外定义,在定义时不加static;当一个成员被声明为静态成员后这个成员就不属于某个具体的实例,而是为所有的类对象所共享;类的静态成员和其原创 2017-09-26 12:43:40 · 3794 阅读 · 1 评论 -
操作符重载之一
重载操作符是具有特殊函数名的函数,关键字operator后面接需要定义的操作符符号。操作符重载也是一个函数,具有返回值和形参表。它的形参数目与操作符的操作数目相同,函数调用操作符可以接受任意数目的操作数。使用运算符重载可以提高代码的可读性。其一般形式为:返回类型 operator 操作符(参数列表); 但是不是所有操作符都可以被重载,比如成员选择符、成员对象选择符、域解析操作原创 2017-09-17 18:11:10 · 252 阅读 · 0 评论 -
一级空间适配器的模拟实现
一级空间适配器适用于申请空间超过128byte的情况,可以用包装malloc的方法申请空间,也可以用包装realloc的方式改变空间大小,同时也做出了内存空间不足时的措施——释放旧空间。 实现如下:template <int inst>class _Alloc{public: static void *Allocate(size_t size) { ...原创 2018-05-23 13:24:24 · 220 阅读 · 0 评论