C++语言
C++
大虎牙
一物不知 深以为耻 便求知若渴
展开
-
学习笔记 | i++和++i的区别
i++和++i的区别原创 2020-09-11 19:44:12 · 196 阅读 · 0 评论 -
学习笔记 | 多态案例3-电脑组装
多态案例3-电脑组装案例描述:电脑主要组成部件为 CPU(用于计算),显卡(用于显示),内存条(用于存储)将每个零件封装出抽象基类,并且提供不同的厂商生产不同的零件,例如Intel厂商和Lenovo厂商创建电脑类提供让电脑工作的函数,并且调用每个零件工作的接口。测试时组装三台不同的电脑进行工作。示例:#include <iostream>using namespace std;//抽象CPU类class CPU{public: CPU(){}; //抽象的计原创 2020-08-31 00:14:57 · 629 阅读 · 0 评论 -
学习笔记 | 多态案例2-制作饮品
多态案例二-制作饮品案例描述:制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶。#include <iostream>using namespace std;//抽象制作饮品class AbstractDrinking {public: AbstractDrinking(){}; //烧水 virtual void Boil() = 0; //冲泡 virtual void Brew原创 2020-08-30 23:11:18 · 768 阅读 · 0 评论 -
学习笔记 | 多态案例——计算器类
案例描述:分别利用普通写法和多态技术,设计实现两个操作数进行运算的计算器类。多态的优点:代码组织结构清晰。可读性强。利于前期和后期的扩展以及维护。开闭原则:对于修改进行关闭、对扩展进行开放。//多态实现//抽象计算器类//多态优点:代码组织结构清晰,可读性强,利于前期和后期的扩展以及维护class AbstractCalculator{public : virtual int getResult() { return 0; } int m_Num1; int原创 2020-08-30 19:49:27 · 259 阅读 · 0 评论 -
学习笔记 | epoll的实现
epoll是怎么实现的?Linux epoll机制是通过红黑树和双向链表实现的。首先通过epoll_create()系统调用在内核中创建一个eventpoll类型的句柄,其中包括红黑树根节点和双向链表头节点。然后通过epoll_ctl()系统调用,向epoll对象的红黑树结构中添加、删除、修改感兴趣的事件,返回0标识成功,返回-1表示失败。最后通过epoll_wait()系统调用判断双向链表是否为空,如果为空则阻塞。当文件描述符状态改变,fd上的回调函数被调用,该函数将fd加入到双向链表中,此时原创 2020-08-27 17:52:52 · 149 阅读 · 0 评论 -
学习笔记 | const修饰指针
const修饰指针有三种情况const修饰指针 — 常量指针 int a = 10; int b = 10; const int *p = &a; // 常量指针 // 特点:指针的指向可以修改,但是指针指向的值不可以改。 // 错误。指针指向的值不可以改 *p = 20; p = &b; // 正确。指针指向可以改 out << p << endl;const修饰常量原创 2020-08-24 15:17:43 · 158 阅读 · 0 评论 -
学习笔记 | 函数类型、实参、行参
函数定义里小括号内称为形参,函数调用时传入的参数称为实参。当调用函数的时候,实参的值会传递给形参。常见的函数样式有4种无参有返有参无返无参有返有参有返函数的声明作用:告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。函数的声明可以多次,但是函数的定义只能有一次。函数的分文件编写作用:让代码结构更加清晰。函数分文件编写一般有4个步骤:创建后缀名为.h的头文件。创建后缀名为.cpp的源文件。在头文件中写函数的声明。在源文件中写函数的定义。...原创 2020-08-20 17:53:07 · 424 阅读 · 0 评论 -
学习笔记 | 隐式类型转换、显示类型转换
隐式类型转换、显示类型转换当数据从"小类型"转换成"大类型"时,被称为隐式类型转换。当数据从"大类型"转换为"小类型"时,被称为显示类型转换。显示类型转换被称为强制类型转换,需要在前面加"()"转换操作符,并在括号类添加要转换的类型。...原创 2020-07-26 16:30:54 · 366 阅读 · 0 评论 -
学习笔记 | 大端、小端模式
大端、小端模式大端模式:是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址端。小端模式:是指数据的高字节保存在内存的高地址中,低位字节保存在内存的低地址端。...原创 2020-07-26 11:25:50 · 186 阅读 · 0 评论 -
学习笔记 | mutable、volatile
mutable如果需要在const成员方法中修改一个成员变量的值,那么需要将这个成员变量修饰为mutable。即用mutable修饰的成员变量不受const成员方法的限制。可以认为mutable的变量是类的辅助状态,但是只是起到类的一些方面表述的功能,修改他的内容我们可以认为对象的状态本身并没有改变的。实际上由于const_cast的存在,这个概念很多时候用处不是很多了。...原创 2020-07-25 21:13:09 · 275 阅读 · 0 评论 -
学习笔记 | extern “C“
extern “C”extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般之包括函数名。这个功能十分有用处,因为在C++出现以前,很多代码都是C语言写的,而且很底层的库也是C语言写的,为了更好的支持原来的C原创 2020-07-23 11:50:38 · 105 阅读 · 0 评论 -
学习笔记 | c++中的smart pointer四个智能指针 shared_ptr、unique_ptr、weak_ptr、auto_ptr
c++中的smart pointer四个智能指针: shared_ptr,unique_ptr,weak_ptr,auto_ptrC++里面的四个智能指针: auto_ptr, shared_ptr, weak_ptr, unique_ptr其中后三个是c++11支持,并且第一个已经被11弃用。为什么要使用智能指针:智能指针的作用是管理一个指针,因为存在以下这种情况:申请的空间在函数结束时忘记释放,造成内存泄漏。使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用原创 2020-07-21 17:42:23 · 543 阅读 · 0 评论 -
学习笔记 | c++中四种类型cast(强制)转换
c++中四种cast转换C++中四种类型转换是:static_cast, dynamic_cast, const_cast, reinterpret_cast1、const_cast用于将const变量转为非const。2、static_cast用于各种隐式转换,比如非const转const,void * 转指针等, static_cast能用于多态向上转化,如果向下转能成功但是不安全,结果未知;3、dynamic_cast用于动态类型转换。只能用于含有虚函数的类,用于类层次间的向原创 2020-07-21 17:27:18 · 1262 阅读 · 0 评论 -
学习笔记 | C++预处理器
C++预处理器预处理器是一些指令,指示编译器在实际编译之前所需完成的预处理。所有的预处理器指令都是以井号#开头,只有空格字符可以出现在预处理指令之前。预处理指令不是 C++ 语句,所以它们不会以分号;结尾。之前所有的实例中都有#include指令。这个宏用于把头文件包含到源文件中。C++ 还支持很多预处理指令,比如#include、#define、#if、#else、#line等,让我们一起看看这些重要指令。#define 预处理#define预处理指令用于创建符号常量。该符号常量通常称原创 2020-07-18 12:11:00 · 233 阅读 · 0 评论 -
学习笔记 | C++命名空间
C++命名空间引入了命名空间这个概念,专门用于解决上面的问题,它可作为附加信息来区分不同库中相同名称的函数、类、变量等。使用了命名空间即定义了上下文。本质上,命名空间就是定义了一个范围。命名空间有时也被称为名字空间、名称空间。std 是 standard 的缩写,意思是“标准命名空间”。代码中的 string、cin、cout 都位于命名空间 std。定义命名空间命名空间的定义使用关键字 namespace,后跟命名空间的名称,如下所示:namespace namespace_name原创 2020-07-18 11:45:11 · 260 阅读 · 0 评论 -
学习笔记 | extern的作用
extern的作用extern可以置于变量或者函数前, extern标识的变量或函数声明定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。extern是C、C++语言中表明函数和全局变量作用范围的关键字。对于extern变量来说,仅仅是一个变量的声明,其并不是定义,因为不会分配内存空间。一个变量可以声明多次,但如果该变量定义多次,会有链接错误。extern表示将变量或函数声明为外部链接,【变量默认是内部链接,函数默认是外部链接】。因此用来外部链接的函数,声明时有无extern都原创 2020-07-14 23:01:05 · 3791 阅读 · 2 评论 -
学习笔记 | C++共用体类型union
C++共用体类型union共用体是一种构造数据类型,它是将不同类型的变量存放在同一内存区域内。共同体也称为联。各成员的内存地址是相同的。结构体变量的各成员占用连续的不同存储空间,而共用体变量的各成员占用同一个存储区域。若需对共同体变量初始化,只能对它的第一个成员赋初始值。共同体是会按照成员中最大的一个数据长度分配空间。union data{ int i; double d; char str[20];};解释:在上面的共同体中,定义了3个成员,i占用4个字节,d原创 2020-07-13 18:44:16 · 1037 阅读 · 0 评论 -
学习笔记 | C++的编译和执行
C++编译过程主要分为,预处理、编译、汇编、链接四个过程。如下图所示:第一步:预处理将源代码的 .c 、.cpp 、.h 等文件包含到一个文件中。在这个过程中会使用一些预处理指令要求编译器使用什么样的方式包含这些文件。预处理结束之后对于c语言编译器会生成一个 .i 文件。C++ 会生成 .ii 文件。[新手略过]预编译过程主要处理那些源代码中以#开始的预编译指令,主要处理规则如下:将所有的#define删除,并且展开所有的宏定义;处理所有条件编译指令,如#if,#ifdef等;.原创 2020-07-12 21:02:30 · 293 阅读 · 0 评论 -
学习笔记 | 抽象与封装
原创 2020-07-08 21:37:52 · 135 阅读 · 0 评论 -
学习笔记 | C++构造函数分几类
类的构造函数类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。构造函数的名称与类的名称是完全相同的,并且不会返回任何类型void,也不会返回 void。构造函数可用于为某些成员变量设置初始值。01 默认构造函数如果用户自己没有定义构造函数,那么编译器会自动生成一个默认的构造函数,只是这个构造函数的函数体是空的,也没有形参,也不执行任何操作。比如上面的 Student 类,默认生成的构造函数如下:Student(){}一个类必须有构造函数,要么用户自己定义,要么编译原创 2020-07-08 20:40:54 · 2462 阅读 · 1 评论 -
学习笔记 | 优先队列Priority Queue
优先队列(Priority Queue)特点能保证每次取出的元素都是队列中优先级别最高的。优先级别可以是自定义的,例如,数据的数值越大,优先级越高;或者数据的数值越小,优先级越高。优先级别甚至可以通过各种复杂的计算得到。应用场景从一堆杂乱无章的数据当中按照一定的顺序(或者优先级)逐步地筛选出部分乃至全部的数据。举例:任意一个数组,找出前 k 大的数。解法 1:先对这个数组进行排序,然后依次输出前 k 大的数,复杂度将会是 O(nlogn),其中,n 是数组的元素个数。这是一种直接的办法原创 2020-07-01 17:56:40 · 430 阅读 · 0 评论 -
学习笔记 | 静态链接库、动态链接库
01 DLL文件是什么?它有几种调用方式?DLL文件(Dynamic Linkable Library即动态链接库文件),是一种不能单独运行的文件,它允许程序共享执行特殊任务所必需的代码和其他资源。比较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。可能存在一些模块的功能较为通用,在构造其他软件系统时仍会被使用。在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序EXE文件中,会产生一些问题:一个是增加了应用程序的大小,会占用更多的磁盘原创 2020-06-25 21:46:27 · 280 阅读 · 0 评论 -
学习笔记 | C++结构体 字节对齐
目录什么是字节对齐?对齐准则又是什么?为什么要字节对齐呢?字节对齐对我们编程有什么启示?01 什么是字节对齐?02 对齐准则又是什么?03 为什么要字节对齐呢?04 字节对齐对我们编程有什么启示?...原创 2020-04-27 15:48:45 · 499 阅读 · 0 评论 -
学习笔记 | N叉树的深度
方法一 递归算法int maxDepth(Node* root) { if (!root) return 0; int m = 0; for (Node* it : root->children) m = max(m, maxDepth(it)); return ++m;}方法二 DFS迭代int maxDepth(Node* ro...原创 2020-04-15 15:24:26 · 286 阅读 · 0 评论 -
学习笔记 | 01背包问题
原创 2020-04-14 20:04:26 · 185 阅读 · 0 评论 -
学习笔记 | C++ | 多态与重载、虚函数、纯虚函数
12. 多态与重载掌握如何实现多态性掌握虚函数的定义以及用法熟悉虚析构函数熟悉抽象基类熟悉并掌握运算符重载12.1 多态概述多态性就相当于具有不同功能的函数可以共用同一个函数名,这样就可以用一个函数名调用具有不同功能的函数。 12.1.1 认识多态行为所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。12.2 虚函数12.3 虚析构函数12....原创 2020-03-30 18:19:38 · 350 阅读 · 0 评论 -
学习笔记 | C++ | 继承与派生
继承允许用户依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更加容易。11.1 继承与派生11.1 继承概述继承可以理解为一个类从另一个类获取成员变量和成员函数的过程。例如类B继承于类A,那么B就拥有A的成员变量和成员函数。被继承的类称为父类或基类。继承的类称为子类或派生类。11.1.1 什么是继承继承就是指某类事物具有比其父辈事物更一般性的某些特征。当用户创...原创 2020-03-30 18:07:16 · 188 阅读 · 0 评论 -
学习笔记 | C++内联函数 inline函数和宏定义的区别
1. 内联函数内联函数提供了另一种选择。==编译器将使用相应的函数代码替换函数调用。==因此,内联函数的运行速度比常规函数稍快,但代价是需要占用更多内存。2. 内联函数的使用在函数声明前加上关键字inline;在函数定义前加上关键字inline。#include<iostream>inline double square(double x){return x*x;}i...原创 2020-03-25 20:02:35 · 263 阅读 · 1 评论 -
C++ | 获取字符数组首字符的地址
C++ | 获取字符数组首字符的地址#include <iostream>using namespace std;int main(){ int arr[5] = {1,2,3,4,5}; cout << arr << " " << &arr[0] << endl; char s[5] = ...原创 2020-03-21 13:58:39 · 3091 阅读 · 0 评论 -
C++ | 动态分配内存 new和malloc的区别
01 静态分配内存通常声明变量都采用“静态分配”的方式,也就是所有变量声明必须在编译阶段完成。02 动态分配内存动态分配内存是指程序在运行时才提出分配内存的要求,主要目的是让内存运用更有弹性。动态分配内存后必须在程序结束前完成释放内存的操作。如果程序运行期间分配的内存未释放,就会造成内存空间的浪费,形成所谓的内存泄漏。动态分配变量在C++中,可以分别使用new和delete...原创 2020-03-20 22:19:48 · 2104 阅读 · 0 评论 -
面试笔记 | 数组与指针的区别
1. 简述数组与指针的区别数据是直接访问数据的。指针是间接访问数据的。定义:数组是类型相同、数目固定的若干个变量的有限集合,它存放的是数据。指针是变量的地址,存放的是变量的地址。存储方式:数组通常存储在静态存储区或栈上。指针可以随时随地地指向任意类型的内存块。内存容量:用运算符sizeof可以计算出数组的容量(字节数)。sizeof(p),p为指针得到的是一个指...原创 2020-03-11 14:57:17 · 5868 阅读 · 1 评论 -
面试笔记 | const与#define相比的优点
1. 请说出const与#define相比有何优点?区别#define MAX 255const float MAX = 255; (1)就起作用的阶段而言:#define是在编译的预处理阶段起作用。const是在编译、运行的时候起作用。(2)就起作用的方式而言:#define只是简单的字符串替换,没有类型检查。const有对应的数据类型,是要进行判断的,可以避免一些低...原创 2020-03-11 14:34:34 · 220 阅读 · 0 评论 -
面试笔记 | 排序算法
排序算法原创 2020-03-10 11:09:51 · 220 阅读 · 0 评论 -
面经 | 面试经验
01 qj的面试经验简历上的东西一定要认真了解清楚。每个字。一定要了解这是什么what,以及你为什么why要用这个(对比其他类似的来说),以及有什么优缺点,以及有没有更好的办法。项目最大的挑战是什么?怎么解决?再来一次,怎么优化?实习经历做了啥技术方案评测结果02 lb的面试经验一面介绍项目面试问题面向对象的多态性整数的上下限-1的32位二进制(C中...原创 2020-03-09 21:05:08 · 303 阅读 · 0 评论 -
C++ | 指针和引用的区别
01. C++——指针和引用的区别指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元,而引用只是一个别名。int a=1;int *p=&a;int a=1;int &b=a;使用sizeof看一个指针的大小是4,而引用则是被引用对象的大小。指针可以被初始化为NULL,而引用必须被初始化且必须是一个已有对象的引用。作为参数传递时,指针需要被...原创 2020-03-09 18:03:09 · 339 阅读 · 3 评论 -
学习笔记 | C++和Python的一些区别
01 PythonPython是一种脚本语言,是解释执行的,不需要经过编译,所以很方便快捷,且能够很好地跨平台,写一些小工具小程序特别合适。编程:无一些{}进行作用域的限制,而是使用代码缩进。02 C++C++则是一种需要编译后运行语言,在特定的机器上编译后在特定的机上运行,运行效率高,安全稳定。但编译后的程序一般是不跨平台的。编程:使用{}进行作用域的限制。...原创 2020-03-09 16:36:10 · 577 阅读 · 0 评论 -
学习笔记 | C++和C区别
01 说一下C++和C的区别设计思想上:C++是面向对象的语言,而C是面向过程的结构化编程语言。语法上:C++具有封装、继承和多态三种特性C++相比C,增加了许多类型安全的功能,比如强制类型转换。C++支持范式编程,比如模版类,函数模版等。...原创 2020-03-09 16:35:06 · 219 阅读 · 0 评论 -
面试笔记 | static关键字
说一下static关键字的作用1. 全局静态变量在全局变量前加上关键字static,全局变量就定义成一个全局静态变量。静态存储区,在整个程序运行期间一直存在。初始化:未经初始化的全局静态变量会被自动初始化为0。作用域:全局静态变量在声明他的文件之外是不可见的,准确地说是从定义之处开始,到文件结尾。2. 局部静态变量在局部变量之前加上关键字static,局部变量就成为了一个局部静态...原创 2020-03-09 16:13:26 · 141 阅读 · 0 评论 -
学习笔记 | C++的内存分布
对于一个完整的程序,在内存中的分布情况:1. 栈区:由编译器自动分配释放,像局部变量,函数参数,都是在栈区。会随着作用于退出而释放空间。2. 堆区:程序员分配并释放的区域,像malloc(c), new(c++)3. 全局数据区(静态区):全局变量和静态变量的存储是放在一块的。初始化的全局变量和静态变量在一块区域。未初始化的全局变量和未初始化的静态变量在相邻的另一块区域...原创 2020-03-09 16:07:30 · 169 阅读 · 0 评论 -
学习笔记 | 图的搜索与最短路问题
Dijkstra算法(有权图)不能在含负数权重的图中求解出最短路。Dijkstra算法会从离起点近的顶点开始,按顺序求出起点到各个顶点的最短路径。也就是说,一些离终点较远的顶点的最短路径也会被计算出来。A*就会预先估算一个值(该点到终点的距离),利用这个值来省去一些无用的计算。...原创 2020-02-22 22:49:30 · 164 阅读 · 0 评论