![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 56
阿华Go
做一个有责任心有上进心的汉子,我要肩负起守护家人的重任!!!
展开
-
数组实现二叉树
下面我们构造一个简单的二叉树,主要看清构造二叉树的思路; 解释一下,这里我们将二叉树的左节点和右边节点分别用0和1表示,同时将不存在的节点的值用0来表示. binaryTree.hclass BinaryTree{public: BinaryTree(int nSize, int *root); bool addTreeNode(int pos, int* parent, in原创 2017-07-03 21:12:58 · 1028 阅读 · 0 评论 -
二叉树的非递归遍历
转载:http://www.cnblogs.com/dolphin0520/archive/2011/08/25/2153720.html 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归转载 2017-07-05 09:28:00 · 447 阅读 · 0 评论 -
C++链表实现二叉树
我们分别在node.h和tree.h中定义了树中的节点类和树类,同时在node.cpp和tree.cpp中实现了在头文件中申明的函数,然后在demo.cpp中创建一棵树,看看效果。 PS:注意searchIndex(pos)函数,深刻理解其内在递归性,要不超容易犯错,博主初学的时候就是没有仔细理解其递归性,导致遍历一直出错,花了好长时间才找到问题出在哪里,非常耗时。node.h#ifndef NO原创 2017-07-05 15:44:30 · 559 阅读 · 0 评论 -
C++二叉树的链表实现
包括创建二叉树、递归遍历二叉树、非递归遍历二叉树等操作,请大家注意创建二叉树的函数,注意创建好的输入是怎样的,如下图所示的输入应该为ABC##DE#G##F###,类似于先序遍历。 #include <iostream>#include <stack>using namespace std;typedef struct Node{ char data; struct Node原创 2017-07-05 20:13:52 · 1665 阅读 · 0 评论 -
C++的图的基本概念
1. 有向图:顶点与顶点之间通过弧相连接;2. 无向图:顶点与顶点之间通过无向边相连接;3. 完全图:有向的完全图的弧的个数为n^2,无向图的完全图的边的个数为n(n-1)/2;4. 最小生成树算法:Prim算法:根据点集合判断生成最小生成树; KrusKal算法:根据边的集合判断最小生成树。5. 图的表示:邻接矩阵: 顶点值矩阵; 邻接链表矩阵; 邻接表:原创 2017-07-05 23:27:30 · 911 阅读 · 0 评论 -
C++学习路线推荐
转载:http://blog.csdn.net/baidu_28312631/article/details/47952547 相信有很大一部分学计算机的童鞋都是靠自学,即使本身是计算机专业的同学,也会觉得仅仅通过课堂上的学习是远远不够的,而且在上课时所用到的教材也不够好。然而自学的时候有个很大的问题就是找不到合适的方向和学习路线,我在刚开始的时候也吃过这样的亏,总是纠结于语言的学习,觉得编程转载 2017-07-15 11:36:37 · 332 阅读 · 0 评论 -
C++二叉树的链表实现,包括递归和非递归实现
在上文的博客中已经写了二叉树的实现,那么为什么还要继续写这篇博文呢?答案是因为上文简单的写了二叉树的递归遍历,相信大家肯定刺激度不够,所以这篇博文中添加了非递归遍历,满足大家的好奇心,学习数据结构主要是蕴含在其中的思路,思路对了,什么都很简单的,不要局限在这种方式中,希望这篇博文会给大家带来一些收获。Node.h#ifndef NODE_H#define NODE_Hclass Node{pub原创 2017-07-06 09:37:18 · 434 阅读 · 0 评论 -
C++图的操作
经过漫长的学习,终于对图的结构、表示和遍历及其最小生成树等一系列图相关的操作有了一些理解,因此现在写这篇博客,希望会对大家有用,我们的图是通过邻接矩阵实现的。Node.h#ifndef NODE_H#define NODE_Hclass Node{public: Node(char data = 0); char m_data; bool m_isVisited;};#原创 2017-07-06 22:06:39 · 892 阅读 · 0 评论 -
C++中成员变量的初始化操作(4)---《Effective C++》
条款4:确定对象被使用前已先被初始化C++类中的成员变量,我们一般都是对其进行赋值操作,如:class ABEntry{public: ABEntry(const std::string&name,const std::string& address,const std::list<PhoneNumber>& phones);private: std::string theNam原创 2017-07-16 17:50:21 · 285 阅读 · 0 评论 -
C++之析构函数和构造函数调用时间---补充(2)《Effective C++》
今天看书忽然对这个地方有点模糊,尤其是析构函数在调用默认的析构函数和用户自己覆写的析构函数的时候有点意识模糊呢。写段代码总结下[cpp] view plain copy print?#include <iostream> using namespace std; class Box { private: double length; public: Box(do转载 2017-07-20 17:20:53 · 323 阅读 · 0 评论 -
C++之在资源管理类中小心copying行为(14)---《Effective C++》
转载:http://www.cnblogs.com/hustcser/p/4103527.html条款14:在资源管理类中小心copying行为———————– 第一节 <背景> 条款13中讲到“资源取得的时机便是初始化时机”并由此引出“以对象管理资源”的概念。通常情况下使用std中的auto_ptr(智能指针)和tr1::shared_ptr(引数智能指针)作为管理资源的转载 2017-07-20 19:53:21 · 465 阅读 · 0 评论 -
C++之在资源管理类中提供对原始资源的访问(15)---《Effective C++》
条款16:在资源管理类中提供对原始资源的访问C++中设计资源管理类特别方便,通过利用资源管理类来处理资源之间的所有交互,不用直接操作原始资源,避免了内存泄露等一系列问题,但这一定是好的吗?如果一个函数只要求使用原始资源呢?放心,强大的C++永远不会这么轻易狗带,我们先来看看面临的问题,然后在来看C++给我们提供的解决方案:std::trl::shared_ptr<Investment> pInv(c原创 2017-07-20 21:39:12 · 518 阅读 · 0 评论 -
C++之成对使用的new和delete时采取相同形式(16)---《Effective C++》
条款16:成对使用new和delete时候采取相同形式成对使用的new和delete需要采用相同的形式,可以先看如下代码:std::string* stringArray=new std::string[100];...delete stringArray;这样会发生什么问题呢?对了,程序行为定义并不明确,stringArray所含的100个string对象中的99个不太可能被适当的删除,因为他原创 2017-07-20 23:41:50 · 363 阅读 · 0 评论 -
C++之以独立语句将newed对象置入智能指针(17)---《Effective C++》
条款17:以独立语句将newed对象置入智能指针利用RAII机制对对象进行指针转换的时候,需要将newed对象以独立语句置入,为什么这样做呢?我们有如下示例:int hello();void handleA(std::trl::shared_ptr<A> pA,int hello());...handleA(new A,hello());//这样无法通过编译,A的构造函数是显示的,无法进行隐式原创 2017-07-21 13:38:50 · 359 阅读 · 0 评论 -
C++之让接口容易被正确使用,不易被误用(18)---《Effective C++》
条款18:让接口容易被正确使用,不易被误用C++中如果想要开发一个“容易被正确使用,不易被误用”的接口,首先必须考虑客户可能犯的错误,以日期类举例:class Date{ Date(int month,int day,int year); ...}这样可以吗?当然可以呀,那么有问题吗?当然有呀,如果用户想要通过如下代码调用时候,这锅谁背?Data d(1,10,1995);//到底原创 2017-07-21 15:49:33 · 311 阅读 · 0 评论 -
C++中友元的使用(3)---《Effective C++》
伴随着C++的学习历程,我们会发现C++就像一个雷区,在雷区里面行走需要注意雷的分布和战斗力,今天我们来认识的是C++中比较不受重视的一个雷,叫做友元,战斗力十分生猛,友元的存在一定程度上破坏了C++的结构稳定性即封装性,但是一定程度上又方便了开发者的使用,是一把双刃剑,因此开发人员在使用时候一定要注意,friend赋予类或者函数对本类中的所有数据进行访问,即private、protected和pu原创 2017-07-18 15:15:21 · 305 阅读 · 0 评论 -
C++中的拷贝构造函数和拷贝赋值操作符+const成员变量初始化(5)---《Effective C++》
C++中拷贝构造函数和拷贝赋值操作符,C++中编译器可以自动生成copy 构造函数,copy operator=,析构器等函数,那么什么时候编译器无法自动生成copy 构造函数和copy operator=呢? 那么就是以下这两种情况啦: 1)引用成员变量 2)const成员变量 参看以下代码:#include <iostream>#include <cstring>#include <原创 2017-07-17 21:33:04 · 1824 阅读 · 0 评论 -
C++中直接拒绝编译器自动生成copy constructor和copy operator=操作(6)---《Effective C++》
我们知道,当我们调用拷贝函数或者拷贝赋值运算符的时候,编译器会自动生成copy constructor和copy operator=操作,如果我们不想让编译其为我们生成这些函数,怎么破?当然就该明确拒绝掉,具体采用什么方法呢? 1)将copy构造函数和copy 赋值操作符声明为private,籍由明确声明一个成员函数,这样可以阻止编译器暗自创建其专属版本;而将这些函数声明为private,你可以成原创 2017-07-18 16:30:41 · 398 阅读 · 0 评论 -
C++中拒绝编译器自动生成copy构造函数和copy赋值运算符操作(6)---《Effective C++》
C++是一片荆棘遍布的雷区,等待用于挑战的你去探索,在《Effective C++》系列的第5篇中我们已经看到当用户进行赋值或者拷贝操作的时候,即使我们没有定义拷贝构造函数或者拷贝赋值运算符操作,编译器也会自动为其生成copy构造函数和copy赋值运算符,这不失为一种比较好的机制,避免了我们写冗余且无聊的copy赋值和copy构造代码,但凡事都有两面性,当然C++的这种机制也不例外,如果我们不想让编原创 2017-07-18 16:57:23 · 807 阅读 · 0 评论 -
C++中的virtual关键字---补充(1)《Effective C++》
C++中的virtual关键字,很好的解决了C++中类的多态性,很好地实现了动态绑定,那么实现动态绑定的条件是什么呢? 1)指定为虚函数; 2)通过基类指针或者引用调用。 了解了这两个特点,下面让我们带着virtual的这两个特性来如下代码中进行探索:1、基类A中的show函数不是virtual函数;#include <iostream>#include <cstring>#include原创 2017-07-18 19:52:26 · 106 阅读 · 0 评论 -
C++之设计class犹如设计type(19)---《Effective C++》
条款19:设计class犹如设计type今天我们主要讨论一下类的设计所面临的问题进行着手,主要解决一些思路上的问题和误区。C++就像在其他OOP语言一样,当你定义一个新的class,那么也就定义了一个新的type。这意味这你的任务很重,不仅是class设计者,还是type设计者,重载函数,操作符,控制内存的分配和归还、定义对象的初始化和终结,全都在你手上,因此我们需要从类(class)的设计所面临的原创 2017-07-22 10:19:40 · 258 阅读 · 0 评论 -
C++之值传递、指针传递和引用传递---补充(4)《Effective C++》
在上篇博客中突然发现自己对C++中的值传递的应用场景以及内存分配状况不清楚,所以进行一个紧急补充。1)值传递(pass-by-value): 值传递,传递的是内存的副本,形参是实参的拷贝,改变形参的值不会影响实参,最简单的一种传递方式,被调函数的形参作为被调函数的局部变量处理,即在堆栈中开辟内存空间(即为形参开辟空间)以存放主调函数传过来的实参值,对实参值进行了一个拷贝而已!当被调函数执行结束后,原创 2017-07-22 11:44:36 · 340 阅读 · 0 评论 -
C++之将文件间的编译依存关系降至最低(31)---《Effective C++》
条款31:将文件间的编译依存关系降至最低问题提出:如果我们将某个class的实现文件做了某些修改,修改并不是class的接口,而是其实现部分,而且只改了其private部分,然后重建整个文件,然鹅当你进行编译的时候,可以发现该类都被重新编译和链接了,什么鬼???问题的原因是C++并没有“将接口从实现中分离”该部分做的很好,class的形式不仅包括接口,同时还包括十足的实现项目,如:class Per原创 2017-07-30 23:53:16 · 403 阅读 · 0 评论 -
C++之确定你的public继承塑模出is-a关系(32)---《Effective C++》
条款32:确定你的public继承塑模出is-a关系public继承和is-a之间的等价关系听起来颇为简单,但有时候你的直觉可能会误导你,例如企鹅是一种鸟,这是一个既定事实,但是企鹅可以飞吗?class Bird{public: virtual void fly(); ...};class Penguin:public Bird{ ...};这下就入坑了吧!整个继承体原创 2017-07-31 18:48:27 · 346 阅读 · 0 评论 -
C++之宁以pass-by-reference-to-const替换pass-by-value(20)---《Effecitive C++》
条款20:宁以pass-by-reference-to-const替换pass-by-value缺省情况下C++以by value方式(一个继承自C的方式)传递对象至(或来自)函数。除非你另外指定,否则函数参数都是以实际实参的复件为初值,调用端获得的亦是函数返回值的一个复件。复件(副本)的产生需要花费时间,浪费资源,参看如下代码。#include <iostream>#include <strin原创 2017-07-22 16:23:01 · 382 阅读 · 0 评论 -
C++之对象包含与成员函数不兼容的类型限定符---补充(5)《Effective C++》
**C++值对象那个包含与成员函数不兼容的类型限定符:** 再解释这个问题之前,我们先来看看如下代码,到底有什么问题呢?#include <iostream>#include <string>using namespace std;class Base{public: Base(){ cout << "=====Base的构造函数=====" << endl;原创 2017-07-22 17:12:22 · 22542 阅读 · 1 评论 -
C++之必须返回对象时候,别妄想返回其reference(21)---《Effective C++》
条款21:必须返回对象时,别妄想返回其reference上篇博客我们讲了pass-by-value效率特别低,除了一些特定情况时,尽量在传递参数的时候使用pass-by-reference-to-const,因此,有的小伙伴就走向了一个极端,坚定追求pass-by-reference纯度,以至于对于返回值也想设置为引用,然鹅物极必反,不用太追求极端的!下面我们来看一些例子,拨开各位小伙伴心中的迷雾!原创 2017-07-22 20:36:21 · 356 阅读 · 0 评论 -
C++中的virtual析构函数创建时机(7)---《Effective C++》
条款7:为多态基类声明virtual析构函数学习了上篇博客中所讲的virtual关键字之后,我们可以发现virtual关键字对于实现C++的多态至关重要,那么有一个新的问题,我们可以发现有时候我们为一个类声明虚析构函数,有的时候则并没有声明虚析构函数,那么什么时候我们声明,什么时候并不声明虚析构函数呢?正如如下代码所表现的那样:在这个函数中我们并没有将基类的析构函数声明为virtual函数,那么到底原创 2017-07-18 21:02:10 · 230 阅读 · 0 评论 -
C++之不要让异常逃离析构函数(8)---《Effective C++》
条款8:别让异常逃离析构函数;我们先来参看如下代码:class A{public: ... ~A(){...}};void showA(){ std::vector<A> v; ...}考虑如下问题,当showA函数调用结束时,vector v这个局部变量需要被销毁,他讲负责销毁所有的A,加入v中有n个A,第一个A调用的时候发生异常,其他n-1个对象还是应该被原创 2017-07-19 15:07:21 · 235 阅读 · 0 评论 -
C++之构造函数和析构函数中不要调用virtual函数(9)---《Effective C++》
条款9:绝不要在构造函数和析构函数中调用virtual函数为什么不要在构造函数和析构函数中调用virtual函数呢?下面请大家带着上述问题来看如下代码:class Base{public: Base(); virtual void hello(); ... }private: int x; int y;};Base::Base()原创 2017-07-19 17:04:59 · 424 阅读 · 0 评论 -
C++之令operator=返回一个reference to *this(10)---《Effective C++》
条款10:令operator=返回一个reference to *this,即返回指向本类的引用。以前老有一个疑问,operator=为什么几乎所有的C++程序中的返回值都设置为指向本类的引用呢?曾经以为是因为连续赋值的问题,设置为引用可以实现连续赋值,不设置的话可能无法实现???那么答案到底是什么呢? 现在来参看如下代码:#include <iostream>#include <cstring原创 2017-07-19 17:35:01 · 430 阅读 · 0 评论 -
C++中在operator=中处理“自我赋值”(11)---《Effective C++》
**条款11:在**重点内容**operator=中处理“自我赋值”**“自我赋值”发生在对象被赋值给自己时: class Widget{…} Widget w; … w=w;//赋值给自己 a[i]=a[j];//潜在的自我赋值,如果i和j有相同的值,这便是个自我赋值 *px=*py;//潜在的自我赋值,如果px和py指向同一个问题,这也是自我赋值 甚至如下这样也可以: class原创 2017-07-19 21:03:57 · 493 阅读 · 0 评论 -
C++之关于static关键字的充电---补充(7)《Effective C++》
终于有时间啦,可以将以前挖的坑填啦! C++中的static与C语言有什么不同呢?我们指导C++语言添加了OOP思想,相对于C语言中的static有了新的引用场景,下面我们就来分析一下C++中C语言部分的static属性和C++ OOP部分的static属性! C语言部分static: 1)static局部变量 static局部变量在函数中调用的时候会最终返回的最新的static成员值,这个原创 2017-07-22 20:45:04 · 236 阅读 · 0 评论 -
C++之将成员变量声明为private(22)---《Effective C++》
条款22:将成员变量声明为privateC++中我们需要将成员变量声明为private,我们指导访问权限有public、private和protected,为什么我们要选择使用成员变量声明为private呢?如果使用public的话,任何外部函数或者外部类都可以访问它,使得整个类体系变得超级脆弱,外部的变化超容易对体系造成致命的攻击,所以许多成员变量应该被隐藏起来,通过public函数接口访问。通过原创 2017-07-24 07:36:40 · 450 阅读 · 0 评论 -
C++之复制对象时勿忘每一个成分(12)---《Effective C++》
条款12:赋值对象时勿忘其每一个成分C++中设计良好的对象系统会将对象的内部封装起来,只留下两个函数负责对象那个拷贝(赋值),即copy构造函数和copy operator=。 如果我们自己声明自己的copying函数,则C++的编译器则不会对我们自己提供的copying函数进行检验,即使copying函数出错了编译器并不会报错。 具体参看如下代码:class A{public: A(原创 2017-07-20 00:00:38 · 266 阅读 · 0 评论 -
C++之避免遮掩继承而来的名称(33)---《Effective C++》
条款33:避免遮掩继承而来的名称C++中我们需要注意作用域问题,尤其在继承体系中,可能存在覆盖问题,先看一下如下代码,了解一下作用域概念:int x;void someFunc(){ double x; std::cin>>x;}其作用域表示为: 可以看到当编译器处于someFunc函数的作用域中并遇见x时候,她现在local作用域内查找x,如果找不到在向外层作用域查找,如果原创 2017-08-01 14:27:30 · 282 阅读 · 0 评论 -
C++之宁以non-member,non-friend替换member函数(23)---《Effecive C++》
条款23:宁以non-memebr、non-friend替换member函数我们先来看看如下代码:class WebBrowser{public: ... void clearCache(); void clearHistory(); void removeCookies(); ...};如果我们想要清除浏览器中所有的Cache,cookie和histor原创 2017-07-24 14:57:16 · 830 阅读 · 0 评论 -
C++之若所有参数皆需类型转换,请为此采用non-member函数(24)---《Effective C++》
条款24:若所有函数皆需类型转换,请为此采用non-member函数请参看如下代码:class A{public: A(int xx):x(xx){ } int getX() const;private: int x;};现在我们需要对类A进行乘法运算,现在有两种方式可以选择。 1)member函数重载operator *运算符:class A{ ..原创 2017-07-24 15:43:06 · 395 阅读 · 0 评论 -
C++之区分接口继承和实现继承(34)---《Effective C++》
条款34:区分接口继承和实现继承接口继承和实现继承,即pure virtual和impure virtual或者non-virtual成员函数,现在我们可以查看如下代码:class Shape{public: virtual void draw() const=0; virtual void error(const std::string& msg); int object原创 2017-08-01 20:21:53 · 280 阅读 · 0 评论 -
C++之考虑写出一个不抛出异常的swap函数(25)---《Effective C++》
条款25:考虑写出一个不抛出异常的swap函数对于swap的一般是实现,我们可以参考以下代码,这也是缺省情况下标准库提供的swap算法:namespace std{ template<typename T> void swap(T& a,T& b){ T temp(a); a=b; b=temp; }}只要类型T支持copyi原创 2017-07-24 18:51:08 · 357 阅读 · 0 评论