奇异递归模板模式(curiously recurring template pattern,CRTP)是C++模板编程时的一种常见的做法,即把派生类作为基类的模板参数。 一般的形式为 template <class T> struct Base { void interface() { // ... static_cast<T*>(this)->implementation(); // ... } static void static_func() { // ... T::static…

2023年2月12日 0条评论 653点热度 0人点赞 icebmji 阅读全文

条款01:视C++为一个语言联邦 C++是一种多重范型编程语言,同时支持过程形式,面向对象形式,函数形式,泛型形式,元编程形式的编程方式 C++主要有四种编程风格 C: 以区块、语句、预处理器、内置类型、数组、指针等为主 C with class: 围绕构造函数、析构函数、封装、继承、多态、动态绑定等概念展开 Template C++: 模板以及模板元编程范型 STL: 协调容器、迭代器、算法及函数对象的模板库 C++高效编程规则取决于你使用C++哪一部分 条款02:尽量以const,enum,inline替换 #…

2018年12月17日 0条评论 2006点热度 0人点赞 icebmji 阅读全文

#pragma comment。将一个注释记录放置到对象文件或可执行文件中。 #pragma pack。用来改变编译器的字节对齐方式。 #pragma code_seg。它能够设置程序中的函数在obj文件中所在的代码段。如果未指定参数,函数将放置在默认代码段.text中 #pragma once。保证所在文件只会被包含一次,它是基于磁盘文件的,而#ifndef则是基于宏的。 文件指针指向的是一块内存区域,这块区域存储着打开的文件的相关信息,包括文件读取指针当前位置、文件读取缓冲区大小等信息,并不是指向文件的。fsc…

2018年1月11日 0条评论 1756点热度 0人点赞 icebmji 阅读全文

在计算机科学中, 调用约定是一种定义子过程从调用处接受参数以及返回结果的方法的约定。不同调用约定的区别在于: 参数和返回值放置的位置(在寄存器中;在调用栈中;两者混合) 参数传递的顺序(或者单个参数不同部分的顺序) 调用前设置和调用后清理的工作,在调用者和被调用者之间如何分配 被调用者可以直接使用哪一个寄存器有时也包括在内。(否则的话被当成ABI的细节) 哪一个寄存器被当作volatile的或者非volatile的,并且如果是volatile的,不需要被调用者恢复 _cdcel是C/C++默认的函数调用约定 函数实…

2018年1月10日 0条评论 3176点热度 0人点赞 icebmji 阅读全文

[toc] 转载地址:http://www.runoob.com/cplusplus/cpp-storage-classes.html C++ 存储类 存储类定义 C++ 程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。下面列出 C++ 程序中可用的存储类: auto register static extern mutable thread_local (C++11) 从 C++ 11 开始,auto 关键字不再是 C++ 存储类说明符,且 register 关键字被弃用。 au…

2018年1月4日 0条评论 2813点热度 0人点赞 icebmji 阅读全文

重载 在同一个作用域内 函数名相同 参数不同,可以是数量或类型 其他因素:  virtual、static不影响重载 返回值类型不同不影响重载 部分函数类型限定符,如写在成员函数参数列表后的const,影响重载 示例: class A { public: void f(int) {} void f(float) {} void f(int) const {} void f(int, int) {} //int f(int){} //virtual void f(int) {} }; 覆盖 不在同一作用域,即分别位于…

2018年1月3日 0条评论 3012点热度 0人点赞 icebmji 阅读全文

预处理器是一些指令,指示编译器在实际编译之前所需完成的预处理。所有的预处理器指令都是以井号(#)开头,只有空格字符可以出现在预处理指令之前。预处理指令不是 C++ 语句,所以它们不会以分号(;)结尾。 预处理一般过程: 宏定义处理 #define 条件编译 #if 头文件包含 #include 其它,如:#pragma  #line #error等 在编译器加参数"/P",预处理将会将宏替换后的源代码输出到一个".i"文件中,不会在生成".obj"

2018年1月3日 0条评论 2104点热度 0人点赞 icebmji 阅读全文

C++new操作符带不带括号区别 https://www.zhihu.com/question/35843839 类的空指针的成员函数调用 #include using namespace std; class A{ public: void test() { printf("test A"); } }; int main(){ A* pA = NULL; pA->test(); return 0; } 上面的程序是合法的,C++在编译期间,就找到了pA的函数,发现test非虚函数,并且在其中没有对this指…

2017年12月8日 0条评论 3019点热度 0人点赞 icebmji 阅读全文

第一章-开始 默认情况下cerr的数据不缓冲,直接输出,所以也无法重定向(p23) clog和cout的数据是会缓冲的(p23) 第二章-变量和基本类型 C++基本数据类型有:算数类型和空类型(p30) 长度问题:书上写的都是为最小尺寸,一般VC的int为32位,long也为32位(p30) 一个表达式中既有无符号数又有有符号数,通常将有符合数转化为无符号数(p34) 以0(零)开头的整数代表8进制,0x开头的整数代表16进制(p35) 字符串字面值的实际长度通常比它的内容多1,如果两个字符串字面值位置紧邻,且仅有…

2017年11月24日 0条评论 8395点热度 0人点赞 icebmji 阅读全文

const的作用是使对象至少在运行期间是常量 首先const并非只有两层,如:const int *const*const*const p=nullptr;其实也无需多的抠概念只要知道哪个const修饰的是哪个对象,它的作用是什么,自然就知道很清楚了 1. 永远从右往左读一个变量声明。 2. const永远修饰const出现地点左边的声明类型。 3. 如果左边没有声明类型,就修饰右边。 举例:const int * const p=nullptr; 红const修饰int * 即p是常量,蓝const 修饰int …

2017年10月7日 0条评论 2499点热度 0人点赞 icebmji 阅读全文
12