![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 61
YanWenCheng_
日常总结
展开
-
C++虚函数表深度剖析
C++基础原创 2022-07-18 23:20:13 · 519 阅读 · 0 评论 -
C++ emplace_back
概述在C++11中,在引入右值的升级后,调用push_back变的更为高效,原本需要调用构造函数构造这个临时对象,然后调用拷贝构造函数将这个临时对象放入容器中。在C++11升级后,只需要调用构造函数,然后调用移动拷贝函数。就好比,现在手里有个面包,要把这个放到面包袋子里,原来的逻辑是,生产一个面包,然后在面包袋子里根据生产的面包再复制一个一摸一样的,在引入右值引用升级之后,现在的push_back的逻辑是,生产一个面包,然后把这个面包挪到袋子里(也就是移动拷贝)而不是再照着这个面包复制一个新的。原创 2021-11-15 16:07:12 · 5131 阅读 · 0 评论 -
std::enable_shared_from_this使用场景
在很多场合,经常会遇到一种情况,如何安全的获取对象的this指针,一般来说我们不建议直接返回this指针,可以想象下有这么一种情况,返回的this指针保存在外部一个局部/全局变量,当对象已经被析构了,但是外部变量并不知道指针指向的对象已经被析构了,如果此时外部使用了这个指针就会发生程序奔溃。既要像指针操作对象一样,又能安全的析构对象,很自然就想到,智能指针就很合适!那么智能指针如何使用呢?现在我们来看一段代码。#include <iostream>#include <memor原创 2021-11-01 10:39:33 · 429 阅读 · 0 评论 -
智能指针详解
一、简介由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete。程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见。用智能指针便可以有效缓解这类问题,本文主要讲解参见的智能指针的用法。包括:std::auto_ptr、boost::scoped_ptr、boost::shared_ptr、boost::scoped_array、boost::shared_array、boost::wea原创 2021-09-09 22:13:28 · 1596 阅读 · 0 评论 -
C++17之for循环新能力
遍历map容器#include <map>#include <iostream>using namespace std;map<string, int> map;map["Apple"] = 10;/* key为string类型,value为int类型 */for (auto [key, value] : map) { cout << key << " " << value << endl;}.原创 2021-05-10 16:25:14 · 1391 阅读 · 0 评论 -
interpret_cast nconst_cast static_cast dynamic_cast四种强制转化的区别
文章目录1.interpret_cast2.const_cast3.static_cast4.dynamic_cast1.interpret_cast几乎什么类型都可以转换,对结果没有保证。-> 不推荐使用2.const_cast一般用于 去const 类型转换3.static_cast基础数据类型转换,隐式转换,void*转任意指针,多态向上转换,向下不保证4.dynamic_cast只用于虚函数,也就是继承之间的上下转换,向上转换安全向下转换失败:a.对于指针,返回转载 2021-03-12 20:06:14 · 315 阅读 · 0 评论 -
c++中json的使用
//客户端程序#include<iostream>#include<string.h>#include<string>#include<json/json.h>#include<errno.h>#include<arpa/inet.h>using namespace std;int main(){ int...原创 2020-03-06 16:06:46 · 594 阅读 · 1 评论 -
c++与Mysql的连接
MySQL的简单实用事例#include<iostream>#include<mysql/mysql.h>#include<errno.h>#include<string.h>using namespace std;//需要提前安装MySQL数据库和在数据库内建库,建表,了解MySQL的基本指令int main(){//初始化m...原创 2020-03-06 16:03:52 · 345 阅读 · 0 评论 -
C++案例---贪吃蛇
模块墙壁;蛇;食物墙壁模块#pragma once#include<iostream>#include<string>#include<vector>#include<list>using namespace std;class Wall{public: enum { ROW=40, COL=40 }; //初...原创 2020-01-29 16:12:23 · 469 阅读 · 0 评论 -
STL--演讲比赛
需求分析(1)产生选手 (ABCDEFGHIGKLMNOPQRSTUVWX) 编号 姓名,得分(2)第一轮 抽签 比赛 查看结果(3)第二轮 抽签 比赛 查看结果(4)第三轮 抽签 比赛 查看结果#include<iostream>#include<string>#include<vector>#includ...原创 2020-01-27 22:43:36 · 596 阅读 · 0 评论 -
deque容器的基本使用
deque容器 使用deque。即双端队列;特点为front和back都可以插入,也都可以删除;只需要看懂数据结构中的双端队列,使用就根据特点即可;代码#include<iostream>#include<deque>using namespace std;#include<algorithm>//iterator 普通迭代器 reversed_...原创 2020-01-23 18:05:14 · 284 阅读 · 0 评论 -
set 和map容器基本使用
1.set 容器(1)关联式容器(2)插入数据自动排序,按照key,没有value;(3)没有pushback插入,插入用insert;insert的返回值pair<iterator , bool>其中bool为插入是否成功,因为不允许重复插入;(4)没有pop,删除用erase,可以传值或迭代器;(5)find(key):查找key是否存在,存在返回迭代器,不存在返回s.e...原创 2020-01-23 17:59:30 · 338 阅读 · 0 评论 -
函数对象(仿函数)
函数对象,仿函数(1)是一个类,类中重载()运算符; eg: MyPrint p; p(111) ;(2)内部可以记录状态,例如调用次数;(3)作为类型,可以与普通函数和模板等作为参数使用;代码分析#include<iostream>using namespace std;class MyPrint{public: MyPrint() { this...原创 2020-01-23 17:54:38 · 180 阅读 · 0 评论 -
vector的简单使用
每个容器都有自己的迭代器,学习容器要配合他的迭代器一起使用#include<iostream>#include<vector>using namespace std;//vector简单使用void test01(){ //vector声明容器 vector<int> v; //插入数据 v.push_back(10); v.push_...原创 2020-01-18 22:14:52 · 144 阅读 · 0 评论 -
STL学习方向--六大组件
1.STL(standard template library)广义上分为三大组件: 容器 ,算法, 迭代器 细分为六大组件: (1)容器 (2)算法 (3)迭代器 (4)仿函数 (5)适配器 (6)空间配置器STL优点:(1)高可重用性 :模板类,模板函数(2)高性能 :例如map可以从十几万数据快速查找数据,使用红黑树机制(3)高可移植(4)跨平台...原创 2020-01-18 22:12:16 · 209 阅读 · 0 评论 -
函数模版与普通函数的区别以及调用规则
函数模板与普通函数的区别以及调用规区别:普通函数参数可以隐式类型转化,模板不可以;调用规则:(1)C++编译器优先考虑普通函数;(2)可以通过空模板实参列表(<>)限定只能通过模板匹配;(3)函数模板可以像普通函数那样被重载;(4)如果模板可以产生一个更好的匹配,那么优先选择模板;模板的局限性及解决方案:模板不能解决所有数据类型,例如对象之间的操作。解决方案:具体化模板...原创 2020-01-17 01:32:14 · 250 阅读 · 0 评论 -
C++异常
C语言处理错误的方式终止程序。assert ,这种方式比较粗暴,如发生内存错误,除0错误时就会终止程序。返回错误码,缺陷:需要程序员自己去查找对应的错误。如系统的很多库的接口函数都是通过把错误码放到errno中,表示错误。C 标准库中setjmp和longjmp组合。这个不是很常用,这个我也不是很了解。大家知道有这么个东西就行了。C++异常概念异常是一种处理错误的方式,当一个函数发现自己...原创 2020-01-17 01:27:05 · 193 阅读 · 0 评论 -
C++ 为什么模板只能在头文件中实现?
模板类的定义和实现必须要在同一个文件中,通常是头文件,编译器要看到模板实现才能展开模板。因为初始化一个模板,编译器根据模板的参数创建一个新的类。比如:templatestruct Foo{T bar;void doSomething(T param) {/* do stuff using T /}};// somewhere in a .cppFoo f;编译器在解析到这段代码时,会...转载 2020-01-15 19:08:41 · 1333 阅读 · 0 评论 -
C++简易PK小游戏
需求分析:英雄类:名字,基础攻击力,防御力,血量,使用武器武器类:名字,攻击力加成,是否吸血,是否暴击怪物类:名字,攻击力,防御力,是否被定身设计重点:(1)封装武器类为抽象类,做底层父类。有利与扩展操作武器扩展(继承)为:小刀,屠龙宝刀(2)英雄和怪物,每个类都有一个自己的Attack函数来攻击weapon.h#pragma once#include<iostream&...原创 2020-01-14 15:43:49 · 1613 阅读 · 0 评论 -
多态------静态联编与静态联编
静态联编和动态联编(一)多态的分类(多态:父类的引用或者指针 指向子类对象)静态多态:编译时期确定了调用函数地址,早绑定,静态联编;运算符重载,函数重载动态多态:执行时期确定调用函数的地址,晚绑定,动态联编;父类虚函数,继承关系,且具有重写(二)多态原理解析(1)当父类中有虚函数时,内部结构就发生了变化,多了一个vfptr指针(前4个字节)指向自己的虚函数表;(2)子类继承时,会继承...原创 2020-01-12 16:30:53 · 274 阅读 · 0 评论 -
继承------重点总结
继承方式(父类的私有属性,子类都不可访问;但是被继承了,sizeof时还有其大小,因为被编译器隐藏)子类公有继承:父类的公有属性或方法在子类中还是公有,保护还是保护。子类保护继承:父类的公有属性或方法在子类中变为保护,保护还是保护。子类私有继承:父类的公有属性或方法在子类中变为私有,保护变为私有。总结:继承的方式可以理解为子类中最低权限,超过此权限的属性和方法,就拉回到最低权限,eg:保护...原创 2020-01-12 16:28:15 · 185 阅读 · 0 评论 -
强化训练--MyString类的实现
注意:分文件编写MyStrin.h#pragma once#define _CRT_SECURE_NO_WARNINGS#include<iostream>using namespace std;class MyString{ friend ostream& operator<<(ostream &cout,MyString& st...原创 2020-01-11 13:20:46 · 237 阅读 · 0 评论 -
常用运算符重载
加号运算符重载成员函数重载 operator+(Person &p)全局函数重载 operator+ (Person& p1,Person&p2)左移运算符重载目的:cout<<p<<endl,为了直接输出一个对象必须写全局函数,因为要受用输出流语法:ostream& operator<<( ostream&...原创 2020-01-10 15:41:07 · 314 阅读 · 0 评论 -
友元函数:友元类
全局函数做友元 :(1)类中写 friend void func(){}; (2)为了好友可以访问我当前的私有属性整个类做友元类 :(1)类中写 friend class Person; (2)友元类时单向的(A是B的友元类,但B不是A的友元类),不 可传递的(A是C,B是C友元类,A和B...原创 2020-01-10 15:37:50 · 236 阅读 · 0 评论 -
单例模式简析
11.单例模式案例----主席 (1)内部维护一个私有化static的对象指针。(类外初始化,编译阶段就new出来了,比main函数的执行出现的早) (2)默认构造和拷贝构造私有化 (3)对外提供公有化static getInstance()方法访问这个指针 注意:目的:为了让类中中有一个实例,实例不需要自己释放(即不需要自己提供析构函数...原创 2020-01-10 15:12:39 · 105 阅读 · 0 评论 -
C++基础知识总结
3.引用(起别名,必须初始化且只能初始化一次,必须引用一个合法的内存空间)用途 参数传递:不改变实参值-》值传递即可需要改变参数值-》指针传递或者引用传递注意事项:(1)不要返回局部变量,可以加static成为全局(返回局部变量编译器优化只保存一次)(2)函数返回的是引用,函数的调用可以作为等号的左值指针的引用: 用一级指针引用可以代替二级指针常量引用 : 使用场景 修饰形参为只...原创 2020-01-10 14:51:01 · 158 阅读 · 0 评论 -
C++对C的增强
C++对C的增强C++对C的增强(1)全局变量检测增强eg: int a;int a=100; (C语言可以认为是赋值,C++语言认为是重定义)(2)函数检测增强2.1 参数类型检测 (C语言参数无类型,可以编过但有警告,C++必须有类型)2.2 返回值检测 (C语言可以没有返回值可以编过,C++必须有)3.3 传参个数检测 (C语言可以传实参个数大于形参个数,...原创 2020-01-10 14:48:27 · 137 阅读 · 0 评论