C++
C++
ETalien_
足够优秀才能接住上天给的惊喜和机会
展开
-
C++:define和const的区别
define和const的区别define定义的常量是没有类型的,如#define MAX 255,编译器只是把定义的变量名和变量值对应起来;const定义的常量是有类型的,存放在静态区中,如const float MAX = 255;。也正是因为define无类型,所以没有类型安全的检查就有可能会有意想不到的错误,而const会在编译的时候进行类型检查define定义的变量是在预编译的时候...原创 2019-12-18 20:08:46 · 354 阅读 · 0 评论 -
C++:RAII思想和智能指针(auto_ptr,unique_ptr,shared_ptr)
智能指针有的时候使用malloc或者new创建的对象忘记释放就会导致内存泄漏,又或者此时释放语句之前有一段代码是抛异常的话,那么执行流就会乱跳,导致内存也无法释放。比如这一段代码,at越界访问会导致抛异常,导致执行流跳出从而没有释放指针p。void Func(){ int* p = new int; vector<int> v; v.at(0) = 10;//会抛异常 ...原创 2019-04-04 22:36:58 · 1084 阅读 · 2 评论 -
C++:C++中的类型转换(static_cast、reinterpret_cast、const_cast、dynamic_cast)
C语言中的类型转换隐式类型的转换(相近类型)显示强制类型的转换(不相关类型)void Test(){ int i = 1; // 隐式类型转换 double d = i; printf("%d, %.2f\n", i, d); // 显示的强制类型转换 int* p = &i; int address = (int)p; printf("%x, %d\n", p, ...原创 2019-04-07 19:05:07 · 345 阅读 · 0 评论 -
C++:set、map的使用及其特性和区别
set、map的使用及其特性和区别STL总共实现了两种不同结构的管理式容器:树型结构与哈希结构。树型结构的关联式容器主要有四种:set,map,multiset,multimap。下面介绍一下这四种容器的简单使用。1.setset里面每个元素只存有一个key值,它支持高效的关键字查询操作,比如检查一个关键字是否在set中。如果这个key值之前存在的话就不插入。简单使用如下:插入:set...原创 2019-04-21 22:00:39 · 22767 阅读 · 0 评论 -
C++:map的operator[]的底层实现及其使用
map的operator[]的底层实现首先我们都知道map的operator[]可以通过key值找到对应的value值。成员类型含义key_typeThe first template parameter (Key)mapped_typeThe second template parameter (T)value_typepair<const key...原创 2019-04-23 09:38:20 · 3404 阅读 · 0 评论 -
C++:C++的IO流
C++的IO流C语言中的输入输出常用的是scanf()和printf()。scanf(): 从标准输入设备(键盘)读取数据,并将值存放在变量中。printf(): 将指定的文字/字符串输出到标准输出设备(屏幕)。注意宽度输出和精度输出控制。当我们在进行输入输出的时候并不是直接输入输出的,而是有一个输入缓冲区和输出缓冲区的,这两个缓冲区可以实现“行”读取的行为,对于计算机而言是没有“行”这个...原创 2019-05-02 21:02:49 · 596 阅读 · 0 评论 -
C++:二叉搜索树的特点以及简易实现
二叉搜索树二叉搜索树也叫二叉排序树,它可以是一棵空树。它具有一下特点:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树没有键值(key)相等的节点简单的说就是左边的值都比该节点的值小,右边的值都比该节点的值大。像这样:二叉搜索树的查找因为二叉搜索树的特点就是左边的值都比该节点的...原创 2019-05-04 14:36:41 · 802 阅读 · 0 评论 -
C++:菱形继承及菱形虚拟继承
复杂的菱形继承及菱形虚拟继承基于博主的上篇文章大家肯定都知道了继承的相关概念。那么我们再来了解一下复杂的菱形继承及菱形虚拟继承。单继承:一个子类只有一个直接父类时称这个继承关系为单继承多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承菱形继承:菱形继承是多继承的一种特殊情况菱形继承会导致数据的冗余和二义性的问题,具体看下方解释:class Person{public...原创 2019-05-08 12:35:21 · 304 阅读 · 0 评论 -
C++:继承的相关概念
继承一、继承的概念和定义继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。共有三种继承方式,如下:继承方式的不同决定了子类能否访问父类的成员变量或成员...原创 2019-05-06 13:48:01 · 256 阅读 · 0 评论 -
C++:函数重载、重定义与重写
函数重载在同一个作用域中,两个函数的函数名相同,参数个数,参数类型,参数顺序至少有一个不同,函数返回值的类型可以相同,也可以不相同。C++中支持函数重载是因为C++中会对函数进行名字修饰。Name Mangling是一种在编译过程中,将函数、变量的名称重新改编的机制,简单来说就是编译器为了区分各个函数,将函数通过某种算法,重新修饰为一个全局唯一的名称。C语言只是简单的在函数名前添加下划线。因...原创 2019-05-13 13:27:04 · 733 阅读 · 0 评论 -
C++:多态
多态一、多态的概念多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。举个栗子吧: 比如买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;军人买票时是优先买票。...原创 2019-05-11 14:10:48 · 352 阅读 · 0 评论 -
C++:模拟实现list容器(支持迭代器)
模拟实现list容器(支持迭代器)要模拟实现一个list容器,主要就是相关头插头删尾插尾删的接口,这些非常常用。另外有一个点灰常重要!!那就是list的迭代器,list的迭代器不能用原生指针去模拟实现,因为链表的迭代器加一是下一个节点的指针,两个节点的位置并不连续。迭代器的模拟实现因为list的迭代器会指向下一个节点,所以我们创建一个迭代器类,这个类成员函数就是一个一个节点的指针_node...原创 2019-05-15 09:42:35 · 878 阅读 · 0 评论 -
C++(面试题):判断一个链表是否带环,求环的长度,找到环入口节点
博主面试的过程中遇到了这么一个面试题,判断一个链表是否带环,并且如果有环的话,要找到环的入口节点,并且求出环的长度~那么我们大家一起来分析一哈(っ•̀ω•́)っ✎⁾⁾假设链表的节点的结构是这样的struct ListNode{ int val; ListNode* next;};判断一个链表是否带环方法一:快慢指针定义一个快指针和慢指针都指向链表的head,快指针一次走两步,...原创 2019-05-29 18:34:13 · 2387 阅读 · 3 评论 -
C++(面试题):给40亿个不重复的无符号整数,没排过序,如何快速判断一个数是否在这40亿个数中
给40亿个不重复的无符号整数,没排过序,给你一个无符号整数,如何快速判断这个数是否在这40亿个数中?首先看到这个题第一个想到的就是遍历一遍,看这个数在不在。但是这样的时间复杂度太高了O(N),数据量太大,因此该方法不行。其次我们想到排序,利用二分查找,时间复杂度是O(logN),但是排序本身就有很大的消耗,并且40亿个数据内存一次也存不下。那么就采用位图!位图就是用来判断一个数据在不在的最好...原创 2019-06-08 15:22:22 · 2345 阅读 · 1 评论 -
C++:STL----string相关使用接口
string相关接口头文件#include &amp;amp;amp;lt;string&amp;amp;amp;gt;原创 2019-03-12 09:09:50 · 362 阅读 · 0 评论 -
C++:string的三种遍历方式(operator[ ],迭代器,新式for循环)
string的三种遍历方式一、operator[ ]遍历string重载了operator[ ],所以string支持下标访问。void Print1(string s){ for (size_t i = 0; i &lt; s.size(); i++) { cout &lt;&lt; s[i] &lt;&lt; " ";//支持下标访问 //等价于cout原创 2019-03-10 10:13:37 · 17997 阅读 · 0 评论 -
C++:引用详解
引用C语言中:函数传参有传值和传址两种方式用swap函数举例:1.传值方式(创建了临时变量存放实参的值)缺点:不能通过函数形参改变外部实参优点:不能改变外部的实参void swap(int left,int right)//此代码不能完成两数的交换{ int tmp = left; left = right; right = tmp;} 2.传址方式(创...原创 2019-01-09 20:37:02 · 341 阅读 · 0 评论 -
C++:内联函数,auto关键字,基于范围的for循环,指针空值nullptr
内联函数在C语言中比较短小并可能多次使用的函数则会把它定义为宏函数。例如,我们定义一个加法的宏函数:#define Add(a,b) ((a)+(b))宏函数的优点:没有压栈开销(因为在预编译的过程中编译器会完成宏函数的替换)可以增强复用性(比如宏常量,改动的时候只需要改动一处即可)宏函数的缺点:复杂,导致代码可读性差,可维护性差,容易误用不能进行调试没有类型安全的检查...原创 2019-02-22 13:03:35 · 709 阅读 · 0 评论 -
C++:指针和引用的区别
指针和引用的区别原创 2019-02-23 14:21:37 · 185 阅读 · 0 评论 -
C++:类和对象(上篇---概念、定义、访问限定符、封装、类的大小、this指针)
类和对象(上篇—概念及定义)C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。一、类和对象概念1.类: 类是现实世界在计算机中的反映,它将数据(成员变量)和对这些数据的操作(成员函数)...原创 2019-02-24 19:33:29 · 318 阅读 · 0 评论 -
C++:类和对象(中篇---类的6个默认成员函:构造、析构、拷贝构造、赋值、取地址、const取地址)
类和对象(中篇—类的6个默认成员函数)如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数。构造函数(初始化)构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有一个合适的初始值,并且在对象的生命周期内只调用一次。构造函数是特殊的成员函数,需要注意的是,构造函数的...原创 2019-02-27 18:06:21 · 416 阅读 · 0 评论 -
C++:类和对象(下篇----初始化列表,explicit关键字,static成员,C++11 类成员的初始化,友元,内部类)
类和对象(下篇)一、初始化列表类和对象中篇我们了解了构造函数,构造函数可以定义为全缺省的构造函数,构造函数调用之后,对象中已经有了一个初始值,但是不能将其称作为类对象成员的初始化,构造函数体中的语句只能将其称作为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值。初始化列表的特点以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个&quot;成员变量&quot;后面跟一个放在...原创 2019-03-02 08:45:33 · 444 阅读 · 0 评论 -
C++:实现一个Date类
关于日期类,我们最基本的成员变量就是三个:年、月、日。关于成员函数我们要实现构造,拷贝构造,赋值,关于日期的比较大小,以及日期加天数,日期减天数,以及+=和- =,同时还要考虑能否复用,日期减日期,还有日期类的++和- -(分为前置和后置)等。具体代码如下:详情请看代码注释Date.h#pragma once#include &amp;amp;lt;iostream&amp;amp;gt;class Date{pu...原创 2019-03-05 08:55:51 · 1058 阅读 · 0 评论 -
C++:单例模式(饿汉模式和懒汉模式)
单例模式(饿汉模式和懒汉模式)设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。单例模式概念一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问...原创 2019-03-09 16:00:56 · 2932 阅读 · 0 评论 -
C++:内存管理(new和delete的使用以及底层原理、定位new表达式、malloc/free和new/delete的区别,内存泄漏)
内存管理(上篇)C语言中动态内存管理方式:malloc/calloc/realloc和freevoid* malloc(unsigned size); void* realloc(void* ptr, unsigned newsize); void* calloc(size_t numElements, size_t sizeOfElement); 都在...原创 2019-03-03 14:50:52 · 656 阅读 · 0 评论 -
C++:模板(上篇----泛型编程、函数模板、类模板)
模板记得我们之前写过的交换函数,如果我们要交换两个整形,需要写一个参数为整形的Swap函数,如果要交换两个字符型,那又要写一个参数为char的Swap函数,等等。那这样就很麻烦,那有没有一种通用的东西可以不考虑类型呢?那就是模板。一、泛型编程泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。首先看下面的代码:void Swap(int&amp;amp; left, ...原创 2019-03-08 11:33:06 · 241 阅读 · 0 评论 -
C++:设计一个类,只在堆上 / 栈上创建对象
设计一个类,只在堆上创建对象class HeapOnly{public: static HeapOnly* GetHeapObj() { return new HeapOnly; }private: //构造函数私有 HeapOnly() {} //C++98:拷贝构造函数只声明不实现,并且声明成私有的 HeapOnly(const HeapOnly&amp;); /...原创 2019-03-06 12:37:49 · 350 阅读 · 0 评论 -
C++:命名空间(namespace)及其使用
命名空间在C/C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染。...原创 2019-01-08 17:17:02 · 16521 阅读 · 3 评论