![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 56
What’smean
这个作者很懒,什么都没留下…
展开
-
VS构建项目报错信息及解决办法05
(因为工程中的每个cpp文件属性默认都是使用预编译头(/YU)的,但是添加的第三方文件并没有 #include "stdafx.h" 预编译指示头,所以编译器在此cpp文件中一直到末尾都没有找到它)此错误发生的原因是编译器在寻找预编译指示头文件(默认#include "stdafx.h")时,文件未预期结束。iob_func到__acrt_iob_func的转换函数解决此问题, * 当libjpeg-turbo用vs2015编译时,不需要此补丁文件。属性>C/C++>预编译头>不使用预编译头。原创 2023-07-26 15:46:18 · 1114 阅读 · 0 评论 -
VS构建项目报错信息及解决办法04
符号”是函数或全局变量的内部名称。它是在已编译的对象文件或库中使用或定义的名称形式。全局变量在为其分配了存储的对象文件中进行定义。函数在放置函数体的已编译代码的对象文件中进行定义。“外部符号”是在一个对象文件中引用,但在不同的库或对象文件中定义的符号。“导出的符号”是由定义它的对象文件或库公开提供的符号。链接器必须解析或查找每个对象文件引用的每个外部符号的匹配定义。这意味着链接器在任何链接文件中都找不到匹配的导出符号的定义。编译后的代码引用或调用符号。该符号未在链接器搜索的任何库或对象文件中定义。原创 2023-07-26 15:42:13 · 561 阅读 · 0 评论 -
VS构建项目报错信息及解决办法03
同样的字节序列,在不同的字符集下表示的字符不一样。由于不同 ANSI 编码所规定的标准是不相同的(字符集不同),因此,对于一个给定的多字节字符串,我们必须知道它采用的是哪一种字符集则,才能够知道它包含了哪些“字符”。为了写程序的方便,微软定义了类型LPTSTR,在MBCS下它表示char*,在Unicode下它表示unsigned char*,这就可以重定义一个宏进行不同字符集的转换了 3.关系 LPSTR: 指向一个字符串的32位指针,相当于char *;原创 2023-07-26 15:38:21 · 1194 阅读 · 0 评论 -
VS构建项目报错信息及解决办法02
fatal error C1083: 无法打开包括文件: “dirent.h”: No such file or directory。项目为Linux环境下的,而在windows下VS中的MSVC并没有实现“dirent.h”头文件。自定义头文件并进行添加,头文件链接。原创 2023-07-26 15:36:00 · 677 阅读 · 0 评论 -
VS构建项目报错信息及解决办法01
1>MSVCRT.lib(exe_winmain.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 "int。在Linux/Unix 系统下编写的C/C++代码需要头文件unistd.h,但Windows 环境下没有该头文件,所以用VS编译会报错。__scrt_common_main_seh@@YAHXZ) 中被引用。应用程序和控制台程序的入口函数不一样,windows程序中WinMain是入口函数,dos控制台程序中main是入口函数。原创 2023-07-26 15:34:13 · 424 阅读 · 0 评论 -
将EXE文件转化为DLL文件
将属性中的生成改为dll生成完成!原创 2023-07-05 17:32:08 · 2887 阅读 · 0 评论 -
内存对齐相关
在编写代码时,应注意数据类型和结构体的对齐要求,并考虑对齐对性能和可移植性的影响。可以使用编译器提供的对齐指令来调整数据的对齐方式,以满足特定的需求。结构体对齐:结构体的对齐要求是其成员中最大字节大小的数据类型的对齐要求。如果结构体中的成员的总大小不是对齐边界的倍数,则编译器会在结构体的末尾添加一些空白字节,以使结构体满足对齐要求。例如,C/C++ 中的。指令后,结构体的对齐将按照指定的字节大小进行调整,即结构体的大小必须是指定字节大小的倍数。结构体的对齐要求是其成员中最大字节大小的数据类型的对齐要求。原创 2023-07-03 12:49:23 · 153 阅读 · 0 评论 -
函数指针及其作用
需要注意的是,虽然函数指针在某些情况下非常有用,但在现代C++中,有一些更高级的技术和工具,如函数对象、Lambda表达式和std::function,可以提供更强大和灵活的函数调用和处理机制。函数的运行时绑定和重载:函数指针可以用于实现函数的运行时绑定,即根据对象的类型动态选择要调用的函数。函数的延迟加载和动态链接:函数指针可以用于实现函数的延迟加载,即在需要时才加载和调用函数。回调函数:函数指针可以用作回调函数的机制,允许在程序运行时动态地指定要调用的函数。它调用传递的函数指针来处理传递的值。原创 2023-07-03 12:47:25 · 1255 阅读 · 0 评论 -
继承和组合
组合关系是一种强关联关系,被组合的类的对象的生命周期与组合类的对象的生命周期相互依赖。子类可以重写父类的方法,实现自己的行为,同时可以通过父类的引用或指针来访问子类对象,实现多态的效果。通过继承,子类可以获得父类的成员变量和成员函数,并且可以添加自己特定的成员变量和成员函数,以扩展父类的功能或实现自己的特定需求。需要注意的是,组合关系中,被组合的类的对象是作为成员变量直接存在于组合类中的,它们共享同一个命名空间,可以直接访问和使用。继承关系中,子类继承父类的属性和方法,子类可以重写父类的方法,实现多态性。原创 2023-06-30 08:42:46 · 886 阅读 · 0 评论 -
类的静态分配与动态分配
静态分配:由编译器为对象在栈空间中分配内存;动态分配:使用new运算符为对象在堆空间中分配内存。原创 2023-06-30 08:41:19 · 281 阅读 · 0 评论 -
全局变量和局部变量
全局变量(Global Variable)和局部变量(Local Variable)是两种不同作用域的变量。原创 2023-06-30 08:42:05 · 2229 阅读 · 0 评论 -
C++函数调用的压栈过程
需要注意的是,栈的管理是由编译器和操作系统来完成的,具体的实现可能有所不同。C++函数调用的压栈过程是指在函数调用时,将函数的相关信息和局部变量等数据存储在栈(Stack)上的过程。上述示例展示了函数调用的压栈过程,包括参数的传递、局部变量的分配和返回地址的保存。在函数调用之前,将下一条指令的地址(函数调用后执行的下一条指令)压入栈中,以便函数执行完后能够返回到正确的位置。函数调用完成后,会按照相反的顺序将栈上的数据出栈,恢复到调用函数的状态,并将控制权返回给调用函数。函数,按照从右到左的顺序压入栈中。原创 2023-06-29 09:07:55 · 1304 阅读 · 2 评论 -
形参、实参以及参数的传递
实参是函数调用时提供的参数的值,用于传递给函数定义中对应的形参。形参的数量和类型必须与实参的数量和类型匹配,即在函数调用时,提供的实参个数和类型要与函数定义中的形参一致。传递实参给形参时,实参的值被复制到形参中,函数内部对形参的修改不会影响实参的值。在函数调用时,实参的地址被传递给形参,函数内部可以通过解引用指针来修改实参的值。在函数调用时,实参的值被复制到形参中,函数内部对形参的修改不会影响实参的值。位置匹配:实参按照形参的顺序进行对应,位置相同的实参传递给对应的形参。原创 2023-06-29 09:03:34 · 2275 阅读 · 0 评论 -
typeid、static
然而,需要注意静态成员的初始化和访问规则,以确保正确的使用和管理。对于非多态类型或未定义的类型,在函数内部声明的静态变量在程序运行期间保持其值的持久性,即在函数退出后仍然存在。静态函数在类中声明,它们不依赖于任何特定的对象,可以直接通过类名来调用。静态类成员是类的成员变量或成员函数,它们被类的所有对象所共享。是C++中一个关键字,用于指定变量、函数或类成员的静态性质。静态成员可以在类外部初始化,且需要在类外部定义。的成员函数,可以比较类型、获取类型名称等。指向的对象的实际类型,并输出相应的信息。原创 2023-06-29 09:01:08 · 158 阅读 · 0 评论 -
智能指针(Smart pointers)
std::unique_ptr确保在其生命周期结束时,自动释放所管理的对象,并确保只有一个std::unique_ptr可以拥有对该对象的所有权。std::shared_ptr可以拥有多个std::shared_ptr对象共享对同一对象的所有权,通过引用计数来跟踪对象的使用情况。std::shared_ptr会在最后一个拥有所有权的std::shared_ptr析构时,自动释放所管理的对象。std::shared_ptr是一种共享所有权的智能指针,用于管理共享资源的动态分配内存。原创 2023-06-29 08:57:41 · 1046 阅读 · 0 评论 -
左值、右值、左值引用、右值引用
需要注意的是,C++11之后,引入了右值引用(Rvalue Reference)和转发引用(Forwarding Reference),在某些情况下可以绑定到左值或右值。总结:右值引用是C++11引入的一种引用类型,用于引用右值。左值引用在函数参数中的使用非常常见,可以用于传递对象的引用,避免了对象的复制。转发引用是右值引用的一种特殊情况,可以绑定到左值或右值,并用于实现完美转发,即将参数以原样转发给其他函数。左值引用在函数参数中的使用非常常见,可以用于传递对象的引用,避免了对象的复制。原创 2023-06-28 16:29:32 · 611 阅读 · 0 评论 -
类成员de初始化
在C++中,类的成员可以使用初始化列表(Initialization List)或构造函数体内的赋值语句进行初始化。原创 2023-06-28 16:00:48 · 190 阅读 · 0 评论 -
重载(Overloading)、覆盖(Override)和隐藏(Hide)
重载允许在同一作用域内定义具有相同名称但不同参数的函数。覆盖允许在派生类中重新定义基类中的虚函数,以改变其行为,实现运行时多态性。隐藏在派生类中定义与基类同名但参数不同的函数,隐藏了基类的函数,使得无法动态调用派生类中的同名函数。原创 2023-06-28 09:25:51 · 684 阅读 · 0 评论 -
顶层const和底层const
顶层const和底层const的区别在于它们所修饰的是指针或变量本身还是所指向的对象。顶层const表示指针或变量本身是常量,而底层const表示指针或引用所指向的对象是常量。这两种const修饰符可以组合使用,形成不同的const类型,以满足不同的需求。顶层const(top-level const)和底层const(low-level const)是C++中用于描述const修饰符的两个概念。const int *a,其中a为指向int型变量的指针,const在 * 左侧,表示a指向不可变常量。原创 2023-06-28 09:07:34 · 813 阅读 · 1 评论 -
strlen和sizeof区别
它可以用于获取数据类型的大小,也可以用于获取数组、结构体、指针等对象的大小。操作符返回的是对象或类型所占用的字节数,因此在计算数组的大小时会包括数组元素的个数乘以每个元素的大小。可以用于获取数据类型的大小,也可以用于获取数组、结构体、指针等对象的大小。计算的是对象或类型所占的字节数,包括终止空字符(对于字符数组)。是C/C++中用于获取字符串长度和内存大小的两个不同的操作。函数只计算字符串的长度,不包括字符串的终止空字符。计算的是字符串的长度,不包括终止空字符。是一个函数,用于计算字符串的长度。原创 2023-06-27 09:00:00 · 228 阅读 · 0 评论 -
malloc/free和new/delete的区别与联系
分配的内存是以对象为单位的,根据对象的类型进行内存分配。它会自动计算所需的字节数,并在对象的生命周期结束时自动调用析构函数来释放内存。如果需要在内存分配和释放过程中构造和销毁对象,需要手动调用构造函数和析构函数。是C++中的操作符,可以直接用于对象的创建和销毁,不需要进行手动的类型转换。分配的内存是以字节为单位的,需要指定要分配的字节数。它们可以在运行时根据需要分配所需大小的内存,并在不需要时释放内存。都可以用于堆上的内存管理,但使用方式、类型安全性和与对象构造和析构函数的关联方面存在区别。原创 2023-06-26 16:23:20 · 428 阅读 · 0 评论 -
指针和引用的区别与联系
指针是一个变量,存储其他变量的内存地址,可以重新赋值和具有空值;引用是一个变量的别名,必须在定义时初始化,不能重新赋值和具有空值。指针存储变量的地址,可以进行指针运算和解引用;引用不存储地址,直接绑定到已存在的变量上,可以直接使用原始变量的名称。指针和引用都可以作为变量的别名,通过它们来访问和修改原始变量。指针和引用都可以作为函数参数传递,实现对函数外部变量的修改,但传递方式和语法略有不同。指针可以用于遍历数组,引用不是一个独立的变量,不能直接用于遍历数组。都是地址的概念;原创 2023-06-26 16:05:33 · 365 阅读 · 0 评论 -
a与&a的区别与联系
如果。原创 2023-06-26 15:20:16 · 3227 阅读 · 0 评论 -
ELF文件中得section(.data .bss .text .altinstr_replacement、.altinstr_aux)
在计算机编程中,.data .text和 .bss 部分是程序内存布局的特定段,通常出现在 C 和 C++ 等编译语言中。.data 部分用于存储初始化的全局变量和静态变量。这些变量被分配一个初始值或由程序员显式初始化。该部分中存储的数据在程序执行过程中一直保留。存储在 .data 部分中的变量示例包括具有指定值的全局变量,例如整数、浮点数和字符数组。.bss(由符号启动的块)部分用于存储未初始化的全局变量和静态变量。这些变量未分配任何初始值,并由系统隐式初始化为零或空值。原创 2023-06-26 14:56:10 · 325 阅读 · 0 评论 -
四个强制类型转换reinterpret_castconst_caststatic_cast dynamic_cast及比较
然后我们使用“reinterpret_cast”创建一个指向浮点数“fp”的指针,它获取“i”的地址并将其视为指向“浮点数”的指针。它可用于相关类型之间的转换,例如将派生类指针转换为基类指针,或执行算术转换,例如将整数转换为浮点数。我们还有一个基类“Base”和一个派生类“Derived”,并创建一个“Derived”类型的新对象并将其赋值给一个“Base*”类型的指针。我们使用“static_cast”将“i”转换为浮点数“f”,这是安全的,结果是“f”的值为 42.0。原创 2023-06-14 10:09:53 · 1587 阅读 · 1 评论 -
C++ A lambda function
在此示例中,lambda 函数被分配给变量“add”,它可以像任何其他函数对象一样使用。请注意,“auto”关键字用于推断 lambda 函数的类型,它是一个函数对象。:这是一个可选的变量列表,lambda 函数可以从周围的上下文中捕获这些变量。:这是 lambda 函数的返回类型。它是可选的,如果省略,则返回类型从函数体中的 return 语句推导出来。lambda 函数是 C++ 中的匿名函数,可以内联定义并用作函数对象。:这是 lambda 函数采用的以逗号分隔的参数列表。返回森林中的每棵树。原创 2023-05-30 09:53:59 · 583 阅读 · 0 评论 -
static_cast和dynamic_cast的使用
然后我们使用 `dynamic_cast` 将 `Base*` 指针转换为 `Derived*` 指针。在此示例中,我们使用 `static_cast` 将 `int` 变量 `a` 转换为 `double` 变量 `b`。总之,`static_cast` 用于可以在编译时检查的类型转换,而 `dynamic_cast` 用于在运行时在多态类型之间进行安全向下转换。`static_cast` 和 `dynamic_cast` 都是 C++ 中的转换运算符,但它们用于不同的目的并且具有不同的行为。原创 2023-05-18 15:21:52 · 650 阅读 · 0 评论 -
`try`, `catch`, and `throw` 的简单使用
在 `main()` 函数中,我们在 `try` 块中调用 `divide(a, b)`,并在 `catch` 块中捕获任何类型为 `std::exception` 的异常。`throw` 关键字用于从 `try` 块中显式抛出异常。如果抛出的异常类型与 `catch` 块中指定的类型匹配,则执行 `catch` 块中的代码。在 try 块中,您编写的代码可能会引发异常。总之,`try`、`catch` 和 `throw` 是异常处理中用于处理程序中的错误情况并提供错误报告和恢复机制的关键字。原创 2023-05-17 15:56:05 · 247 阅读 · 0 评论 -
c++结构体对齐
说明符强制结构具有 4 个字节的最小对齐,这意味着 该结构的地址必须是 4 字节的倍数。由于 b 是结构的最大成员,大小为 2 个字节,因此编译器将结构对齐为 2 个字节的倍数。但是,由于 alignas(4) 说明符要求至少对齐 4 个字节,因此编译器会在 c 之后额外添加 2 个字节的填充,以确保结构的地址始终是 4 个字节的倍数。如果没有填充,结构的大小将为 5 个字节(“a”为 1 个字节,“b”为 2 个字节,“c”为 1 个字节),这不是 4 个字节的倍数。结构的大小(以字节为单位),即 8。原创 2023-05-16 17:42:17 · 331 阅读 · 0 评论 -
main函数之前之后执行的代码
之前调用构造函数,这是可能会执行前的一些代码。注册一个函数,它会在main 之后执行;2.可以用 atexit。原创 2023-05-16 17:02:16 · 844 阅读 · 0 评论 -
C++ 内存管理中内存泄漏问题产生原因以及解决方法
C++内存管理中内存泄露(memory leak)一般指的是程序在申请内存后,无法释放已经申请的内存空间,内存泄露的积累往往会导致内存溢出。转载 2023-05-06 09:58:40 · 1673 阅读 · 0 评论 -
数组与vector的区别与联系
数组与vector的区别与联系原创 2022-10-26 10:38:56 · 3469 阅读 · 0 评论 -
C++ new与非new
new转载 2022-10-13 15:34:27 · 564 阅读 · 0 评论 -
直接管理内存与智能指针比对
通过代码分析得到智能指针的优势://普通指针int *q = new int(42), *r = new int(100);r = q;//智能指针auto q2 = make_shared<int>(42), r2 = make_shared<int>(100);r2 = q2;普通指针:对于普通指针部分,首先分配了两个int型对象,指针分别保存在p和r中。接下来,将指针q的值赋予了r,这带来了两个非常严重的内存管理问题:首先是一个直接的内存泄漏问题,r原创 2022-05-03 11:06:55 · 380 阅读 · 0 评论 -
list、 vector、deque、map以及set的适用场景
1.vector、deque若元素很小(例如int),大致数量预先可知,在程序运行过程中不会剧烈变化,大部分情况下只在末尾添加或删除需要频繁访问任意位置的元素,则vector可带来最高的效率。若需要频繁在头部和尾部添加或删除元素,则deque是最好的选择。2.list如果元素较大(如大的类对象),数量预先不知道,或是程序运行过程中频繁变化,对元素的访问更多是顺序访问全部或很多元素,则list很适合。3.mapmap 很适合对一些对象按它们的...原创 2022-05-02 09:56:17 · 1107 阅读 · 0 评论 -
stl容器之泛型算法--count、accumulate、equal、fill_n、copy、reserve
泛型算法不会直接调用容器的操作,而是通过迭代器来访问、修改、移动元素。1.count统计某容器内某元素出现次数。第一个参数迭代器为统计的起始地址,第二个参数迭代器为结束地址,第三个指针为被统计元素。eg: count (vi.begin() , vi.end() , val) //vi为vectorcount ( ls.begin(), ls.end() , word) //ls为list2.accumulate求某容器内指定范围内元素之和。Accumulate的前两个参数仍然是指定原创 2022-04-28 10:58:28 · 162 阅读 · 0 评论 -
find_first_of和find_first_not_of
find_first_of:在字符串中查找给定字符集合中任一字符首次出现的位置。若查找数字字符,则“给定字符集合”应包含所有10个数字;若查找字母,则要包含所有大小写字母——abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOQRSTUVWXYZ。代码示例:#include<iostream>#include<string>using namespace std;void find_char(string &...原创 2022-04-27 17:42:42 · 1030 阅读 · 0 评论 -
从一个 list<int> or vector<int>初始化一个vector<double>
分析:由于list<int>与vector<double>是不同的容器类型,因此无法采用容器拷贝初始化方式。但前者的元素类型是int,与后者的元素类型double是相容的,因此可以采用范围初始化方式来构造一个vector<double>,令它的元素值与list<int>完全相同。vector<int>与之类似!代码分析与实现: #include<iostream> #include<vector> #inclu原创 2022-04-26 18:21:55 · 741 阅读 · 0 评论 -
委托构造函数
委托构造函数使用它所属类的其他构造函数执行它自己的初始化过程,或者说它把它自己的一些或全部职责委托给了其他构造函数。程序先执行受委托构造函数,然后才执行委托构造函数本身的语句。#include<iostream>#include<string>using namespace std;class Sales_data{ friend std::istream &read(std::istream &is,Sales_data &i...原创 2022-04-24 16:37:17 · 1274 阅读 · 0 评论 -
指针与对象的一些注意事项
定义一对类X和Y,其中X包含一个指向Y的指针,而Y包含一个类型为X的对象。正确代码:class X; //声明X class Y{ //定义类型Y X* x;};class X{ //定义类型X Y y;};错误代码:class Y; //声明X class X{ //定义类型X Y y;};class Y{ //定义类型Y X* x;};代码说明:类X的声明称为前向声明,它向程序中引入了名字X并且指明X是一种类类型。对于类型X来说,此原创 2022-04-22 10:56:48 · 161 阅读 · 0 评论