C++
文章平均质量分 64
海绵宝宝的欧尼
要想人前显贵,必得人后受罪!
展开
-
c++::关于引用
首先学习c++的时候,我们肯定会有一个疑问,c++既然继承了c的一些东西,肯定可以使用指针,但是为什么会出现‘引用’。欲知为何,待我细细道来:C++里为什么会有引用?答:1)不用担心NULL的问题 2)c++里要进行运算符重载,使用引用会比指针更好 3)引用是编译器层的东西,编译完后并不会占用内存,而指针是个数据,是要单独占用内存保存的【引用】:编译器不会为引用变量开辟内存原创 2016-10-21 16:24:21 · 2739 阅读 · 0 评论 -
c::关于虚函数的一点补充
【普通函数和虚函数调用的区别?】答:这个区别很重要:在抽象的继承模型中叫做多态就是说,你定义一个类,他们具有相同的接口但是具体的不同的类又有不同的特征,实现之类可能也完全不同但是你可以用共同的基类指针来管理虚函数在实现的时候,其实是在类里建了一个隐含的成员变量,是一个指向函数的指针所以从基类调用也可以调用到继承类定义的成员函数。【能否在构造函数里调用虚函数?】先原创 2016-12-14 08:35:58 · 1205 阅读 · 0 评论 -
c++::进入继承的世界
1、引言2、继承 2.1继承的概念 2.2继承的定义格式 2.3继承的权限和成员的访问权限 2.4派生类成员的构造函数和析构函数的顺序 2.5继承体系中的作用域 2.6继承中额同名隐藏 2.7继承中的赋值兼容规则 2.8什么关系或者成员是不能继承的 2.9继承的分类 &2.1.1单继承原创 2016-12-14 11:19:45 · 1323 阅读 · 0 评论 -
c++::获取结构体中某 个成员相对结构体起始位置的偏移
我们使用宏offsetof,这个宏具体是什么?怎么用? 接下来我来详细说明:【offsetof的定义】: 在MSDN上是这样定义的:size_t offsetof( structName, memberName ); 1)第一个参数是结构体的名字,第二个参数是结构体成员的名字 2)该宏返回结构体中成员的偏移量,返回值是size_t 类型的【of原创 2016-12-17 14:09:08 · 4998 阅读 · 0 评论 -
c++:定位new表达式
在c++中new有三种用法:实例化一个对象;实例化一个数组;定位new表达式。那么今天我来说下第三种用法。【什么是定位new表达式】: 就是在内存中new一块地址,然后将大小合适的实例化对象放入该地址中的操作方法【什么性质:】 就是在已申请的内存空间中调用构造函数【怎么使用定位new表达式】:1)格式:new (place_address) type(ini原创 2016-12-17 16:59:37 · 1326 阅读 · 0 评论 -
C++::一道有趣的面试题(关于delete)
一位学长去面试遇到了这样一道题:#includeusing namespace std;class Test{public: Test() {} ~Test() { delete this; }};int main(){ Test a; return 0;}**大家来说下程序的运行结果是什么?乍一看没问题啊,实则不然,程序崩溃!!!**我们来好好看一遍代码原创 2016-12-17 20:09:53 · 462 阅读 · 0 评论 -
c++::写一个通用的冒泡排序
本程序利用模板和仿函数实现一个通用的冒泡排序,即可以灵活的实现从大到小的排序和从小到大的排序。话不多说,直接上代码:#includeusing namespace std;//从小到大templateclass More{public: bool operator()(T left, T right) { return left>right; }};//从大到小te原创 2016-12-17 20:38:44 · 660 阅读 · 0 评论 -
C++::几道关于对象模型的经典题
1、我们先来看第一道:#includeusing namespace std;class A{public: A() { m_a = 1; m_b = 2; } void fun() { cout<<m_a<<" "<<m_b<<endl; }private: int m_a; int m_b;};class B{public: B() {原创 2016-12-18 16:38:38 · 714 阅读 · 0 评论 -
c++::实现一个日期类
这里我实现一个简单的日期类#ifndef __TEST__#define __TEST__#includeusing namespace std;class Date{ friend ostream& operator<<(ostream& _cout,const Date& d); friend istream& operator>>(istream& _cin, Date&原创 2016-12-18 17:44:27 · 1275 阅读 · 0 评论 -
C++::如何知道创建了几个对象
分析:要知道创建了几个对象,即就是要知道构造函数被调用了几次,我们这里采用两种方法:方法一:定义一个全局变量(或者直接在构造函数里写一个输出语句,看此输出语句打印了多少次)举例代码:#includeusing namespace std;int count = 0;class Date{public: Date() { //<<"Date()"<<endl; co原创 2016-12-18 17:59:48 · 2687 阅读 · 0 评论 -
C++::模拟实现List
一些说明:我在这里实现的链表是双向链表,需要的说明几乎都在代码里进行说明了,所以其他的我也就不废话了,直接将代码贴出来,以供大家学习参考,当然有错误的欢迎指正。//双向链表#include#includeusing namespace std;//typedef Node Node;templatestruct Node{ Node(const T& data) : _da原创 2016-12-18 20:32:38 · 1188 阅读 · 0 评论 -
c++:模拟实现vector
一些说明:1)注意这里我实现的是动态顺序表。 2)容器类其实也就是顺序表,不过它的功能更强大,这里我只是简单的模拟实现一些简单的接口。#include#includeusing namespace std;templateclass Vector{public: Vector(); Vector(T arr[],size_t size);原创 2016-12-18 20:42:14 · 1273 阅读 · 0 评论 -
C++::如何测试一个函数的运行时间
说明:1)头文件ctime里面提供了一个函数: clock_t clock(); 该函数返回的是从程序开始运行到调用clock函数时所打的点数,即clock tick(时钟打点);2)有一个常数CLK_TCK,是机器时钟每秒所走的时钟打点数,是这样定义 的,#define CLK_TCK CLOCKS_PER_SEC # define CLOCKS_PE原创 2016-12-19 17:19:02 · 4029 阅读 · 0 评论 -
c::顺序表和链表
这节来说下顺序表和链表【前言】:1、什么是线性结构:n个数据元素的有序集合 1)集合中必存在唯一的“第一个元素” 2)集合中必存在唯一的“最后一个元素” 3)除第一个元素外,其他的元素都只有一个后继 4)除最后一个元素外,其他的元素都只有一个前驱2、线性表 1、顺序表 1.1定义: 把线性表中的节点按照逻辑次序原创 2016-12-19 19:49:59 · 1167 阅读 · 0 评论 -
c++::详解虚表
(注:以下的运行环境是vs2008)【虚表的定义】:1.1定义:每个有虚函数的类或者虚继承的子类,编译器都会为它生成一个虚表,表中的每一个元素都指向一个虚函数的地址(虚表是从属于类的)1.2理解的关键点:1)编译器会为包含虚函数的类加上一个成员变量,是一个指向该虚函数表的指针,虚表指针是从属于对象的,也就是说,如果一个类含有虚表,那么类的每个对象都含有虚表指针2)虚表的原创 2016-12-15 20:51:10 · 8037 阅读 · 3 评论 -
关于越界你不知道的事~~
**关于数组的越界问题: 一、 1、数组是 一组类型相同的对象的集合,由一组连续的地址进行存取。也可以将它想象成是一连串用下标编号的相邻存储区。 2、在某些语言中,可能是不允许超出数组定义中所设的界限的。但是在c/c++中数组没有这种安全措施。 我们先来看个例子:1)#includeusing namespace std;int main(){ int arr[原创 2016-11-28 09:36:30 · 3047 阅读 · 0 评论 -
c++::用模板实现List
我在用模板实现List的时候有很多奇奇怪怪的错误,以下我分享出来共勉,希望大家不要掉到和我一样的洞里。 1)因为使用的是模板,所以在每个需要换类型的地方都换成模板参数T(我用的是T,读者可自己定义) 2)赋值运算符的返回值和参数要带上 3)“*”:我在定义的节点类中,它不是内置类型,所以在下面使用的时候变量不要加*,如果加的话,就要进行重载//双向链表#include#i原创 2016-12-09 14:52:51 · 2818 阅读 · 0 评论 -
C++::由一个例子入手前置声明
【看到这篇文章,肯定有疑问,为什么要使用前置声明】?让我们先来看一段代码://date.h#includeusing namespace std;#include"time.h"class Date{public: Date(int year,int month,int day); Date(const Date&d); ~Date(); void fun();pri原创 2016-11-06 11:34:16 · 5164 阅读 · 1 评论 -
c++::让你足够了解构造函数和this指针
一、 this指针【特性】1、this指针的类型 类类型*const(类名*const),为右值2、this指针并不是对象本身的一部分,不影响sizeof的结果。3、this的作用域在类成员函数的内部。4、this指针是类成员函数的第一个默认隐含参数,编译器自动维护传递,类编写者不能显式传递。5、只有在类的非静态成员函数中才可以使用this指针,其它任何函数都原创 2016-10-17 20:09:53 · 8148 阅读 · 0 评论 -
c++::拷贝构造函数
一、【定义】:只有单个形参,而且该形参是对本类类型对象的引用(常用const修饰),这样的构造函数称为拷贝构造函数。拷贝构造函数是特殊的构造函数,创建对象时使用已存在的同类对象来进行初始化,由编译器自动调用。二、【特征】:1、它是构造函数的重载。2、它的参数必须使用同类型对象的引用传递。(思考为什么?)答:因为如果是普通的值传递的话,则会产生临时变量,调用拷贝构造函数,一直递归原创 2016-10-17 20:20:26 · 3104 阅读 · 0 评论 -
C++::初识类(小白的进阶基石)
一、类1、【类的定义】:class ClassName/*类名字*/{// 类实现体};class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号。类中的元素称为类的成员;类中的数据称为类的属性或者类的成员数据;类中的函数称为类的方法或者成员函数。2、【类的两种定义形式】a、直接在类声明时定义b、声明和定义不在同一个原创 2016-10-17 20:23:16 · 3937 阅读 · 0 评论 -
c++::析构函数
一、【定义】:析构函数:与构造函数功能相反,在对象被销毁时,由编译器自动调用,完成类的一些资源清理和汕尾工作二、【特性】a、析构函数在类名(即构造函数名)加上字符~。b、析构函数无参数无返回值。所以不支持重载c、一个类有且只有一个析构函数。若未显示定义,系统会自动生成缺省的析构函数。d、对象生命周期结束时,C++编译系统系统自动调用析构函数。e、注意析构函数体内并不是删原创 2016-10-20 14:48:34 · 3004 阅读 · 0 评论 -
C::在拷贝里memcpy和for的区别~~
我们开门见山,直接说明问题:先看代码:(这里我用用模板实现容器类的一段代码来说明问题)//赋值运算符重载函数templateVector& Vector::operator=(const Vector& v){ if(this != &v) { T* temp = new T[v._capacity]; for(size_t i= 0; i<_size; i++) {原创 2016-11-28 21:45:50 · 5860 阅读 · 0 评论 -
c++::操作符重载
一、【定义】:1、重载操作符是具有特殊函数名的函数,关键字operator后面接需要定义的操作符符号。2、操作符重载也是一个函数,具有返回值和形参表。它的形参数目与操作符的操作数目相同,3、函数调用操作符可以接受任意数目的操作数。4、使用运算符重载可以提高代码的可读性。二、形式:返回类型 operate 操作符(参数列表);三、四、【注意】:注意:原创 2016-11-13 12:57:45 · 4746 阅读 · 0 评论 -
c++::模板你不知道的事~
一、相信大家会有疑问,为什么要使用模板?别着急,先来看一个例子:首先如果我们要写一个通用加法的函数,会采用什么办法呢:方法一:采用函数重载的方式,你需要什么类型我们就重载出来什么类型int Add(const int &x, const int &y){ return (x + y);} float Add(const float &x, const float &y){原创 2016-11-13 13:00:04 · 4770 阅读 · 0 评论 -
c++::关于类型萃取
听到类型萃取这个名字,很多人肯定都感觉好高大上啊,会不会很难,是个什么东西呢?别着急,听我娓娓道来。【类型萃取】说白了就是对模板特化的一种应用。1、类型萃取的作用:类型萃取使用模板技术来萃取类型(包含自定义类型和内置类型)的某些特性,用以判断该类型是否含有某些特性,从而在泛型算法中来对该类型进行特殊的处理用来提高效率或者其他。我们来看一道读类型萃取应用的题:如果我们要编写一道通用加法的原创 2016-11-13 17:36:32 · 5467 阅读 · 0 评论 -
c++::浅析c++异常
我觉得看到这篇文章的人肯定有很多疑问,比如:什么是异常?为什么要使用异常?使用异常会对程序代码有什么影响以及不使用又会怎样?等等。那么接下来我一一为你解答,跟着我揭开异常的面纱。【我们还是先来了解一下什么是异常?】1、了解异常之前,我先问大家,我们写出的程序,如果它消亡了,会有几种消亡的形式?我总结了一下,大体上,一共有三种:1)无疾而终:就是程序自然的消亡,就是它的周期到了,就像原创 2016-11-17 13:48:43 · 5088 阅读 · 0 评论 -
C++::多态那点事~~
首先我们先来了解下对象模型:【对象模型】:eg:接下来我们进入多态的世界:【多态】一、多态的定义: 多态:“一个接口,多种方法”,具有多种形式多种形态指的是指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。二、多态的分类1、静态多态:1)静态多态设计思想:对于相关的对象类型,直接实现它们各自的定义,不需要共原创 2016-12-11 20:40:52 · 803 阅读 · 0 评论 -
C++::关于虚函数,纯虚函数
一、虚函数1、虚函数的定义:被virtual修饰的成员函数2、作用:实现动态多态(对于怎么实现多态,我在多态的那篇文章中有详细的清楚的讲解,不太明白的同学可以先去看看,这里为了方便,我直接附上链接吧:)二、纯虚函数1、定义:在成员函数的形参后面写上=0,此函数就是纯虚函数。2、作用:在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现交给派生类。原创 2016-12-11 22:26:49 · 2165 阅读 · 0 评论 -
c++::如何防拷贝~
如何防拷贝:1)拷贝构造函数和赋值运算符重载作为私有属性2)并且只给出声明原创 2016-12-09 12:17:37 · 1229 阅读 · 0 评论 -
C++::浅拷贝,深拷贝,引用计数的拷贝,写时拷贝
【什么情况下会用到c++中的拷贝构造函数】: 1)用已经存在的同类的对象去构造出另一个新的对象 2)当函数的形参是类的对象时,这时调用此函数,使用的是值的拷贝,也会调用拷贝构造函数 3)当函数的返回值是类的对象时,这时当函数调用完后,会将函数的对象拷贝构造出一个临时的对象并传给函数的返回处【浅拷贝】:(位拷贝(值拷贝))1、概念:所谓的浅拷贝就是当在进行对象的复制时原创 2017-01-04 21:47:10 · 2754 阅读 · 1 评论