cpp
ChaseRaod
这个作者很懒,什么都没留下…
展开
-
C++中的构造函数+拷贝构造函数+析构函数
1.构造函数 构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时,由编译器自动调用,在对象的生命周期内只调用一次,以保证每个成员都有一个合适的初始值。(1)不带参数的构造函数class Time{public : Time() :hour(0) , minute(0) , sec(0){}//初始化 void set_原创 2017-03-18 23:50:33 · 499 阅读 · 0 评论 -
网络基础:TCP三次握手/四次挥手
一、TCP报文格式 TCP/IP协议的详细信息参看《TCP/IP协议详解》三卷本。下面是TCP报文格式图:图1 TCP报文格式 上图中有几个字段需要重点介绍下: (1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。 (2)确认序号:Ack序号,占32位,只有ACK标志位为1时,确认转载 2017-07-22 22:27:06 · 254 阅读 · 0 评论 -
继承:单继承、派生类成员的访问属性、多继承、菱形继承、虚继承,菱形虚拟继承
1,派生类的声明方式class Student{public: void display() { cout << "num:" << num << endl; cout << "name:" << name << endl; cout << "sex:" << sex << endl; }private: int原创 2017-04-08 18:36:15 · 1021 阅读 · 0 评论 -
已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。
已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。 #include<iostream>using namespace std;struct Node{ int elem;//元素原创 2017-07-26 14:35:11 · 627 阅读 · 0 评论 -
C++智能指针深层剖析,模拟实现
C++中使用new和delete动态开辟和释放内存。但有时我们会忘记释放内存,这样就有可能出现内存泄漏等一些危险的情况。有时在尚有指针引用内存的情况下我们就释放了它,在这种情况下就会产生引用非法内存的指针。 为了更容易,也更安全地使用动态内存,C++提供了智能指针类型来管理动态对象。智能指针遵从RAII规则,我们先来介绍什么是RAII.RAII:是一种规范,一种解决问题的思想。负责资源分配即原创 2017-05-19 00:42:02 · 579 阅读 · 0 评论 -
深入理解explicit关键字
首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).那么显示声明的构造函数和隐式声明的有什么区别呢? 我们来看下面的例子:class CxString // 没有使用explicit关键字的类声明, 即默认为转载 2017-09-11 15:38:41 · 1949 阅读 · 0 评论 -
给定一个字符串A,同时给定它的长度n及参数字符数组arg,请返回替换后的字符串
给定一个字符串A,同时给定它的长度n及参数字符数组arg,请返回替换后的字符串。保证参数个数大数等于占位符的个数。保证原串由大小写字母组成,同时长度小于等于500。 测试样例:“A%sC%sE” ,7,['B','D','F'],3返回“ABCDEF”#include<vector>#include<assert.h>#include<string>//n是原串的长度,m是要替换的字符的数量原创 2017-09-23 14:42:44 · 1629 阅读 · 0 评论 -
根据Unix时间戳计算时间
根据Unix时间戳计算时间,不分大小月,每月30天,每年按360天计算。开始时间1970/01/01 00:00:00,输入秒数,显示时间输入:10 返回:1970/01/01 00:00:10 输入:12345678 返回:1970/05/23 21:21:18string CalculationDate(long long second){ int year = 1970, mon原创 2017-09-23 15:24:08 · 2284 阅读 · 0 评论 -
基于Vector实现C++中的适配器stack(顺序栈)
前面我们讲过用模板实现顺序表的代码实现 模板顺序表 而实际应用中,我们常需要将一种接口转换为用户所需要的另一种接口,这就要用到C++中的适配器,对原本的程序进行一层包装。栈就是其中的一种。 栈遵循后进先出的规则,其插入和删除都是在栈顶操作,是一种特殊的线性顺序表,因此,实现栈我们通常建立在顺序表的基础上。srack不允许遍历,也不提供迭代器。 下面是栈的代码实现:#define _CRT原创 2017-05-02 00:53:23 · 2011 阅读 · 0 评论 -
基于List实现适配器Queue(链式队列)
queue是一种先进先出的数据结构。它有两个出口,queue允许新增元素、移除元素、从最底端加入元素、取得最顶端的元素。queue不允许遍历,不提供迭代器。 代码如下:#define _CRT_SECURE_NO_WARNINGS 1#pragma once#include<iostream>#include<stdlib.h>using namespace std;template<原创 2017-05-02 01:19:32 · 666 阅读 · 0 评论 -
模板的分离编译
分离式编译是指一个完整的程序或项目由若干个源文件共同实现,每个源文件单独编译生成目标文件,最后将该项目中的所有目标文件连接成一个单一的可执行文件的过程。 每个.cpp源文件经过预处理,它所包含的.h文件的代码都会被展开到其中。再经过编译器的编译汇编等过程,将该.cpp文件转变为.obj文件,这是此文件已经变为二进制文件,本身包含的就是二进制代码。这时,该文件还不一定能够执行,因为并不保证其中转载 2017-10-06 14:31:56 · 475 阅读 · 0 评论 -
运算符重载的应用:日期类
#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>using namespace std;class Date{public: Date(int year = 1900, int month = 1, int day = 1) { if (year > 0 && (month > 0 && mo原创 2017-10-06 14:57:54 · 522 阅读 · 0 评论 -
高效合并两个有序数组
之前有篇文章是将字符串中的空格替换成字符将字符串中的空格替换成相应的字符,在这篇文章中,我们使用的是从后往前调整数组的方法,时间复杂度为O(N).那么,在合并两条有序数组时,使用同样的思想比分别遍历两个数组要高效的多。题目: 有两个排序的数组A1和A2,内存在A1的末尾有足够多的空余空间容纳A2.请实现一个函数,把A2中的所有数字插入到A1中,且合并后所有的数字是已排序的。//合并两个有序数组#原创 2017-11-02 09:52:24 · 1629 阅读 · 0 评论 -
求数组中出现次数超过一半的数字
思路和代码参考《程序员编程艺术》第二十一章“发帖水王”及其扩展。求一个数组中出现次数超过一半的数字。比如有一个数组arr[] = {2,1,3,2,2,1,4,2,2,2},这个数组中出现次数超过一半的数字就是2。思路: 数组中有有个数字出现次数超过一半,也就是说,有个数字出现的次数比其他数字出现的次数的和还要多。我们可以在遍历数组时保存两个值,一个是数组中的数字,一个是该数字出现的次数。当我们遍历原创 2017-07-22 17:28:01 · 419 阅读 · 0 评论 -
给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N!=3 628 800,N!的末尾有两个0。
思路:如果N是一个很大的数,它的阶乘可能已超出计算机所能计算的最大范围,因此可能会导致溢出。我们换个角度想, N!=1×2×3×4×5×6×··· ×N我们可以对N!进行分解质因数,即N!=(2^x)×(3^y)×(5^z) ··········可以看到2和5相乘必然会产生一个10,而这个10会在阶乘的末尾添加一个0。那么问题就转化为(2^x) ×(5^z))可以产生多少个0,即min(x,z),原创 2017-07-22 07:38:37 · 1693 阅读 · 0 评论 -
【C++】将字符串中的空格替换成字符
替换字符串中的空格为$$$。要求时间复杂度为O(N) 例如:将”talk is cheap show me the code”替换为:“talk$$$is$$$cheap$$$show$$$me$$$the$$$code”思路:将原数组的空格替换为特殊符号,那么原数组的大小也改变了,因此我们需要定义新的字符串大小,因为将空格替换为$$$原数组大小每个空格的地方增加两个空格大小,新数组 = 原数组大小原创 2017-07-20 21:41:50 · 3937 阅读 · 0 评论 -
对象数组+对象指针+指向对象的指针
1.对象数组的每一个元素都是同类的对象class Student{public: Student(int score)//只有一个参数时 :_score(score){} private: int _score;};int main(){ Student stu1[3] = { 60, 70, 90 };//三个实参分别传给数组的三个构造函数原创 2017-03-19 23:05:11 · 7440 阅读 · 0 评论 -
CPP中的this指针
this指针是类的一个自动生成、自动隐蔽的私有成员,它存在于类的非静态成员中,指向被调用函数所在的对象。 全局仅有一个this指针,当一个对象被创建时,this指针就存放指向对象数据的首地址。class Ctest{public: void Funtest(int iValue) { _iValue = iValue; } void Print(原创 2017-03-12 14:48:26 · 3037 阅读 · 1 评论 -
多态和虚表
一,多态 在面向对象的方法中一般是这样描述多态的:向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为(即方法)。多态性的表现形式之一是:具有不同功能的函数可以用同一个函数名,这样就可以实现用一个函数名调用不同内容的函数。 1,静态多态 静态多态是通过函数重载实现的。由函数重载和运算符重载形成的多态性属于静态多态,要求编译器在程序编译时就知道调用函数的全部信息。静态多态性又称编原创 2017-04-14 00:23:59 · 1104 阅读 · 0 评论 -
new/delete 与 malloc/free 的区别
new/delete 与 malloc/free有什么区别呢?这是一道面试中经常会被问到的问题。这篇博客将为大家详细解说两者的区别。1,申请的内存所在位置 new 操作符 从自由存储区上为对象动态分配内存,而malloc 函数从堆上动态分配内存。2,返回类型安全性 new操作符为对象成功分配内存后,返回的是对象类型的指针,类型严格与对象匹配,不需要再对其进行类型转化。而malloc内存原创 2017-04-29 22:12:34 · 503 阅读 · 0 评论 -
模板双向链表
顺序表和链表几乎是面试必考点,前面我们已经介绍过了模板顺序表(http://blog.csdn.net/ChaseRaod/article/details/70477564)这篇文章给大家介绍介绍一下模板双向链表用模板写链表主要还是为了实现代码的类型通用性,以下代码将实现链表的增、删、查、改、判空等操作。#define _CRT_SECURE_NO_WARNINGS 1#pragma once#原创 2017-04-29 22:39:40 · 1148 阅读 · 0 评论 -
C++:函数模板、类模板及其特化
模板分为函数模板和类模板。下面我们先来介绍函数模板. 1,函数模板:该函数与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型。 我们距离来说明函数模板的具体用法。 定义一个实现加法功能的函数模板:template <typename T>//模板参数列表T Add(T left,T right)//函数模板{ return left+right;}模板函数也可以定义为内联函原创 2017-04-18 19:49:04 · 757 阅读 · 0 评论 -
常对象+常对象成员+指向对象的常指针+指向常对象的指针变量+对象的常引用
**1,常对象** 在定义对象时加关键字const,指定对象为常对象,常对象必须要有初值,定义后就不可修改。Time const t1(10, 20, 30);//定义t1是常对象const Time t1(10, 20, 30);//等价说明:(1)如果一个对象被声明为常对象,则通过该对象只能调用它的常成员函数,而不能调用该对象的普通成员函数(出了由系统自动调用的隐式的构造函数和析构函数)。常原创 2017-04-06 00:59:32 · 2135 阅读 · 0 评论 -
面试题:String类的浅拷贝、深拷贝、写时拷贝
String的拷贝是面试中的经常会被问到的问题,所以,学懂String类是非常重要的。下面我们先来看一段代码:class String{public: String(const char* pStr = "")//构造函数 { if (pStr == NULL) { _pStr = new char[1];原创 2017-04-16 15:50:28 · 1382 阅读 · 0 评论 -
模板顺序表
用模板写函数或类都与类型无关,因此,STL中都是用模板实现容器,下面我们来介绍用模板实现顺序表。 关于模板的知识,在之前的博客中有提到: http://blog.csdn.net/gatieme/article/details/51383272#include<iostream>using namespace std;#include<string>//模板顺序表template<clas原创 2017-04-22 21:51:14 · 612 阅读 · 0 评论 -
C++中的异常处理
C++中的异常是指存在于运行时的反常行为,这些行为超出了函数正常功能的范围。典型的异常包括失去数据库,失去数据库连接以及遇到意外输入等。当程序某部分检测到一个它无法处理的问题时,需要用到异常处理。 我们来看传统的错误处理方式,在以后的处理中避免用到: 1.终止程序(例如atol,atoi,输入NULL,会产生段错误,导致程序异常退出,如果没有core文件)2.返回一个表示错误的值(很多原创 2017-05-04 00:15:32 · 480 阅读 · 0 评论 -
面试题:C++如何只在堆上或栈上生成对象
栈一般是静态建立一个对象时,由编译器自动创建,而堆通常是调用new来动态开辟内存。由此可知,如果不能调用new,那么也就无法在堆上生成对象了。我们将operator new和operator delete置为私有部分,类外就无法调用new在堆上生成对象了,也就只能在栈上生成对象。代码如下:class B{public: B() { cout << "B()" <原创 2017-05-18 20:06:16 · 464 阅读 · 0 评论 -
冒泡排序和选择排序(C++实现)
冒泡排序:从数组的第一个元素开始(arr[0]),两两比较(arr[n],arr[n+1]),如果前面的数大于后面的数,则交换两个元素的位置,把大的数往后移动。经过一轮比较后,最大的数会被交换到最后的位置(arr[n-1])。选择排序:通过比较,选出每一轮中最值元素(最大或最小),然后把它和本轮中的第一个元素进行交换,所以这个算法的关键是要记录每次比较的结果,即每次比较后的最值位置(下标)。冒泡排序原创 2017-06-15 00:37:38 · 770 阅读 · 0 评论 -
【C++】关于继承、多态的重点部分复习
关于继承和多态之前的博客中有讲到,但因为最近在复习C++的一些概念,所以把一些遗漏的同样是重点的知识点再简单整理一下,具体基础知识请戳链接:继承:http://blog.csdn.net/chaseraod/article/details/69704143 多态:http://blog.csdn.net/chaseraod/article/details/697041431,C++的三大特性是什么原创 2017-07-16 14:31:17 · 565 阅读 · 0 评论 -
动态内存管理
C语言动态内存管理 C语言中使用malloc/calloc/realoc/free进行动态内存管理 学习之前,我们先要清楚,这些动态开辟的内存都是在堆上进行的。1,mallocvoid *malloc(size_t size);使用malloc开辟内存需要注意的是: (1)返回值是void*,需要你手动转换成需要的类型,且开辟内存的大小也需要手动去指定。比如:int *p = (int*)ma原创 2018-01-04 20:07:19 · 520 阅读 · 0 评论