C++基础
日常C++开发,记录学习到知识点
路奇怪
各位该点赞点赞 该收藏收藏啊,不定期会更新系列基础知识
展开
-
C++基础 调用堆异常
可以极大地帮助解决在开发人员系统上无法重现的客户问题,并且调用了一个通用函数,您不知道它的调用者,因为它们很多。必须为客户提供一个可执行文件和一个使用该可执行文件构建的 pdb,才能获得正确的调用堆栈。pdb 文件包含调试符号。您不能提供稍后从同一代码构建的 pdb。当我们构建可执行文件时,每个函数都有一个地址偏移量。pdb 基于这些偏移量。再次生成二进制文件时,偏移量会发生变化。简而言之,pdb 的函数偏移量必须与可执行文件匹配。原创 2024-06-27 15:54:52 · 241 阅读 · 0 评论 -
C++基础std::bind
std::bind是一个函数模板,用于创建一个可调用对象,该对象可以在稍后的时候被调用。bind的作用是将函数与参数绑定在一起,在调用时可以自动传入预定的参数值。是 C++ 标准库中的两个实用工具,它们分别用于创建对对象的引用和常量引用的包装器。其中,F是需要绑定的函数或函数对象,Args是绑定函数所需的参数。所以说可以认为bind是函数特殊引用。原创 2024-06-19 16:28:50 · 280 阅读 · 0 评论 -
C++基础 std::find以及扩展
是C++标准库中的一个通用查找算法,用于在给定范围内查找指定元素。它接受两个迭代器作为参数,分别表示搜索范围的起始和结束位置。如果找到指定元素,则返回指向该元素的迭代器;否则,返回指向搜索范围末尾的迭代器。原创 2024-06-12 11:42:26 · 272 阅读 · 0 评论 -
C++ 类型推导Auto及decltype
除此之外使用 auto 会删除引用、const 限定符和 volatile 限定符,如下面代码会输出什么呢?是 C++11 及其后续版本中引入的两个关键字,它们都用于自动类型推导,但在使用和行为上有一些重要的区别。而是被立即处理,并且在当时诊断产生的所有错误。关键字在 C++ 中用于自动类型推导。编译器会根据初始化表达式自动推断变量的类型。关键字在编译时推导变量的类型,并且在推导过程中会考虑引用和。关键字使代码更加简洁,因为你不需要显式地写出变量的类型。因此,如果在 decltype。原创 2024-04-12 16:27:56 · 373 阅读 · 0 评论 -
C/C++ 内存分配方法对比
抽象级别new是一个高级别的抽象,它会自动调用构造函数和析构函数,并处理内存分配和释放。而allocate是一个低级别的抽象,只负责分配和释放内存,不涉及对象的构造和析构。初始化new会初始化分配的内存,而allocate只分配未初始化的内存。错误处理new在内存分配失败时抛出异常,而allocate在失败时返回nullptr(如果它设计为这样做的话)。使用场景new通常用于直接创建对象,而allocate通常用于实现自定义容器或需要更精细控制内存分配的场景。释放内存new分配的内存使用delete。原创 2024-04-12 14:47:35 · 645 阅读 · 0 评论 -
C++基础 别名和typedef
C++ 别名是在编程中用于为类型、命名空间或函数定义别名的一种方式。常见方式比如引用、宏定义、typedef。下面说说几种不常用。原创 2024-04-12 14:32:21 · 201 阅读 · 0 评论 -
C++ 基础 alignas alignof
alignas是C++11引入的一个关键字,用于指定对象或类型的对齐方式。对齐方式指的是对象或类型在内存中的起始地址的对齐方式,对齐方式的选择可以在一定程度上提高程序的运行效率。,表达式必须是 0 或幂为 2(1、2、4、8、16、...)的整型常量表达式。所有其他表达式的格式不正确,要么会被编译器忽略掉。可以对 struct。alignof运算符将指定类型的对齐方式(以字节为单位)作为类型 size_t。或变量声明使用 alignas。原创 2024-04-12 13:46:12 · 427 阅读 · 0 评论 -
C++基础 std::funtion简说
类模板是通用多态函数包装器。的实例能存储、复制及调用任何可复制构造 (CopyConstructible)的可调用 (Callable)目标——函数、lambda 表达式bind 表达式或其他函数对象,还有指向成员函数指针和指向数据成员指针。存储的可调用对象被称为的目标。若不含目标,则称它为空。调用空的目标导致抛出异常简而言之:std::function实现了一套类型消除机制,可以统一处理不同的函数对象类型。以前我们使用函数指针来完成这些;原创 2023-12-08 10:00:55 · 178 阅读 · 0 评论 -
C++基础 std::Move简说
Move最主要的作用是实现移动语义,避免不必要的复制操作,move函数的参数是一个通用引用(universal reference),既可以接受左值类型,也可以接受右值类型。首先,函数参数T&&是一个指向模板类型参数的右值引用,通过引用折叠,此参数可以与任何类型的实参匹配(可以传递左值或右值,这是std::move主要使用的两种场景)。提到Move引出一个C++ 中有左值和右值的概念,简单来说,左值指的是可以取地址的表达式,右值指的是不可以取地址的表达式。传递类型保持不变还是右值,而左值经过。原创 2023-12-07 16:10:26 · 988 阅读 · 0 评论 -
C++基础 强制转换
C++ 提供几类转换。原创 2023-12-07 15:03:45 · 107 阅读 · 0 评论 -
C++基础 智能指针 关于std::shared_ptr循环应用问题
这种情况下,内存无法被垃圾收集器正确释放,从而可能导致内存泄漏,在这种情况下,A的实例可以通过bPtr引用B的实例,反之亦然。但是,如果这些是唯一的引用,那么垃圾收集器无法确定这两个对象何时不再需要,因为它们互相引用,形成了一个循环。是一种独占式智能指针,用于管理唯一的对象,确保只有一个指针可以访问该对象。使用引用计数技术追踪所管理对象的引用数量,当引用计数变为零时,自动销毁所管理的对象。可以自动释放动态分配的内存,当指针超出作用域或被重置时,它会自动删除所管理的对象。对象存在,所管理的对象也会被销毁。原创 2023-10-18 16:33:16 · 172 阅读 · 0 评论 -
C++ RGB与HSL相互转换
找了好久HSL转RGB发现好多博客都是错误,终于发现这篇博客可以用,测试误差在±1吧,转载 2023-03-14 14:54:14 · 347 阅读 · 0 评论 -
C++知识点-容器内添加结构体这样类型
之前再做功能时候遇到这个问题,当时感觉莫名其妙,后来在看Qt资料发现这么一句话。能够存储在容器中的数据必须是可赋值数据类型。所谓可赋值数据类型,是指具有默认构造函数、拷贝构造函数和赋值运算符的类型。绝大多数数据类型,包括基本类型,比如 int 和 double,指针,Qt 数据类型,例如QString、QDate和QTime,都是可赋值数据类型。但是,QObject及其子类(QWidget、QTimer等)都不是。也就是说,你不能使用QList<QWidget>这种容器,因为QWidget的原创 2021-09-17 16:14:43 · 687 阅读 · 0 评论 -
C++ 前置声明
为什么要用到前置声明,以及前置声明的环境原创 2022-07-11 10:12:08 · 774 阅读 · 0 评论 -
C++ 判断字符在字母和数字内
C++ 判断字符在字母(大写或 小写)和数字内原创 2022-08-14 19:48:05 · 406 阅读 · 0 评论 -
C++操作符#和##作用以及#@
/宏引用://替换结果:classTimermeTome。转载 2022-07-04 11:23:09 · 757 阅读 · 0 评论 -
C++基础- remove和erase区别(STL)
先说线两者区别remove:删除自定元素或者区间元素,后面元素向前移动,但是容器的大小并不变化,这样就会导致空出来位置被默认填充。erase:是真正删除自定元素或者区间元素,并返回下一个元素地址,容器的大小会有变化,所以要注意指针问题。iterator erase(const_iterator postion);iterator erase(const_iterator first,const_iterator last);...原创 2021-09-17 17:40:20 · 1220 阅读 · 0 评论 -
C++基础-回调函数
1.回调函数的本质就是函数调用函数指针作为形参传到要处理的函数内部作处理。// 回调函数指针typedef void(*fun)(QString id, QString str);//存放调用函数类型和函数指针的mapstatic std::map<QString, fun> callbackfun_map;// 要被回调函数void test(QString id,QString str){ cout << id << ":" <...原创 2021-09-17 11:20:08 · 173 阅读 · 0 评论 -
C++基础——右值引用
简介:我们知道C++有引用,即取地址&运算符。那右值引用是什么?我们可以认为=左边为左值,可以获取左边地址,右边为右值,C++11里面新定义了一个概念右值引用,即&&;需要注意的是,右值引用不会影响值的变化。用途:1、转移功效// 比如我们常用string对象去初始化另一个变量对象,那么在这个过程中会调用str的拷贝构造函数,然后增加// 一个临时变量,分配内存,完成后在释放掉,string str1 = 10;string str2 =str1; //原创 2021-08-26 14:38:38 · 144 阅读 · 0 评论 -
C++函数指针
函数指针的定义形式返回类型*(函数指针名)(函数参数1,函数参数2,....)类的函数指针定义方式返回类型*(类名::函数指针名)(函数参数1,函数参数2,....)or typedef返回类型*(函数指针名)(函数参数1,函数参数2,....)函数指针用途可以分为两类:1.作函数指针使用// ....省略头文件int fun(int a, int b){ return a +b;}void fun_1(int a,int b){ a = a ..转载 2021-08-20 13:34:23 · 135 阅读 · 0 评论 -
C++explicit关键字
作用:显示的构造函数,因为构造函数有一个参数时,会有隐式的转换,参数有多个会自动的显示转换,所以不用考虑。拷贝构造函数不要用explicit。对应的还有显示转换implicit。例子:# 没加头文件凑合着看class A{ A(int m = 1):_m(m){}; // elplicit A(int m = 1):_m(m){}; // 流程2.会报错,原因是我们没有重载opertator=,m不能隐式赋值给_m ~A();public: int原创 2021-08-19 10:22:07 · 84 阅读 · 0 评论 -
C++关键字override
override方法提供从基类继承的方法的新实现。 通过override声明重写的方法称为重写基方法,按道理是我们编程的时候不用加上去,但是良好习惯还是加上去。因为有的时候加入系统自身带有一个函数,class A : public object{ virtual void add(Event *evn) = 0;}class B : public A{ // 加上override编译器就会检测出err void add(Even *evn); //假设其他地方...原创 2021-08-05 14:16:05 · 473 阅读 · 0 评论 -
C++ Auto读写操作
#include<iostream>#include<vector>using std::vector;struct Node{ int value; int key; // struct初始化 Node(int _v,int _k):value(_v),key(_k){}};int main(int argc, char *argv[]){ vector<Node> vec; vec.push_ba.原创 2021-03-01 15:00:29 · 227 阅读 · 0 评论 -
引入C++特化概念(开阔视野篇)
下面这段代码意思就是如果void类型的则走void*特化,如果没有匹配到特化,就走正常流程。特化分为全特化和偏特化,特化参数意思简略来讲就是根据类型区匹配不同的C++模板。本篇只是浅显的引入C++模板特化概念(原创 2021-02-04 16:31:01 · 127 阅读 · 2 评论 -
C++ CString转char数组
1.第一种方法是通过strncpy_s这种在unicode字符集测试没有问题 CString sendstr = _T("sadf"); char buf[100] = {};//是将sendstr中的内容拷贝到buf //以下两步是先将CString转为string,再由c_str()转为const char* string stra = CStringA(sendstr); strncpy_s(buf, _countof(buf), stra.c_str(), sendstr.GetL原创 2020-09-02 18:57:25 · 11192 阅读 · 5 评论 -
常用字符串处理函数(转载)
常用函数对照可以用Ctrl+F,查找ANSI UNICODE 通用 说明 数据类型 (char.h) (wchar.h) (tchar.h) char wchar_t TCHAR char * wchar_t * TCHAR* LPSTR LPWSTR LPTSTR LPCSTR LPCWSTR LPCTSTR 字符串转换 atoi _...转载 2020-06-17 17:01:25 · 507 阅读 · 1 评论 -
C++基础教程(1)
C++变量:目录C++变量:1)基础类型C++ 为程序员提供了种类丰富的内置数据类型和用户自定义的数据类型。下表是七种基本的 C++ 数据类型类型 关键字 布尔型 bool 字符型 char 整型 int 浮点型 float 双浮点型 double 无类型 void 宽字符型 wchar_t 一些基本类型可以使用一个或多个类型修饰符进行修饰signed(带符号类型) 表示正数、负数、0; u...原创 2020-05-09 21:47:15 · 146 阅读 · 0 评论 -
_cdecl和_stdcall和PASCAL区别
1._cdecl(1). 是C Declaration的缩写,表示C语言默认的函数调用方法,实际上也是C++的默认的函数调用方法。(2). 所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。具体所示:调用方的函数调用->被调用函数的执行->被调用函数的结果返回->调用方清除调整堆栈。(3). 被调用函数无需要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误。总的来说函数的参数个数可变的(就像printf函数一...原创 2020-05-09 10:26:26 · 235 阅读 · 0 评论 -
C++面试基础篇(后续继续更新.....)
1.C++中的 struct 和 class 有什么区别?【参考答案】从语法上讲,class和struct做类型定义时只有两点区别: (一)默认继承权限。如果不明确指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理; (二)成员的默认访问权限。class的成员默认是private权限,struct默认是public权限。 除了这两点,c......原创 2019-09-11 17:37:43 · 961 阅读 · 0 评论 -
(白话)C\C++中的size()、length()、strlen()、sizeof()用法
个人感觉C\C++对字符处理并不太好,本篇内容也是一些公司喜欢问的基础问题。首先,讨论一下size()、length()、strlen()、sizeof()区别(很多人搞不清楚) size()和length()这两个函数是用来计算string类对象或者即STL对象方法。都是计算字符串长度。 strlen()是函数,参数必须是字符型指针(char*),计算从开始到结束(’\0‘...原创 2019-05-23 11:42:56 · 6525 阅读 · 0 评论 -
在三维坐标中给出三个点,求三个点所在平面的圆心和圆心坐标
原理地址传送:https://blog.csdn.net/yanmy2012/article/details/8111600https://blog.csdn.net/cwj066/article/details/82692271(顺便推荐一个基础计算博客)这里不讲公式推导数学计算,自己去问别人。博主也不想算,拿来就用。想弄清楚一点的,可以看原理传送门。C/C++代码实现(注意两点没有...原创 2019-05-27 16:00:05 · 6421 阅读 · 6 评论