![](https://img-blog.csdnimg.cn/20190927151117521.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
c\c++
c\c++的基础知识
王大碗Dw
志不强者智不达
成为自己小时候想象的样子!
展开
-
为什么GetProcAddress返回值总为0?[解决方案]
相信很多人在显式调用dll中函数的时候,会遇到相同的问题:就是我们loadlibrary成功后,明明调用的函数也是正确的,但是GetProcAddress的地址总是为0!不能获得正确的函数地址。出错示例我们先来看我这次出错的示例:DLL部分__declspec(dllexport) BOOL xxxxxxx();xxxxxx(){ xxxxxxx;}exe调用dll部分 HMODULE hInst; hInst = LoadLibrary(L"Dll1.dll"); if (NU原创 2021-04-09 15:08:15 · 4100 阅读 · 0 评论 -
模板坏处竟然这么大?如何避免
模板的缺点:不当地使用模板会导致代码膨胀,即二进制代码臃肿而松散,会严重影响程序的运行效率。如何避免:把C++模板中与参数无关的代码分离出来。原创 2021-04-07 20:16:51 · 331 阅读 · 0 评论 -
#pragma once保证头文件只被编译一次
用VS编程的时候,经常会在头文件中加一个#pragma once,但是之前不太明白他的作用,本篇文章用做学习记录。#pragma once#pragma once是一个比较常用的C/C++杂注,只要在头文件的最开始加入这条杂注,就能够保证头文件只被编译一次。注意:#pragma once是编译器相关的,有的编译器支持,有的编译器不支持,具体情况请查看编译器API文档,不过现在大部分编译器都有这个杂注了。具体写法:#pragma once... ... // 一些声明语句第二种保证头文件只能原创 2021-04-06 22:55:08 · 893 阅读 · 0 评论 -
STL初学者入门笔记05函数模板实例对char和int数组进行排序
首先顶一个打印函数模板template<class T>void PrintArray(T *arr, int len){ for (int i = 0; i < len; i++) { cout << arr[i] << " "; } cout << endl;}定义排序函数模板template<class T>void MySort(T *arr, int len){ for (int i = 0; i &原创 2021-04-05 12:05:27 · 236 阅读 · 0 评论 -
STL初学者入门笔记04类模板
我们的模板不止可以定义函数,还可以定义类!关于函数模板我们在之前的几篇文章已经涉及过了,本文开始类模板的学习。关键字类模板的一般定义模板template<class T>class Person{public:private:}类模板和函数模板的区别函数模板在调用的时候可以自动类型推导类模板必须显式指定类型例如:定义一个Person类template<class T>class Person{public: Person(T id,T age)原创 2021-04-05 11:36:04 · 152 阅读 · 0 评论 -
STL初学者入门笔记03模板函数实现原理剖析
需要理解编译过程!总结:事实上C++对函数模板进行了两次编译,第一次编译仅仅生成一个函数头,第二次编译则是在函数调用时根据模板的类型参数列表具体的实现这个模板对应的类型的函数实例,注意这里是根据类型参数列表来实现,而不是根据调用次数。这不是和没有使用模板,直接写两个函数一样么?没错就是一样的,只是C++将这个工作交从程序员手里移交给了编译器来做。转载 2021-04-05 11:21:44 · 232 阅读 · 0 评论 -
STL初学者入门笔记02函数模板和普通函数的区别
02函数模板和普通函数的区别综述函数模板和普通函数的区别?函数模板和普通函数在一起调用规则:代码示例说明综述函数模板和普通函数的区别? 函数模板不允许自动类型转化 普通函数能够自动进行类型转化函数模板和普通函数在一起调用规则: 函数模板可以想普通函数那样可以被重载 c++编译器优先考虑普通函数 如果函数模板可以产生一个更好的匹配,那么选择模板 可以通过空模板实参列表的语法限定编译器只能通过模板匹配代码示例说明定义函数模板和普通函数template<class T&g原创 2021-04-04 23:54:41 · 202 阅读 · 0 评论 -
STL初学者入门笔记01模板
stl是c++编程中非常重要的一个内容,之前这方面基础薄弱,后面学习工作中,将时常与stl打交道,所以在这里将stl从基础开始重新学习一遍!01模板概述模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。模板是一种对类型进行参数化的工具;通常有两种形式:函数模板和类模板;1.函数模板针对仅参数类型不同的函数;2.类模板针对仅数据成员和成员函数类型不同的类。为什么有模板?使用模板的目的就是能够让原创 2021-04-04 23:34:13 · 387 阅读 · 0 评论 -
面试常考之二叉排序树(二叉查找树)[c++源码]
题目:用C++实现一个二叉排序树,完成创建、插入节点、删除节点、查找结点等功能什么是二叉查找树?二叉排序树要么是空二叉树,要么具有如下特点:二叉排序树中,如果其根结点有左子树,那么左子树上所有结点的值都小于根结点的值;二叉排序树中,如果其根结点有右子树,那么右子树上所有结点的值都大小根结点的值;二叉排序树的左右子树也要求都是二叉排序树;代码实现:class Node{public: int data; //数据 Node *parent;//父亲节点 Node *left;原创 2021-03-21 23:14:47 · 182 阅读 · 0 评论 -
面试常考的c++实现单链表的各种操作(附c++代码)
单链表是笔试或者面试中常考的题型,常考的考点一般是:1.单链表的建立2.单链表的测长3.单链表的打印4.单链表节点的查找5.单链表节点的插入6.单链表节点的删除7.单链表的逆置8.寻找单链表的中间元素9.判断是否存在循环链表代码实现1.单链表的建立typedef struct node{ int data;//节点内容 node *next;//下一个节点}node;node *SingleLinkCreate(){ int i = 0; node *head原创 2021-03-21 21:15:26 · 250 阅读 · 0 评论 -
剑指offer-30-包含 min 函数的栈
题目:包含 min 函数的栈定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。解题步骤要求:一个有min函数的栈。注意:时间复杂度为O(1)。方法:辅助栈法。栈A正常入栈出栈,新设一个栈B来存放入A栈最小元素的子列。这样取最小值的时候,直接取B.top()即可。入栈:当有元素入栈的时候,先将元素放入A的栈顶,然后与B的栈顶元素比较,若比B的栈顶元素小或相等(非严格降序),再将元素放入B的栈顶原创 2021-03-07 22:52:34 · 90 阅读 · 2 评论 -
剑指offer-09-用两个栈实现队列[c++实现]
题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )题目解读:要求:使用俩个栈模拟队列栈是先进后出的,我们使用俩个栈,其中栈A入栈,先进后出地将元素装入栈B,那么此时栈B中的元素就是逆序的,然后栈B中的元素出栈元素,先进后出,相当于将A中的元素实现了先进先出。例如元素进入顺序 :123456A栈中元素顺序:123456;原创 2021-03-07 16:34:00 · 94 阅读 · 0 评论 -
剑指offer-06-从尾到头打印链表
题目输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输入:head = [1,3,2] 输出:[2,3,1]限制:0 <= 链表长度 <= 10000解题过程遇到的问题:1.如何找到链表的尾节点?2.如何知道链表的长度?题解:1.递推法:利用递归,先递推至链表末端;回溯时,依次将节点值加入列表,即可实现链表值的倒序输出。复杂度分析:时间复杂度 O(N)O(N): 遍历链表,递归 NN 次。空间复杂度 O(N)O(N): 系统递归需要使原创 2021-03-07 12:00:27 · 110 阅读 · 0 评论 -
《剑指offer》05 替换空格
开始刷算法题,记录并监督自己刷题题目:替换空格请实现一个函数,把字符串 s 中的每个空格替换成"%20"示例 1:输入:s = “We are happy.” 输出:“We%20are%20happy.”刷题过程:因为对string类的不熟悉,在字符串长度上使用了sizeof(s),但实际上求string类的长度,我们可以使用s.size()和s.length()。并且忘记了string可以当成字符串数组,错误地使用了地址,比较麻烦。题解:class Solution {publ原创 2021-03-07 11:07:18 · 64 阅读 · 0 评论 -
从汇编角度看++i和i++
对于初学C\C++的同学来说,一般来说,都会遇见一个问题:那就是++i和i++到底有什么区别?今天我们就从汇编角度看一下他们俩的区别:i++:int i = 0;i++;++i:int i = 0;++i;我们发现从汇编角度来说,似乎++i和i++,没有区别,都是先将数取出来赋值给eax,然后进行加1运算,再将eax里的值赋值给i。这时候,我们换一种方式++i:int i = 0; int j; j=++i;i++:int i = 0;int j;j=i++;原创 2020-05-16 17:35:02 · 475 阅读 · 0 评论 -
虚函数:构造函数为什么不能为虚函数,析构函数为什么必须是虚函数
1.从存储空间角度2.从使用角度原创 2020-04-01 00:11:54 · 433 阅读 · 0 评论 -
虚函数:虚函数是如何实现动态绑定的
在复习c++的过程中,重点看了虚函数的内容,以前学习的时候不求甚解,如今重新学习,才更加深刻地理解了其中缘由,所谓“温故而知新”。首先虚函数是在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数。是实现动态多态的一种方法。那么虚函数是如何实现动态的呢?首先要了解虚函数是如何实现的,简单的说,虚函数是通过虚函数表来实现的。每一个含有虚函数的类,都会有一个虚函数...原创 2020-03-22 20:08:40 · 2482 阅读 · 0 评论