2 xcm2yw

尚未进行身份认证

暂无相关简介

等级
TA的排名 17w+

C++基础 虚函数

在基类中可能会存在virtual函数,那么当派生类继承了基类的话,一般都是希望派生类重新定义继承来的virtual函数。如果派生类没有定义某个虚函数,则使用基类定义的版本。C++中的函数调用默认不使用动态绑定。要触发动态绑定需要满足两个条件:(1)只有指定为虚函数的成员函数才能进行动态绑定,成员函数默认为非虚函数时,不进行动态绑定。(2)必须通过基类类型的引用或指针进行函数调用。classfru...

2018-03-27 19:31:22

《Effective C++》条款07:为多态基类声明virtual析构函数

  classBase_A{public: Base_A():element(0){} ~Base_A(){cout<<"调用A的析构函数"<<endl;} voidprint(inta){cout<<a<<endl;} voidprint(floata){cout<<a&..

2018-03-26 11:41:51

《Effective C++》 条款33:避免遮掩继承而来的名称

  派生类继承基类后会拥有基类的成员变量和成员函数,如果派生类中有和基类相同名称的成员函数和成员变量,那么派生类中相同名称的成员函数会把继承而来的成员函数“遮盖”掉。下面给出实例来进行分析。classBase_A{public: Base_A():element(0){} virtual~Base_A(){} voidprint(inta){cout<<...

2018-03-25 10:37:03

C++基础——虚继承及其内存分布

 1、虚继承在C++继承中会遇到一种特殊的情况——“钻石继承”。“钻石继承”指的是当一个基类A被两个派生类B和C同时继承,此时另一个派生类D又同时继承B和C,如果此时用图表示出来就像一个菱形一样,如下图。    派生类D通过继承之后拥有基类A和派生类B,C的成员,所以一旦派生类D想要调用基类A的成员(无论是数据成员还是成员函数)时,此时派生类是通过派生类B来访问基类A的成员呢?还是通过派生类C来访...

2018-03-23 16:12:57

C++基础——继承

1、公有、私有和受保护继承    如果一个类的成员被定义成该类的私有成员,那么只有基类的成员和友元可以访问类中的私有成员。同时派生类也无法访问基类的私有成员,派生类的实例对象也无法访问这些私有成员。如果派生类为公有继承,基类成员保持自己的访问级别:基类的public成员为派生类的public成员,基类的protected成员为派生类的protected成员。如果是受保护成员,基类的public和p...

2018-03-19 08:53:03

C++基础——友元函数

  在C++中为了有更好的封装性,所以我们一般将数据声明为私有成员(private)。当我们需要操作数据成员的时候就需要利用类内的函数来使用私有的数据成员。而我们在实现函数定义时是在类外进行函数定义的。而只有类内的函数才可以访问类中的数据成员,函数通常声明为共有成员。但是还有另一种方法:将函数声明为友元函数,那么该函数也可以访问类内的私有成员。    classproduct{publi...

2018-03-17 16:11:40

MySQL之增、删、查、改

DDL语句(数据库和数据库对象的创建、修改和删除基本都是通过DDL语句来实现的)1.1create数据库createdatabase+数据库名字[库选项];e.g:createdatabaseSchoolDB;库选项:用来约束数据库 (1)字符集设定:charset/characterset具体字符集(数据存储的编码格式):常用字符集:GBK和UTF8 (2)校对集设定:col...

2018-03-15 21:23:50

《Effective STL》 05 区间成员函数优先于与之对应的单元素成员函数

讨论:给定v1和v2两个矢量(vector),使v1的内容和v2的后半部分相同的最简单操作如何实现?  方案1:v1.assign(v2.begin()+v2.size()/2,v2.end());  方案2:v1.clear();  copy(v2.begin()+v2.size()/2,v1.end(),back_inserter(v1));  方案3:使用循环将所需要插入的元素...

2018-03-14 16:38:55

《Effective STL》 03 确保容器中的对象拷贝正确而高效

  当你通过insert或者push_back之类的操作将对象加入到容器中,事实上存进容器中的是你所指定的对象的拷贝。当通过front等操作后,取出来的对象也是所制定的对象的拷贝而已。存放进容器的对象越多耗费的时间就越多。同时还存在“剥离”的情况存在,例如:当创建一个存放基类对象的容器,却向容器中存放派生类的对象,那么在派生类对象被拷贝进容器中,那么特有的派生类的信息就会丢失掉。之所以会发生“...

2018-03-14 00:28:54

《Effective STL》 01:慎重选择容器类型

    vector是默认应使用的序列类型;当需要频繁地在序列中做插入和删除操作时,应该使用list;当大多数插入和删除操作发生在序列的头部和尾部时,deque是应考虑的数据结构。在STL的容器里面可以大致分为两类:连续内存容器和基于结点的容器。连续内存容器是指容器内存放的元素是在一块或多块内存中,每块内存存有多个元素。而基于结点的容器是像链表一样的容器,每一个小的内存中只存放一个元素。在进行删除...

2018-03-13 23:30:31

算法——冒泡排序算法

  1、冒泡排序的思想  冒泡排序的思想很简单,就是相邻的两个元素进行比较,如果下标较小的元素大于下标较大的元素,交换两个元素的位置。直到最后没有反序位置。所以自然而然会想到可以使用for循环来遍历整个数组的元素来进行比较(相邻的两个元素比较)。那么代码就可以这么写:for(inti=0;i<ListSize-1;i++){if(List[i]>Lis...

2018-03-13 00:20:04

进程与线程之生产者和消费者问题

    在学习进程和线程的过程中,毫无疑问肯定会学到多线程、进程间通信等相关问题。而这也是学习进程和多线程方面的一个重点。这篇文章主要介绍的是利用互斥量、锁以及使用Pthread库来实现生产者和消费者问题。1、临界区  临界区指的是共享内存进行访问的程序片段。在实现线程间同步就必须只有一个线程访问临界区。上图中进程A在T1时刻进入临界区,当运行到T2时刻的时候进程B试图进入临界区。因为此时进程...

2018-03-09 16:40:39

Leetcode 20. Valid Parentheses

Givenastringcontainingjustthecharacters '(', ')', '{', '}', '[' and ']',determineiftheinputstringisvalid.Thebracketsmustcloseinthecorrectorder, "()" and "()[]{}" areallvalidbut ...

2018-03-08 20:50:31

C++类中的static成员函数和static数据成员

1、static数据成员的使用1.1static数据成员的定义static数据成员可以声明为任意类型,可以是常量、引用、数组、类类型。static数据成员在类内声明,但是必须在类定义体的外部定义,也就是必须在类外进行定义。在使用类内的static成员时,和其他的成员变量的使用方法相同。classChineseClass{public: voidNote(); ChineseClass...

2018-03-08 17:55:44

《现代操作系统》 进程与线程(2)

第二章 进程与线程2.2 线程  多线程的优点主要是以下三个:1)多线程具有并行实体共享用一个地址空间和所有可用数据的能力。2)线程比进程更轻量级,所以它们比进程更容易创建,也更容易撤销。3)当涉及大量的计算和I/O处理时,拥有多个线程允许这些活动可以同时进行。在网络服务器中多线程发挥着重要的作用。Web服务器中会有一个分派程序的多线程从网络中不停地读入工作请求,然后把工作请求派给工作线程...

2018-03-06 23:15:17

《现代操作系统》之 进程与线程

第二章 进程与线程2.1进程    操作系统中最核心的概念是进程,它是对正在运行程序的一个抽象,包括操作系统。一个进程就是一个正在执行程序的实例,包括程序计数器、寄存器和变量的当前值。下图中有四个进程,但是只有一个物理程序计数器。在执行其中某个程序时,例如执行A进程,此时进程A的逻辑程序计数器就会被加载到物理程序计数器中。并且在实际的执行当中,只有一个程序在执行。虽然现在多核的CUP盛行,但是即...

2018-03-05 23:43:56

《CEffective C++》之条款01

    经过40多年的发展C++已经是个多重范型编程语言,一个同时支持过程式、面向对象形式、函数形式、泛型形式、元编程形式的语言。C++在不断的发展,所以在学习的过程中需要用新的思想和角度来看待C++。而“最简单的方法是将C++视为一个由相关语言组成的联邦而非单一的语言”,当时第一眼看到这句话的时候无法理解为什么要把C++给拆开。当然这种“语言联邦”的形式表面上看像是分割开的,但是实际上其中是有联...

2018-03-04 23:52:29

二叉树的遍历

1、前序遍历上一篇文章讲到二叉树的存储结构,这里使用的就是该存储结构。前序遍历的规则是:若二叉树为空,则空操作返回,否则就先访问根节点,然后前序遍历左子树,再前序遍历右子树。那么前序遍历的结果是:ABDGHCEIF。前序遍历的代码分析:下面的代码使用递归算法进行前序遍历的。先访问根结点,若根结点不为空,则打印结点的数据。然后递归访问左子树,直到所访问的左子树是最后一个。最后以此类推访问右子树。vo...

2018-02-25 15:48:29

二叉树

1、二叉树的特点每个结点最多两棵子树,所以二叉树中不存在大于2的结点。注意不是只有两棵子树,而是最多有。左子树和右子树是有顺序的,次序不能任意颠倒。即使树中某种结点只有一棵子树,也要区分它是左子树和右子树,如下图。                    2、二叉树具有的五种基本形态空二叉树。只有一个根结点。根结点只有左子树。根结点只有右子树。根结点既有左子树又有右...

2018-02-23 22:16:19

链栈

链栈和顺序栈不同,链栈是采用一个个存储结点来存储数据的。它不像顺序栈在地址上是连续的线性存储结构。所有的存储单元可以占用连续或不连续的存储区域。每个存储单元在存储栈中的元素a1的同时,也存储其逻辑后继a2的存储地址。typedefstructnode{ intdata;//存放数据 structnode*next;//下一个结点的地址}LinkNode,*LinkStackPtr

2018-02-03 21:25:43

查看更多

勋章 我的勋章
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!