![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++知识
文章平均质量分 76
复习cpp的知识点
编程的机械狗
这个作者很懒,什么都没留下…
展开
-
c++————虚函数&虚函数表
C++虚函数原理C++中的虚函数的作用主要是实现了多态的机制。关于多态,就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。也就是试图使用不变的代码来实现可变的算法。虚函数的实现包括两部分,虚函数指针和虚函数表。虚函数指针虚函数指针 (virtual function pointer) 从本质上来说是一个指向函数的指针,与普通的指针并无区别。它指向用户所定义的虚函数,具体是在子类里的实现,当子类调用虚函数的时候,实原创 2022-01-22 20:14:41 · 872 阅读 · 0 评论 -
c++----右值引用
最近看了侯捷老师的书籍,看到了右值引用,梳理一下右值引用的用法,以及特点:右值、左值既然是右值引用,我们首先要理解的是什么是右值什么是左值:1、位于赋值号(=)左侧的表达式就是左值;反之,只能位于赋值号右侧的表达式就是右值;2、有名称的、可以获取到存储地址的表达式即为左值;反之则是右值。左值在内存中有特定地址的量,在程序中存在的时间比较长;右值实在寄存器中的量,在程序中存在的时间比较短暂;简单的说我们区分一个左值和右值的办法就是看能不能对表达式取地址,如果能,则为左值,否则为右值。int a =原创 2021-07-09 15:32:01 · 409 阅读 · 0 评论 -
c++之 new expression
new 一个对象发生了什么?new对象发生的事情Complex *pc = new Complex(2,4);当编译器看到上边代码时会做出以下动作:Complex *pc;try{ void *mem = operator new(sizeof(Complex));//先分配内存空间 pc = static_cast<Complex*>(mem);//指针转型 pc->Complex::Complex(2,4)//在调用构造函数}//delete pc编译器转为原创 2021-07-05 11:48:28 · 338 阅读 · 0 评论 -
c++智能指针unique_ptr和weak_ptr
unique_ptrunique_ptr简介一个unique_ptr “拥有”它所指向的对象。与shared_ptr不同,某个时刻只能有一个unique_ptr指向一个给定的对象。即两个 unique_ptr 不能指向一个对象,unique_ptr 之所以叫这个名字,是因为它只能指向一个对象,即当它指向其他对象时,之前所指向的对象会被摧毁。其次,当 unique_ptr 超出作用域时,指向的对象也会被自动摧毁。与shared_ptr不同,没有类似make_shared的标准库函数返回一个unique_p原创 2021-07-03 12:04:03 · 257 阅读 · 1 评论 -
c++ 智能指针shared_ptr详解
参考资料:: C++primer为什么需要智能指针在c++中,动态内存的管理的管理是通过一对运算符来完成的:new在内存中为对象分配空间并返回一个指向该对象的指针,delete接受一个动态对象的指针,销毁该对象,并且释放与之关联的内存。来看一个例子:int *process(int *a){ int *b =new int(200);}在函数 process中我们申请了一块内存,但是在函数体内b 是一个临时变量,离开函数会销毁,但是我们动态申请的内存不会消失,这样就会造成内存泄漏;有时在尚原创 2021-07-02 21:55:53 · 1001 阅读 · 3 评论 -
c++分配器简易版内存池的实现
前几天看完了侯捷老师的内存管理这门课,想动手实现一个简易版的内存池这里记录一下:为什么需要内存池首先我们需要了解malloc申请一块内存时,内存的布局情况如下图:我们会发现实际的内存比我们申请的内存要多出许多东西,首先时上下两个cooki,cooki记录的是申请内存的大小和内存的状态,具体可以看一下侯老师的视频。如果我们一直用malloc申请内存,会浪费许多不必要的内存,那么怎样才能解决这种办法呢,那就是内存池.什么是内存池内存池则是在真正使用内存之前,先申请分配一定数量的、大小相等(一般情况下原创 2021-06-30 11:25:31 · 404 阅读 · 1 评论 -
C++新特性--variadic Template
variadic Template(数量不定的模板参数)模板的参数在照往常来说是固定的大小之后让编译器进行推导,但是现在c++11出现了新的东西就是模板函数的参数可以使不确定的。1、语法:声明一个带有可变参数个数的模板的语法如下所示:template<typename ...Args> class tuple;tuple<int, string> a; //使用在模板参数 Args左边出现省略号 … ,就是表示Args是一个模板参数包(template type par原创 2021-06-24 09:48:54 · 416 阅读 · 2 评论 -
指针 和 const 结合
const 和 指针将const用于指针有一些很特比的地方。可以用两种不同的方式将const用于指针。第一种方式是让指针指向一个常量对象,这样可以防止使用指针来修改所指向的值,第二种方式是将指针本身声明为常量,这样可以防止指针改变指向的位置。声明一个指向常量的指针int age = 32;const int *ptr = &age;这里指出。ptr指向一个const int (这里的值是32),因此不能使用ptr来修改值。也就是说*ptr的值为const,不能被修改:*ptr = 20原创 2020-10-30 11:07:01 · 273 阅读 · 0 评论 -
C++ 之 递增运算符(++)和递减运算符(--)
前缀格式(++i)和后缀格式(i++)++i的意思是先将i的值加一,在使用新的值计算表达式。i++的意思是使用当前的值计算表达式。然后再把i的加一。例如:int x = 5;int y = ++x;//运行之后x = 6;y=6;int z = 5;int y = z++;//运行之后z=6;y=5;副作用和顺序点副作用是指在计算表达式时对某些东西进行了修改;顺序点是程序执行过程中的一个点,在这里进入下一步之前将确保所有的副作用都进行了评估。(分号就是一个顺序点:意味着在处理下一原创 2020-10-27 11:25:23 · 718 阅读 · 0 评论 -
字符数组与字符指针的理解
1、字符数组先来回想一下如何创建和存储一个字符串?首先我们想到的是数组,对就是用数组存储一个字符串。先看一下程序#include<stdio.h>#include<string.h>// 提供strlen()函数的原型#define DENSITY 62.4 // 人体密度(单位:磅/立方英尺)int main(){ float weight, vol...原创 2020-04-05 22:03:07 · 365 阅读 · 0 评论 -
C++ 学习之共用体和枚举
共用体共用体union是一种数据类型,能够存储不同的数据类型,但只能同时存储其中的一种病数据类型。共用体的句法union one4all{ int int_val; long long_val; double double_val;};//可以使用one4all变量存储int、long、或者doubleone4all pail;pail.int_val = 15;//存储intcout << pail.int_val;pail.long_val = 38;//int 丢失原创 2020-10-26 09:26:05 · 157 阅读 · 1 评论 -
函数重载、引用
函数重载作用:函数名可以相同,提高复用性函数重载满足条件:1、同一个作用域2、函数名称相同3、函数参数类型不同或者个数不同或者顺序不同4、函数的返回值不可以作为函数重载的条件例子:void print(const char*str,int width);#1void print(double d,int width);#2void print(long l,int width);#3void print(int i,int width);#4void print(const char原创 2020-11-05 14:33:07 · 384 阅读 · 0 评论 -
C++用栈实现队列
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列的支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空,返回 true ;否则,返回 false说明:你只能使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和原创 2020-11-05 20:40:23 · 454 阅读 · 0 评论 -
抽象基类cpp
OOP面向对象程序设计(object-oriented programming)的核心思想就是数据抽象,继承和动态绑定。多态性分两类:静态多态性:函数重载和运算符重载实现的多态性属于静态,又称为编译时的多态性动态多态性:在程序运行过程中才动态确认操作所针对的对象,又称为运行时多态性,通过虚函数实现。虚函数:对于某些函数,基类希望它的派生类各自定义适合自身的版本,此时基类就将这些函数声明成虚函数。虚函数允许通过基类指针或引用来访问基本和派生类中的同名函数,通过指针调用同名函数,而不是通过对象名。虚原创 2021-06-16 22:21:22 · 317 阅读 · 0 评论 -
c++中的特殊成员函数
复制构造函数复制构造函数用于将一个对象复制到新创建的对象中。也就是说,它用于初始化过程中(包括按值传递参数),而不是常规的赋值的过程。类的复制构造函数原型通常如下:原创 2020-11-09 10:50:40 · 742 阅读 · 0 评论 -
c++虚拟继承
虚拟继承虚拟继承引入的原因:在多继承方式下,派生类继承多个基类,当两个不同的基类拥有同名成员时,产生名字冲突。看一个例子:#include<iostream>using namespace std;class A{ public: void f(){ cout<<"A中的f调用" << endl; }}; class B:public A{};class C :public A{ }; class D: public B, p原创 2021-06-22 10:51:51 · 872 阅读 · 0 评论 -
函数返回值是类对象的问题
首先明确一个问题什么时候调用复制构造函数:1、用一个对象初始化另一个对象时;2、函数的形参是一个对象时而非引用;3、函数返回值时类对象的时候。#include <iostream>using namespace std;class Test{public: Test(){ cout <<"默认构造函数调用" << endl; } Test(const Test &t) { cout <<"复制构造函数调用" &原创 2021-06-20 20:50:25 · 2283 阅读 · 1 评论 -
数组和指针的几点理解
数组的理解数组定义一组具有同名的同属性的数据就组成了一个数组(array)由此可以知道:1、数组是一组有序数据集合。数组中个数据的排列具有一定的规律,下标代表数据在数组中的序号。int a[10];方括号[ ]表明a是数组,方括号中的数字表明数组中的元素个数。2、数组中每一个元素都属于同一个数据类型,数组a中的元素都是int类型。3、要访问数组中的元素,通过使用数组下标数(也称为...原创 2020-03-28 17:59:39 · 291 阅读 · 0 评论