C++
yofer张耀琦
我喜欢自己开朗的性格
展开
-
STL中算法分类
操作对象直接改变容器的内容 将原容器的内容复制一份,修改其副本,然后传回该副本 功能:非可变序列算法 指不直接修改其所操作的容器内容的算法计数算法 count、count_if 搜索算法 search、find、find_if、find_first_of、… 比较算法 equal、mismatch、lexicographical原创 2015-07-09 22:49:38 · 1332 阅读 · 0 评论 -
继承中的类型兼容性原则
类型兼容规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代。通过公有继承,派生类得到了基类中除构造函数、析构函数之外的所有成员。这样,公有派生类实际就具备了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决。类型兼容规则中所指的替代包括以下情况:子类对象可以当作父类对象使用子类对象可以直接赋值给父类对象子类对象可以直接初始化父类对象父类指针可以直接指向子类对原创 2015-06-15 00:34:29 · 1061 阅读 · 0 评论 -
线性表的顺序存储设计和实现 - API函数实现
基本概念设计与实现插入元素算法判断线性表是否合法判断插入位置是否合法把最后一个元素到插入位置的元素后移一个位置将新元素插入线性表长度加1获取元素操作判断线性表是否合法判断位置是否合法直接通过数组下标的方式获取元素删除元素算法判断线性表是否合法判断删除位置是否合法将元素取出原创 2015-07-11 00:54:39 · 1194 阅读 · 0 评论 -
循环链表设计与API实现
基本概念循环链表的定义:将单链表中最后一个数据元素的next指针指向第一个元素循环链表拥有单链表的所有操作创建链表销毁链表获取链表长度清空链表获取第pos个元素操作插入元素到位置pos删除位置pos处的元素新增功能:游标的定义在循环链表中可以定义一个“当前”指针,这个指针通常称为游标,可以通过这个游标来遍历链表中的所有元素。循环链原创 2015-07-12 16:42:20 · 876 阅读 · 0 评论 -
重载重写重定义-易混淆概念-C++编译器处理方式
1、函数重载1)必须在同一个类中进行。2)子类无法重载父类的函数,父类同名函数将被名称覆盖3)重载是在编译期间根据参数类型和个数决定函数调用2、函数重写1)必须发生于父类与子类之间2)并且父类与子类中的函数必须有完全相同的原型3)使用virtual声明之后能够产生多态(如果不使用virtual,那叫重定义)4)多态是在运行期间根据具体对象的类型决定函数调用dem原创 2015-06-15 17:17:31 · 712 阅读 · 0 评论 -
为什么不要重载 && 和 || 操作符!!!
详细解释为什么重载运算符时,不对 && 和 || 这两个运算符进行重载;通过demo可以发现原因是重载这两个操作符不能实现它们原本的短路效果,所以我们尽量不对这两个运算符进行重载。原创 2015-06-14 21:25:44 · 830 阅读 · 0 评论 -
多继承原理抛砖 - 虚继承的应用场景 - 虚继承能解决的问题有限
虚继承用于处理某些多继承产生的二义性问题,但是处理的能力有限,对于某些情形不能有效的实现。最后测试指出C++编译器对于虚继承偷偷添加了一些属性,抛砖多继承的原理。原创 2015-06-15 15:15:29 · 977 阅读 · 0 评论 -
C++中不能被重载的运算符介绍
C/C++ 里大多数运算符都可以在 C++ 中被重载。C 的运算符中只有 . 和 ?:(以及 sizeof,技术上可以看作一个运算符)不可以被重载。C++ 增加了一些自己的运算符,除了 :: 和 .* 外,大多数都可以被重载。原创 2015-07-11 22:36:15 · 927 阅读 · 0 评论 -
C++链表模板类
思想和上篇文章差不多,只是换了层包装。直接上代码:// linklist.h#include #include using namespace std;template struct Node{ T t; Node *next;};template class LinkList{public: LinkList(); ~LinkList();publ原创 2015-07-11 23:03:13 · 5035 阅读 · 3 评论 -
友元函数实现操作符重载的应用场景-友元函数实现左移右移操作符重载
通过demo演示了友元函数在左移和右移运算符重载时的应用,与成员函数重载方式进行了对比,也涉及到了占位参数的使用原创 2015-06-14 00:28:28 · 1437 阅读 · 0 评论 -
类模版的注意事项
// 模版是抽象的 => 需要给出具体类型// 模板类(本身就是类型化的)=>具体的类=>定义具体的变量// 从模板类派生的普通类// 模板类派生时,需要具体化模板类,C++编译器需要知道,父类的数据类型是什么样子的// 要知道父类所占的内存大小是多少,只有数据类型固定下来,才知道如何分配内存原创 2015-07-03 10:05:30 · 631 阅读 · 0 评论 -
C++为什么要设计友元函数和友元类
1、首先要提一下java,比如java定义一个类1.class,会生成字节码。java有反射机制,可以找到类对象,直接修改类的私有属性。逐渐反射机制成为了一种标准,sun做成标准,JDK的API函数中有所体现。2、1.cpp===>汇编要经过预编译,编译,链接,生成。。对应gccgcc -E hello.c -o hello.i(预处理)gcc -S hello.i -o原创 2015-06-13 23:28:43 · 1531 阅读 · 0 评论 -
深度剖析malloc、free和new、delete
深入分析C语言的函数malloc、free和C++的操作符new、delete之间的异同原创 2015-06-13 22:55:00 · 984 阅读 · 0 评论 -
构造函数调用规则研究
1)当类中没有定义任何一个构造函数时,c++编译器会提供默认无参构造函数和默认拷贝构造函数2)当类中定义了拷贝构造函数时,c++编译器不会提供无参数构造函数这里一定注意,当你只定义一个拷贝构造函数,在创建对象时是不能直接调用无参数构造函数的。3) 当类中定义了任意的非拷贝构造函数(即:当类中提供了有参构造函数或无参构造函数),c++编译器不会提供默认无参构造函数当类中定义了一个多参原创 2015-06-11 19:46:29 · 745 阅读 · 0 评论 -
成员函数的const到底修饰的是谁
成员函数的3个const究竟修饰的谁?demo演示清晰得出结论:const修饰隐藏的this指针原创 2015-06-12 00:04:24 · 1340 阅读 · 2 评论 -
STL常用遍历算法for_each和transform的比较
通过demo演示了STL中的常用遍历算法for_each和transform的基本使用,然后通过追踪源码得到for_each和transform的本质区别(对函数对象参数的要求)原创 2015-07-10 14:12:17 · 2728 阅读 · 0 评论 -
STL常用查找算法介绍
adjacent_find()在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器。否则返回past-the-end。#include #include #include #include using namespace std;void play_adjacent_find(){ vector v1; v1.pu原创 2015-07-10 14:51:01 · 694 阅读 · 1 评论 -
STL常用排序算法介绍
merge() 以下是排序和通用算法:提供元素排序策略 merge: 合并两个有序序列,存放到另一个序列。#include #include #include #include using namespace std;void printV(vector &v){ for (vector::iterator it = v.begin(); it != v.end()原创 2015-07-10 15:27:21 · 725 阅读 · 0 评论 -
当函数模版遇上函数重载
函数模板和普通函数区别结论:1、函数模板不允许自动类型转化;2、普通函数能够进行自动类型转换;函数模版和普通函数在一起的调用规则:1、函数模版可以像普通函数一样被重载;2、C++编译器优先考虑普通函数;3、如果函数模版可以产生一个更好的匹配,那么选择模版;4、可以通过空模版实参列表的语法限定编译器只通过模版匹配;原创 2015-07-03 08:40:06 · 736 阅读 · 0 评论 -
类模板语法知识体系梳理(包含大量常犯错误demo,尤其滥用友元函数的错误)
归纳以上的介绍:可以这样声明和使用类模版:1) 先写出一个实际的类。由于其语义明确,含义清楚,一般不会出错。2) 将此类中准备改变的类型名(如int要改变为float或char)改用一个自己指定的虚拟类型名(如上例中的numtype)。3) 在类声明前面加入一行,格式为: template <class 虚拟类型参数>如: template <class numtype> //注意本行末尾无分号 class Compare {…}; //类体4) 用类模板定义对象时用以下原创 2015-07-03 14:24:53 · 753 阅读 · 0 评论 -
线性表链式存储设计与实现 - API实现
基本概念链式存储定义为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后继的信息。表头结点链表中的第一个结点,包含指向第一个数据元素的指针以及链表自身的一些信息数据结点链表中代表数据元素的结点,包含指向下一个数据元素的指针和数据元素的信息尾结点链表中的最后一个数据结点,其下一元素指针为空,表示无原创 2015-07-11 20:44:22 · 1022 阅读 · 0 评论 -
双向链表设计与API实现
为什么需要双向链表?单链表的结点都只有一个指向下一个结点的指针单链表的数据元素无法直接访问其前驱元素逆序访问单链表中的元素是极其耗时的操作!双向链表的定义在单链表的结点中增加一个指向其前驱的pre指针双向链表拥有单链表的所有操作创建链表销毁链表获取链表长度清空链表获取第pos个元素操作插入元素到位置pos删除位置pos处的元素原创 2015-07-12 20:03:37 · 714 阅读 · 0 评论 -
派生类的访问控制-“三看”原则-派生类类成员访问级别设置的原则
详细解释了派生类对于父类中的成员的访问控制,通过三看原则,demo分析怎么判断一个数据的访问是否合法。原创 2015-06-14 23:38:41 · 807 阅读 · 0 评论 -
栈的顺序存储 - 设计与实现 - API实现
Stack基本概念栈是一种 特殊的线性表 栈仅能在线性表的一端进行操作栈顶(Top):允许操作的一端栈底(Bottom):不允许操作的一端Stack的常用操作创建栈销毁栈清空栈进栈出栈获取栈顶元素获取栈的大小 栈模型和链表模型关系分析栈的顺序存储设计与实现// seqlist.h// 顺序存储结构线性原创 2015-07-13 13:37:49 · 1213 阅读 · 0 评论 -
队列类 - 链式存储
代码:// linkqueue.hpp// 队列类#pragma once#include "linklist.hpp"template class LinkQueue{public: LinkQueue(); ~LinkQueue();public: int clear(); int append(T &t); int retieve(T &t); int原创 2015-07-20 15:01:18 · 583 阅读 · 0 评论 -
中国象棋游戏Chess(1) - 棋盘绘制以及棋子的绘制
本项目都使用QT来实现绘图,没有任何第三方的资源。工程详情:Github首先将棋盘设计为一个类Board// Board.h// Board类实现了棋盘的绘制以及显示//#ifndef BOARD_H#define BOARD_H#include #include "Stone.h"class Board : public QWidget{ Q_OBJEC原创 2015-07-21 21:06:29 · 11165 阅读 · 0 评论 -
中国象棋游戏Chess(2) - 走棋
之前的文章请看:中国象棋游戏Chess(1) - 棋盘绘制以及棋子的绘制现在实现走棋的功能。首先需要获取点击到的棋子,用QWidget中的函数mouseReleaseEvent实现函数:void Board::mouseReleaseEvent(QMouseEvent *ev){ // 首先要获取鼠标点击的位置 QPoint pt = ev->pos();原创 2015-07-22 16:05:05 · 1861 阅读 · 0 评论 -
C++11特性 - Smart Pointers 智能指针
已经有成千上万的文章讨论这个问题了,所以我只想说:现在能使用的,带引用计数,并且能自动释放内存的智能指针包括以下几种: unique_ptr: 如果内存资源的所有权不需要共享,就应当使用这个(它没有拷贝构造函数),但是它可以转让给另一个unique_ptr(存在move构造函数)。 shared_ptr: 如果内存资源需要共享,那么使用这个(所以叫这个名字)原创 2015-09-02 14:21:56 · 1564 阅读 · 0 评论 -
C++ 传参时传内置类型时用传值(pass by value)方式效率较高
来源:唐磊的个人博客《C++ 传参时传内置类型时用传值(pass by value)方式效率较高》在《Effective C++》里提到对内置(C-like)类型在函数传参时pass by value比pass by reference更高效,当用OO的c++自定义类型(存在构造/析构等)pass by reference to const 更好,STL里的迭代器和函数对象是用C指转载 2015-09-01 16:50:00 · 2620 阅读 · 1 评论 -
栈的应用 - 中缀表达式转后缀表达式
有关栈API详情请参看我的另一篇博文:栈的链式存储 - API实现实例:5 + 4=> 5 4 + 1 + 2 * 3 => 1 2 3 * + 8 + ( 3 – 1 ) * 5 => 8 3 1 – 5 * + 中缀表达式符合人类的阅读和思维习惯后缀表达式符合计算机的“运算习惯”中缀转后缀算法:遍历中缀表达式中的数字和符号对于数字:直接输出对于符号:原创 2015-07-13 19:44:57 · 820 阅读 · 1 评论 -
构造函数为什么不能是虚函数
1. 从存储空间角度,虚函数对应一个指向vtable虚函数表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。 2. 从使用角度,虚函数主要用于在信息不全的情况下,能使重载的函数得到对应的调用。原创 2015-09-14 13:23:55 · 614 阅读 · 0 评论 -
C++中将构造函数或析构函数定义为private
很多情况下要求当前的程序中只有一个object。例如一个程序只有一个和数据库的连接,只有一个鼠标的object。通常我们都将构造函数的声明置于public区段,假如我们将其放入private区段中会发生什么样的后果?这意味着什么? 当我们在程序中声明一个对象时,编译器为调用构造函数(如果有的话),而这个调用将通常是外部的,也就是说它不属于class对象本身的调用,假如构造函数是私原创 2015-09-14 13:44:29 · 2723 阅读 · 0 评论 -
C++中const的实现细节介绍(C,C#同理)
via:http://www.jb51.net/article/45755.htm本篇文章主要是对C++中const的实现细节进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助1、什么是const? 常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。(当然,我们可以偷梁换柱进行更新:) 2、转载 2015-09-17 11:13:47 · 834 阅读 · 0 评论 -
栈类 - 链式存储
代码:// linkstack.hpp// 栈类#pragma once#include "linklist.hpp"template class LinkStack{public: LinkStack(); ~LinkStack();public: int clear(); int push(T &t); int pop(T &t); int top(T &原创 2015-07-20 14:27:56 · 651 阅读 · 0 评论 -
队列顺序存储 - 设计与实现 - API函数
队列是一种特殊的线性表 队列仅在线性表的两端进行操作队头(Front):取出数据元素的一端队尾(Rear):插入数据元素的一端队列不允许在中间部位进行操作!queue常用操作销毁队列清空队列进队列出队列获取队头元素获取队列的长度队列也是一种特殊的线性表;可以用线性表顺序存储来模拟队列。主要代码:// seqqueue.h// 顺原创 2015-07-16 13:39:17 · 891 阅读 · 0 评论 -
队列链式存储 - 设计与实现 - API函数
队列相关基础内容参我的博文: 队列顺序存储 - 设计与实现 - API函数队列也是一种特殊的线性表;可以用线性表链式存储来模拟队列的链式存储。主要代码:// linkqueue.h// 队列链式存储API声明#ifndef _LINKQUEUE_H_#define _LINKQUEUE_H_typedef void LinkQueue;// 创建队列LinkQue原创 2015-07-16 14:30:12 · 928 阅读 · 0 评论 -
C++异常处理 - 栈解旋,异常接口声明,异常类型和异常变量的生命周期
栈解旋(unwinding)异常被抛出后,从进入try块起,到异常被抛掷前,这期间在栈上的构造的所有对象,都会被自动析构。析构的顺序与构造的顺序相反。这一过程称为栈的解旋(unwinding)。异常接口声明1)为了加强程序的可读性,可以在函数声明中列出可能抛出的所有异常类型,例如:void func() throw (A, B, C , D); //这个函数func()能够且只能抛出类型A B C D及其子类型的异常。2)如果在函数声明中没有包含异常接口声明,则次函数可以抛掷任何类型的异常,例如:原创 2015-07-06 17:15:02 · 1994 阅读 · 0 评论 -
栈的链式存储 - API实现
基本概念其他概念详情参看前一篇博文:栈的顺序存储 - 设计与实现 - API实现这里也是运用了链表的链式存储API快速实现了栈的API。代码:// linkstack.h// 链式存储栈的API声明#ifndef _MY_LINKSTACK_H_#define _MY_LINKSTACK_H_typedef void LinkStack;// 创建栈L原创 2015-07-13 15:51:45 · 1380 阅读 · 0 评论 -
C++异常处理基本思想
1)C++的异常处理机制使得异常的引发和异常的处理不必在同一个函数中,这样底层的函数可以着重解决具体问题,而不必过多的考虑异常的处理。上层调用者可以再适当的位置设计对不同类型异常的处理。2)异常是专门针对抽象编程中的一系列错误处理的,C++中不能借助函数机制,因为栈结构的本质是先进后出,依次访问,无法进行跳跃,但错误处理的特征却是遇到错误信息就想要转到若干级之上进行重新尝试。3)异常超脱于函数机制,决定了其对函数的跨越式回跳。4)异常跨越函数原创 2015-07-06 16:15:25 · 3085 阅读 · 0 评论 -
C++类型转化:static_cast,reinterpret_cast,dynamic_cast,const_cast
类型转换名称和语法C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是: TYPE b = (TYPE)a C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。 static_cast 静态类型转换。如int转换成char reinterpreter_cast 重新解释类型 dynamic_cast 命名上理解是动态类型转换。如子类和父类之间的多态类型转换。 const_cast, 字面上理解就是去const属性。4种类型转换的格式:TYPE B =原创 2015-07-06 15:03:59 · 788 阅读 · 0 评论