摘要:在C++中,有仿函数Functor的概念,首先要明白,它叫做仿函数,就说明它本身肯定不是一个函数 => 事实上,它是一个类的对象,但是可以像函数一样来进行调用 怎么来理解这句话呢 “仿函数是一个类的对象,但是它可以像函数一样来进行调用”? 是这样的 => 本质是在这个类里面实现一个operator(
阅读全文
摘要:constexpr是C++11引入的关键字,这个关键字用于指明其后面是一个常量,编译器在编译程序时会将其结果计算出来,而无需等到程序运行阶段,这样的优化极大的提高了程序的运行效率 我们知道,C++程序的执行过程,大概需要经历 编译,链接,运行这3个阶段. 这里值得特别关注的是,常量表达式和非常量表达
阅读全文
摘要:在C++中有左值和右值:左值和右值其实是C语言中的概念,但是C标准中并没有给出严格的区分方法。普遍的认为是, 放在=左边的,或者能够取地址的,我们称为左值。只能放在=右边的,或者不能取地址的,称为右值. 但有时候这个判断标准也不一定准确。 C++11中,左值和右值的区分标准: 1. 普通类型的变量,
阅读全文
摘要:C++中传递参数是指针时,在函数内部,其实是会复制一份新的指针,只不过这两个指针指向的是同一块内存地址 首先我们要明白一点,在C++传递参数时,不论是传入指针还是传入值,传入函数后都会在函数内部创建一个副本 => 也就是说,传入前的指针或是值不会变. 但是指针有个点就是,函数内部的这个指针副本,和外
阅读全文
摘要:在看公司代码时,看到使用GetTickCount()函数
阅读全文
摘要:在看代码时,发现很多CALLBACK函数,所以仔细研究了一下C++中的CALLBACK函数 首先,我们来理解一下,什么是C++中的CALLBACK函数 => 凡是由你设计,但是由Windows操作系统调用的函数,我们把它统称为CALLBACK函数,这些函数都有一定的类型,以方便配合Windows的调
阅读全文
摘要:悬挂指针(Dangling Pointer), 指的是一个指针它指向已经释放的内存或者无效的内存。当指针指向的内存被释放,这个指针仍然保留着指向之前内存地址的数值,但该地址中的数据已经无效或者被其他数据覆盖 比如一个指针 *Ptr, 它最初指向了一块内存,现在这块内存被释放了,或者这块内存被释放后重
阅读全文
摘要:在C++中,有4种方法可以产生一个对象. 第一种方法是在堆栈 (stack) 之中产生它: void TestFunc() { CUser user; //在堆栈 (stack) 中产生user对象 } 第二种方法是在堆积 (heap) 之中产生它: void TestFunc() { CUser*
阅读全文
摘要:在看代码时,发现有时候会把string类型转换为LPCTSTR, 刚开始不理解为什么要做这个转换,所以做了一些调查,现在记录如下 是这样的,STRING是代表C++中的字符串string, 而LPCTSTR代表的是Windows系统中的字符串类型。 也就是说,这样转换的目的是为了把C++中的字符串s
阅读全文
摘要:在上面一篇博客中 https://www.cnblogs.com/wphl-27/p/18111083,提到了虚函数,纯虚函数 这篇博客我想继续进一步来说一下虚函数和虚函数表 在C++中,每一个含有虚函数的类,编译器都会为它啊做出一个虚函数表(通常叫做 vtable), 这个虚函数表里面的每个元素都
阅读全文
摘要:在看深入浅出MFC这本书时,谈到了C++中基类指针指向派生类对象的情况. 先说结论: 如果你以一个【基类之指针】指向派生类对象, 那么经由该指针(这个基类指针)只能够调用基类中所定义的函数,而不能调用派生类中定义而基类中不存在的函数 我们来看个例子 #include <string.h>class
阅读全文
摘要:C,C++中有函数调用约定的这种说法,什么是函数调用约定呢? =》 函数调用约定主要约束了两件事情: 1. 参数传递的顺序 2. 调用堆栈由哪一方来进行清理 (调用函数还是被调用函数)来进行清理 __stdcall就是函数调用约定中的一种,__stdcall来表示: 第1点: 函数的参数是从右向左压
阅读全文
摘要:在看C++代码时,发现有的代码是这样写的 void SetID(const int &val) { } 我们可以看到这个SetID函数,它的形参就是常量引用类型 const 修饰符 => 表明这个形参变量 val 不能在SetID内部被修改 & 修饰符 => 表明这个变量传递的是引用, 这个我们知道
阅读全文
摘要:C++中的static关键字用来修饰静态成员变量和静态成员函数, static定义的类的静态成员(成员变量和成员函数) ,它会有一块单独的存储区。 当我们把这个类实例化时,会为类实例化的对象来分配空间,显然此时给对象分配的内存空间不包括静态成员所占的空间。 特别要注意,静态成员变量必须在类中声明,在
阅读全文
摘要:malloc => memory allocation, 中文名为 动态内存分配。 具体我们来解释一下: 这个函数的原型为 extern void *malloc(unsigned int num_bytes); 分配长度为 num_bytes字节的内存块 返回值: 如果内存分配成功会返回一个voi
阅读全文
摘要:我们来看看typede和define的区别 define是C++中用来定义宏的,也就是宏定义用的,宏在代码中就是纯粹进行简单的替换,这个替换过程不是在C++的编译过程中进行的,而是在这之前的预处理过程中就已经完成了. 因为它不是在编译过程中进行,所以如果有潜在的错误,很难发现. typedef 说白
阅读全文
摘要:这两个概念有点绕口,我们来仔细解释一下 常量指针 => 顾名思义,这个指针是常量,也就说这个指针本身不可以更改 (但指针指向的值是可以更改的) 指针常量 => 指针指向的值是个常量,指的是指针指向的值不能更改 比如 const char *p => const修饰的是*p, 所以*p代表指针p指向的
阅读全文
摘要:C++中的函数指针是一个非常灵活的东西,刚开始接触这个概念时,有点难以理解。看了几篇文章介绍后,想在这里做个总结 首先,我们要明白,在C++中,函数是有地址的。在C++中,可以用函数名来表示函数的地址,也可以在函数名之前加上取地址符合“&”来表示函数地址 比如 下面是一个函数 int add(int
阅读全文
摘要:C++中有一种数据结构-红黑树, 在C++的STL中有一种数据结构map,它就是基于红黑树来实现的 红黑树,是一种二叉搜索树,但是它的每个节点都有颜色,并且只有红和黑两种颜色。所以每个节点上都有一个存储位来表示节点的颜色,可以是Red和Black. 红黑树有一个很大的特点: 它能够确保没有任何一条路
阅读全文
摘要:在数据结构中,有一种是"线性结构", 这种数据结构("线性结构")包括数组,单向链表,双向链表,以及栈和队列 今天,我们主要是来演示一下,如何在C++中实现双向链表 1 #ifndef DOUBLE_LINK_HXX 2 #define DOUBLE_LINK_HXX
阅读全文