
C++
文章平均质量分 64
zhanghow
人生是一个长跑,不要在意短期的得失,更重要的是自己是否在正确的方向上。
展开
-
链表 C++
2016.8.22 C++ 第十四天链表定义:物理单元存取不连续的数据结构,数据元素之间通过‘指针’进行连接(链表中每一个元素->节点)节点组成;1⃣️数据 2⃣️指针(因为元素间不连续,通过指针进行连接)注意:没有下表符重载,可以在任意位置操作,从头结点遍历到尾节点1⃣️单向链表2⃣️双向链表3⃣️循环链表#include #include #incl原创 2016-09-22 21:25:30 · 297 阅读 · 0 评论 -
C++ 模板的显示具体化
C++ 没有办法限制类型参数的范围,我们可以使用任意一种类型来实例化模板。但是模板中的语句(函数体或者类体)不一定就能适应所有的类型,可能会有个别的类型没有意义,或者会导致语法错误。例如有下面的函数模板,它用来获取两个变量中较大的一个:template const T& Max(const T& a, const T& b){ return a > b ? a : b;原创 2016-12-12 10:19:31 · 4704 阅读 · 1 评论 -
C++ 菱形继承问题 虚继承和虚基类
多继承(Multiple Inheritance)是指从多个直接基类中产生派生类的能力,多继承的派生类继承了所有父类的成员。尽管概念上非常简单,但是多个基类的相互交织可能会带来错综复杂的设计问题,命名冲突就是不可回避的一个。多继承时很容易产生命名冲突,即使我们很小心地将所有类中的成员变量和成员函数都命名为不同的名字,命名冲突依然有可能发生,比如典型的是菱形继承,如下图所示:图1原创 2016-12-12 20:30:02 · 1211 阅读 · 0 评论 -
C++虚继承时的构造函数
在虚继承中,虚基类是由最终的派生类初始化的,换句话说,最终派生类的构造函数必须要调用虚基类的构造函数。对最终的派生类来说,虚基类是间接基类,而不是直接基类。这跟普通继承不同,在普通继承中,派生类构造函数中只能调用直接基类的构造函数,不能调用间接基类的。下面我们以菱形继承为例来演示构造函数的调用:#include using namespace std;//虚基类Aclass A原创 2016-12-12 21:14:44 · 1881 阅读 · 0 评论 -
C++ 函数重载 详解
在实际开发中,有时候我们需要实现几个功能类似的函数,只是有些细节不同。例如希望交换两个变量的值,这两个变量有多种类型,可以是 int、float、char、bool 等,我们需要通过参数把变量的地址传入函数内部。在C语言中,程序员往往需要分别设计出三个不同名的函数,其函数原型与下面类似:void swap1(int *a, int *b); //交换 int 变量的值void原创 2016-12-12 21:20:08 · 63915 阅读 · 14 评论 -
C++多态的概念以及用途(通俗易懂)
基类的指针也可以指向派生类对象,请看下面的例子:#include using namespace std;//基类Peopleclass People{public: People(char *name, int age); void display();protected: char *m_name; int m_age;};People::People(ch原创 2016-12-12 21:22:35 · 9267 阅读 · 7 评论 -
C++ 虚函数使用注意点 与 多态的关系
虚函数对于多态具有决定性的作用,有虚函数才能构成多态,这节我们来重点说一下虚函数的注意事项。1) 只需要在虚函数的声明处加上 virtual 关键字,函数定义处可以加也可以不加。2) 为了方便,你可以只将基类中的函数声明为虚函数,这样所有派生类中具有遮蔽(覆盖)关系的同名函数都将自动成为虚函数。3) 当在基类中定义了虚函数时,如果派生类没有定义新的函数来遮蔽此函数,那么将使原创 2016-12-12 21:36:36 · 1984 阅读 · 0 评论 -
C++动态绑定和虚函数表vtable (动态实现原理)
关于C++内部如何实现多态,对程序员来说即使不知道也没关系,但是如果你想加深对多态的理解,写出优秀的代码,那么这一节就具有重要的意义。 我们知道,函数调用实际上是执行函数体中的代码。函数体是内存中的一个代码段,函数名就表示该代码段的首地址,函数执行时就从这里开始。说得简单一点,就是必须要知道函数的入口地址,才能成功调用函数。找到函数名对应的地址,然后将函数调用处用该地址替换,这称为函数绑定原创 2016-12-12 21:38:03 · 4972 阅读 · 0 评论 -
C++ 函数调用 默认参数
在C++中,定义函数时可以给形参指定一个默认的值,这样调用函数时如果没有给这个形参赋值(没有对应的实参),那么就使用这个默认的值。也就是说,调用函数时可以省略有默认值的参数。如果用户指定了参数的值,那么就使用用户指定的值,否则使用参数的默认值。所谓默认参数,指的是当函数调用中省略了实参时自动使用的一个值,这个值就是给形参指定的默认值。下面是一个简单的示例:#includeusi原创 2016-12-06 17:35:30 · 8922 阅读 · 0 评论 -
C++ This 详解
this 是 C++ 中的一个关键字,也是一个 const 指针,它指向当前对象,通过它可以访问当前对象的所有成员。所谓当前对象,是指正在使用的对象。例如对于stu.show();,stu 就是当前对象,this 就指向 stu。下面是使用 this 的一个完整示例:#include using namespace std;class Student{public:原创 2016-12-06 17:57:23 · 7163 阅读 · 0 评论 -
C/C++中内存区域划分大总结
程序由代码和数据组成,其中代码存储在代码区中,数据根据类型的不同存储在不同的区域中。本文分别介绍了C和C++中内存区域的划分。C++作为一款C语言的升级版本,具有非常强大的功能。它不但能够支持各种程序设计风格,而且还具有C语言的所有功能。我们在这里为大家介绍的是其中一个比较重要的内容,C和C++内存区域的划分。一、 在c中分为这几个存储区1.栈 - 由编译器自动分配释放原创 2016-12-19 11:40:57 · 597 阅读 · 0 评论 -
拷贝构造函数
拷贝构造函数:定性:众多普通构造函数之一,用来对成员变量进行初始化 用已经存在的对象来进行初始化新对象拷贝构造函数参数一定是个引用,不能使用值传递形式(1)用已经存在的对象初始化另一个对象Text a; // 调用默认构造函数 Text b(a);// 调用拷贝构造函数*** Text c=a;// 调用拷贝构原创 2016-12-19 15:58:55 · 341 阅读 · 0 评论 -
C++ 浅拷贝 && 深拷贝
浅拷贝问题:1⃣原对象指针指向的堆空间内存泄漏 2⃣两个指针指向同一块空间,修改一个对象内容,另一个也跟着发生改变 3⃣因为两个对象指向同一块空间,所以对象结束,会造成内存二次删除(程序崩溃)深拷贝:1⃣避免自赋值// a=b2⃣释放旧空间3⃣开辟新空间4⃣赋值㇏原创 2016-12-19 16:31:26 · 570 阅读 · 0 评论 -
函数指针 与 指针函数
童鞋们,别搞混了!函数指针顾名思义:是一个指针指向了一个函数。(这是一个函数,只不过这个函数由一个指针指向它)当然,此函数的返回值同样可以返回一个指针 -》一个指针指向了一个指针函数 (真tm绕啊,重在理解)例子:/* * 求最大值 * 返回值是int类型,返回两个整数中较大的一个 */ int max(int a,原创 2017-01-09 21:21:20 · 330 阅读 · 0 评论 -
struct 字节对齐详解
现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的C原创 2017-02-16 17:49:50 · 13174 阅读 · 2 评论 -
C++11新特性
C++11新特性(1)对象构造的改良在标准C++中,构造函数不能调用其它的构造函数;每个构造函数必须自己初始化所有的成员或是调用一个共用.的成员函数。基类的构造函数不能够直接作 为派生类的构造函数;就算基类的构造函数已经足够,每个派生的类仍必须实现自己的构造函数。类中non-constant的数据成员不能够在声明的地方被 初始化,它们只能在构造函数中被初始化。 C++11将会提供这些问题的原创 2016-12-01 19:59:35 · 579 阅读 · 0 评论 -
C++ 虚函数 详解 及实现
C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。关于虚函数的使用方法,我在这里不做过原创 2016-10-30 10:18:18 · 7930 阅读 · 0 评论 -
C++ 标准模板库 容器 vector list Deque set map
标准模板库容器:1、顺序容器1⃣️vector(向量):可以随机访问任何一个元素(下标操作符系统默认重载)添加、删除元素在末尾2⃣️Deque(队列):可以随机访问任何一个元素(下标操作符系统默认重载)添加删除元素在头部和尾部都可以进行3⃣️List(链表):顺序访问(没有下标操作符重载),任意位置添加删除元素vector:头部添加删除元素与元素个数成正比,尾部添加删除元素原创 2016-10-22 14:49:44 · 593 阅读 · 0 评论 -
常见排序的实现 c++ 冒泡排序 插入排序 选择排序 快速排序
直接搂代码原创 2016-09-22 21:20:31 · 893 阅读 · 0 评论 -
C++基础 (二)有关于类
2016.8.3 C++ 第二天 // private:数据安全,保护属性,外界(本类之外)不能访问到 // public:提供接口,类与外部之间的一个桥接 // 属性:成员变量 private // 行为:成员函数 public构造函数作用:对成员变量进行初始化特征:1⃣️必须为public 2⃣️函数名和类原创 2016-09-22 21:42:36 · 400 阅读 · 0 评论 -
C++基础(三)成员函数 友元函数
break与continue int i=0; while (i printf("i=%d\n",i); i++; if (i==5) { continue;//换为break,i的值0~4输出 } }// i的值0~9输出break 跳到循环后continue原创 2016-09-22 21:43:35 · 486 阅读 · 0 评论 -
C++基础 (一)面向对象
面向对象3大特点封装、继承、多态封装:把数据和操作数据的函数组织在一起,提高安全性继承:子承父业,提高代码的复用与可可扩充性多态:同一个消息不同的行为,对问题更好的抽象,有利于代码的维护类是客观世界中具有相同属性和行为的一组对象的抽象(一种类型,比较struct)(注意,声明类结束的时候加上分号“;”)对象:1.属性 2. 行为类 对象int原创 2016-09-22 21:41:34 · 371 阅读 · 0 评论 -
C++ 子类对象当父类对象使用
子类对象当父类对象使用1⃣️把子类对象直接赋值给父类对象(等号左边是父类对象,等号右边是子类对象)子类对象赋值给父类对象,仅仅把继承自父类部分成员函数赋值给父类对象赋值完成后等号左边依然是一个父类对象 Derived d; Base b; b=d;//把子类对象d当成父类对象来使用(父类对象不能赋值给子类对象,也就是说父类对象不能当成子类对象使用)2⃣️父类的引用指原创 2016-10-22 14:45:59 · 8512 阅读 · 0 评论 -
多继承 菱形继承
多继承:一个类有两个或两个以上的父类,称之为多继承。注意:1⃣️多个父类构造函数的调用顺序 // 与继承顺序相同 2⃣️如何辨别多个父类中同名函数 (如果多个父类中出现同名函数,子类中没有重写此函数,通过子对象调用此函数,出现二义性)解决办法:1.重写此函数 3⃣️菱形继承问题办法:虚继承(直接从爷爷类继承成员) son & operato原创 2016-10-22 14:48:54 · 421 阅读 · 0 评论 -
C++ 多态 虚函数 纯虚函数 动态、静态转换
多态:由父类指针统一操作子类对象多态优点:由父类指针管理子类,可以照顾到未来代码(维护)。比如说添加一个新的子类,只需要重写函数,不必修改源代码虚函数 :父类指针、引用调用正确的被覆盖的函数,此时成员函数需要声明成虚函数注意:如果父类中的成员函数是虚函数,那么子类中重写这个函数默认为虚函数父类指针、引用调用函数:1、查看基类中函数是否为虚函数2、不是的话调用父类成员函数,是的话查看原创 2016-10-22 14:47:44 · 854 阅读 · 0 评论 -
C++ 链表
链表定义:物理单元存取不连续的数据结构,数据元素之间通过‘指针’进行连接(链表中每一个元素->节点)节点组成;1⃣️数据 2⃣️指针(因为元素间不连续,通过指针进行连接)注意:没有下表符重载,可以在任意位置操作,从头结点遍历到尾节点1⃣️单向链表2⃣️双向链表3⃣️循环链表#include #include #include typedef struct原创 2016-10-22 14:50:32 · 252 阅读 · 0 评论 -
C++ 操作符重载
操作符重载定义:操作自定义类型的数据(例如两个点)注意:1⃣️只能重载已经存在的运算符 2⃣️操作数的数目必须和原始定义一致 3⃣️至少有一个操作数为自定义类型 4⃣️重载后优先级不变operator:重载的符号是什么// 重载 + (友元、成员函数均可)friend Point operato原创 2016-10-22 14:52:52 · 338 阅读 · 0 评论 -
C++ 继承
注意:派生类中访问基类成员权限跟该成员在基类的声明有关,其继承方式只是将该派生类封装起来,与外部的访问有关系。继承:一个类自动拥有另一个类的所有成员父类(基类) 子类(派生类)子类自动拥有父类所有成员(不包括构造函数、析构函数、赋值运算符重载)子类中包含两部分成员:1部分从父类继承得到,一部分是子类拓展虽然发生继承,父类中私有成员在子类中不能直接访问,可以通过公有成员函数原创 2016-10-22 14:54:01 · 497 阅读 · 0 评论 -
C++ 赋值运输符重载
赋值运输符重载浅拷贝问题:1⃣️原对象指针指向的堆空间内存泄漏 2⃣️两个指针指向同一块空间,修改一个对象内容,另一个也跟着发生改变 3⃣️因为两个对象指向同一块空间,所以对象结束,会造成内存二次删除(程序崩溃)深拷贝:1⃣️避免自赋值// a=b2⃣️释放旧空间3⃣️开辟新原创 2016-10-22 14:54:39 · 489 阅读 · 0 评论 -
C++ 作用域与生命周期 静态static
1⃣️静态局部变量 作用域不变,生命周期延长至程序运行结束2⃣️静态全局变量 作用域变小,不能extern引用,生命周期不变类中的静态成员:成员函数,成员变量都是使用对象来进行调用,也有些数据成员和成员函数属于整个类,称这些成员为类的静态成员(这些成员不属于对象,创建对象时不会为静态成员开辟空间)静态成员整个类只有一份空间(静态空间)Emploee::pay(50);原创 2016-10-22 14:56:13 · 3533 阅读 · 0 评论 -
C++ 浅拷贝 const static 关键字
浅拷贝:可以把一个对象赋值给另外一个对象,对象的每个成员的值,将一一对应拷贝到新的对象。const 定义常量,值不能被修改,声明时必须对其初始化常量指针:地址可以改变,不能改变指向变量的值指针常量:可以改变指向,可以改变变量的值const 修饰函数(修饰哪,哪不能变)const int func(const Point &p) const;1⃣️int fu原创 2016-10-22 14:57:52 · 328 阅读 · 0 评论 -
四种经典排序 冒泡,快排,插入,选择 C++实现
2016.8.23 C++原创 2016-10-22 14:52:10 · 1272 阅读 · 0 评论 -
C++开发者都应该使用的10个C++11特性
在C++11新标准中,语言本身和标准库都增加了很多新内容,本文只涉及了一些皮毛。不过我相信这些新特性当中有一些,应该成为所有C++开发者的常规装备。你也许看到过许多类似介绍各种C++11特性的文章。下面是我总结的,C++开发者都需要学习和使用的C++11新特性。 auto在C++11之前,auto关键字用来指定存储期。在新标准中,它的功能变为类型推断。auto现在成了一个类原创 2017-03-27 15:00:53 · 1007 阅读 · 0 评论