
C++知识点
文章平均质量分 61
Virtual_Func
小风扇吹风好吵
展开
-
C++ 'include' 的两个头文件互相包含出错
头文件保护符通常,现在写代码时都会随手在头文件中加入头文件保护符。有以下两种形式的保护符。#ifndef ABCDE#define ABCDE//..... 内容#endif#pragma once两种模式的作用是相同的,都是只让头文件在解析过程中只会展开一次。能工作的循环包含情况今天遇到的问题是循环包含问题,也就是说如下例子//a.h#pragma onc原创 2017-03-06 12:53:54 · 7738 阅读 · 3 评论 -
malloc 与 alloca 与 calloc 的区别
C语言跟内存分配方式(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。(3)从堆上分配,亦称动态内存分配。程序在运行的时候转载 2015-10-25 19:52:18 · 1479 阅读 · 0 评论 -
SGI 计算幂次方的精简计算方法
通常,我们需要计算 X 的 n 次方的最简单的计算方法如下:int power(int x,int n){ int result = 1; while(n--) { result *= x; } return result;}上述程序的时间复杂度为 O(n),即需要计算 n 次方,则需要执行 n 次循环。但 SGI 的 STL 中使用了一种巧妙的方法将进入循环的次数降到原创 2015-10-25 16:19:32 · 2496 阅读 · 0 评论 -
C++中 0 与 NULL 与 nullptr之间的关系,nullptr_t 的实现
参考了网上各种资料,理清楚了 0 与 NULL 以及 nullptr 的关系。1.从本质上 1) 0是int型的字面值常量 2) NULL 是预处理变量,定义在 cstdlib 中,其值是0 3) nullptr 是 nullptr_t 类型的字面值。2.cstdlib 中 NULL 的定义 #ifdef __cplusplus #define NULL 0原创 2015-11-10 11:40:46 · 1424 阅读 · 3 评论 -
字面值常量的知识点
1.每个字面值常量都是有类型的整型字面值常量:在没有指定时,整型字面值常量的类型是 int ,long,longlong 中能存储的最小尺寸。(short 类型没有对应的字面值)浮点型字面值常量:在没有指定时,默认是 double 类型字符串字面值常量:类型为 char[n] *... 其中每个字面值常量的类型都是可以通过加前缀或后缀进行指定2.字符串字面值串接在C原创 2015-11-10 11:56:21 · 821 阅读 · 0 评论 -
关于引用与指针,引用的实现
对引用的理解首先是根据《C++ primre》第五版中的解释,其次是我个人根据网上的资料,对C++实现引用本质的理解。下面分为两部分,首先理解引用体现出来的性质,其次是关于引用的具体实现。1.引用具体表现行为a.引用的定义:“引用为对象起了另外一个名字,引用类型将引用另外一种类型”—— 《C++ primer》5也就是说引用本身不是一个对象,而是其初始值的一个别名。b.引用的行原创 2015-11-10 11:04:41 · 860 阅读 · 0 评论 -
仿函数存在的原因
我们知道仿函数是仅重载了括号操作符,且定义了若干相应型别的类。仿函数存在的意义,是为了能提取出仿函数中定义的相应型别,使仿函数能与函数适配器进行配接,而这些相应型别则主要是用来表现函数参数类型与传回值类型。函数指针因为没有相应型别而不能与STL 中别的组件进行搭配。因此,仿函数的相应型别是一个很重要的因子。STL 中定义了两个类,分别代表一元仿函数和二元仿函数,其中没有任何数据成员或函数成原创 2015-11-08 23:21:31 · 1099 阅读 · 0 评论 -
vector中不能存放引用类型!!!!!!!!
关于 vector 中不能存放引用,这是一个在初始C++时候就应该知道的问题,但是我居然没注意,还好及时发现了。《C++ primer》上说 vector 中不能存放引用的原因是:引用不支持一般意义上的赋值操作,而 vector中元素的两个要求是:1.元素必须能赋值2.元素必须能复制int a = 1;int c = 2;int & b = a;b = c;原创 2015-11-08 23:06:20 · 14221 阅读 · 0 评论 -
"extern C"关键字的作用
extern "C" 关键字用来声明或定义一个C的符号。也即是说,C++编译器会将在 extern "C" 的大括号内部的代码当做C语言代码处理。则C++的名称修饰机制将不会起作用,此时,在Visual C++ 平台下,会将C语言的符号进行修饰,即在函数名前加下划线。而Linux版本的GCC编译器将不会对函数名做任何修饰。作用举例:很多时候我们会碰到有些头文件声明了一些C的原创 2015-09-18 21:49:49 · 722 阅读 · 0 评论 -
关于类的前向声明
前向声明的定义:有些时候我们可以声明一些类但是并不去定义它,当然这个类的作用也很有限了。比如class foo;声明一个foo类,这个声明,有时候也叫做前向声明(forward declaration),在声明完这个foo类之后,定义完这个foo类之前的时期,foo类是一个不完全的类型(incomplete type),也就是说foo类是一个类型,但是这个类型的一些性质(比如包含哪转载 2015-11-11 22:59:32 · 461 阅读 · 0 评论 -
using声明与using指示的区别(在作用域上)
在《C++ Primer》第五版十八章中详细描述了 using 指示与 Using 声明的区别,个人也想了好久。首先,明确一下 using 声明与指示using 声明: using std::cout;using 指示: using namespace std;1.初步展示区别在我们通常的理解下,using 声明引入了一个名字,在声明之后的作用域中,所有用到该名字的地方,都是指的改原创 2015-11-13 12:41:50 · 2906 阅读 · 2 评论 -
详解RVO与NRVO(区别于网上常见的RVO)
一直以来对 RVO 与 NRVO 以及编译器的优化操作之间的关系都不太分得清。这一次想了两天,查看了若干资料以后,总算弄清楚了。1.RVO(Return Value Optimization)先来看一下维基百科上对RVO(return value optimization) 的定义:"Return value optimization, or simply RVO, is原创 2015-09-24 13:29:48 · 12911 阅读 · 0 评论 -
C++11 新接口 实现线程池类
class Job{protected: int i;public: Job(int c) :i(c) {} virtual void doJob() { printf("job : %d\n", i);}};class ThreadPool{ vector pool;public: ThreadPool(int n):close(false), max_num(n)原创 2016-09-13 16:16:06 · 782 阅读 · 0 评论 -
error C2683: “dynamic_cast”:“XXX”不是多态类型。dynamic_cast与虚函数
是的是的,使用dynamic_cast会引发效率上的担忧,但是有时候这是必要的,而有时候,这是必须的,在自己不预加运行时识别策略的时候,如果要使用运行时处理机制,通过dynamic_cast判断指针或检测异常是一个非常直观的想法,而且不少时候这也很有效。但对dynamic_cast理解不够深入会遇到这样的麻烦:class Bast{};class Test转载 2016-02-21 17:41:11 · 2248 阅读 · 0 评论 -
关于指针与类的内存分布问题(问题思考来自《程序员面试宝典》)
引起思考的例子:class A{public: int a_1,a_2; A() :a_1(1),a_2(2){} void func() { cout << a_1 << endl; cout << a_2 << endl; }};class B {public: int b; B() :b(3){} void func() { cout <<原创 2016-03-29 14:57:14 · 613 阅读 · 0 评论 -
哪些函数不能被声明为虚函数
常见的不不能声明为虚函数的有:普通函数(非成员函数);静态成员函数;内联成员函数;构造函数;友元函数。1.为什么C++不支持普通函数为虚函数?普通函数(非成员函数)只能被overload,不能被override,声明为虚函数也没有什么意思,因此编译器会在编译时邦定函数。2.为什么C++不支持构造函数为虚函数?这个原因很简单,主要是从语义上考虑,所以不支持。因为构造函转载 2016-01-13 10:37:25 · 1091 阅读 · 0 评论 -
在C++中调用Python接口
参照如下博客可以看看写好的cpp 在G++中怎么编译:http://blog.youkuaiyun.com/taiyang1987912/article/details/44779719参考如下博客可以看看怎么在VS的项目中配置调用python接口http://blog.youkuaiyun.com/c_cyoxi/article/details/23978007参考如下地址可以解决VS中没有Pyth原创 2015-12-05 21:04:41 · 2270 阅读 · 0 评论 -
犯过的C++错误: vector::swap()函数
在知乎上看到一个问题,问一下代码为什么错://...vector x;//....x.swap(vector(x)); //错误出现的地方我的错误解答是:因为 vector(x) 产生了一个临时对象,将该临时对象与 X 进行 swap 操作,交换了对方的三个指针(first,end,finish),指向分配的内存空间,然后再该语句结束后,临时对象被释放掉,所以此时 x原创 2015-11-01 16:51:08 · 6579 阅读 · 0 评论 -
sizeof问题
下面仅为个人理解,编译器中验证外,没有任何理论依靠,若有错误请指出。 首先,sizeof是一个关键字并不是一个函数。或许你有疑问,既然是一个关键字,为什么出现sizeof的时候后面操作对象都加上括号哪?原因如下。1. sizeof int ,结果为4,说明 sizeof说明他不是一个函数。2.siezof(int )是关键字,为什么分开标记,转载 2015-11-18 10:01:16 · 470 阅读 · 0 评论 -
静态成员函数的作用与静态数据成员的初始化
静态数据成员与静态函数成员都是同一个类的所有对象共享的成员。补充以下两个个知识点:静态数据成员的初始化:静态数据成员的初始化必须在类定义外进行。静态函数成员的作用:静态函数成员与普通函数成员一样,在ELF 文件中都只会保留一份copy,它们的区别体现在:静态成员函数可以在不定义对象的情况下直接调用,而非静态成员函数不行。class X{public: void f1(){原创 2015-09-26 10:03:50 · 1088 阅读 · 0 评论 -
关于模板类中模板成员函数在类定义外部特化报错,错为声明与定义不匹配
今天写STL中 rb_tree 的时候意外的发现一个问题:模板类的模板成员函数不能在类定义外部进行特化,特化必须放在类定义内,否则将报错:error C2244: “X::test”: 无法将函数定义与现有的声明匹配经过写如下的简单代码可以看出问题所在:(错误版本)//定义模板类X。其中拥有模板成员 testtemplate class X{public: X(){}原创 2015-10-17 11:45:11 · 4320 阅读 · 0 评论 -
#pragma unroll的用法
#pragma宏命令主要是改变编译器的编译行为,其他的参数网上资料比较多,我只想简单说下#pragma unroll的用法,因为网上的资料比较少,而且说的比较笼统,请看下面的一段代码int main(){int a[100];#pragma unroll 4for(int i=0;i{a[i]=i;} return 0转载 2015-10-17 15:26:12 · 2357 阅读 · 0 评论 -
C ++ 函数后面加throw()的作用
Following declaration gives a message to the user of your class: my method doesn't throw any exception. Don't bother to put a try/catch block around itwhen you use it.void A::foo() throw();转载 2015-09-09 09:07:35 · 1615 阅读 · 0 评论 -
关于 ::operator new
文章转自:http://blog.youkuaiyun.com/solstice/article/details/6198937 本文只考虑 Linux x86 平台,服务端开发(不考虑 Windows 的跨 DLL 内存分配释放问题)。本文假定读者知道 ::operator new() 和 ::operator delete() 是干什么的,与通常用的 new/delete 表达转载 2015-09-09 11:13:49 · 650 阅读 · 0 评论 -
c++中的set_new_handler和new_handler
详细可参考 《effective c++》第三版 条款49:了解new_handler的行为相关链接:http://blogold.chinaunix.net/u/3374/showart_1849816.html 当operator new申请一个内存失败的时候,它会进行如下的处理步骤: 1、如果存在客户指定的处理函数,则调用处理函数(new_han转载 2015-09-09 09:01:22 · 409 阅读 · 0 评论 -
C++ 内存分配(new,operator new)详解
本文主要讲述C++ new运算符和operator new, placement new之间的种种关联,new的底层实现,以及operator new的重载和一些在内存池,STL中的应用。一 new运算符和operator new(): new:指我们在C++里通常用到的运算符,比如A* a = new A; 对于new来说,有new和::new之分,前者位于std转载 2015-09-09 12:31:06 · 555 阅读 · 0 评论 -
一些不常见的C++关键字
学过程序语言的人相信对关键字并不陌生。偶然间翻起了《C++ Primer》这本书,书中列举了所有C++的关键字。我认真核对了一下,竟然发现有若干个从未使用过的关键字。一时间对一个学了六年C++的自己狠狠鄙视了一番,下决心一定要把它们搞明白!图1红色字体给出的是我个人感觉一般大家都会比较陌生的关键字,下边我们逐个学习。图1 C++ 关键字一、typeid从名字直观看来,该关键字应转载 2015-09-02 17:41:46 · 673 阅读 · 0 评论 -
关于位域的知识
位域有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字转载 2015-08-16 21:59:32 · 489 阅读 · 0 评论 -
static 关键字的作用
C程序一直由下列部分组成: 1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令; 2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。 3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。 4)栈——增长方向:自顶向下增长;自动变量以及转载 2015-08-16 16:24:21 · 673 阅读 · 0 评论 -
如何禁止一个类被继承?
当我们想将一个类设置为禁止继承时该用什么方式?有两种解决方案。提示:虚继承与友元!!Way1:强行将该类的构造函数与析构函数均设为 private,并设定该类的一个友元函数来构建该类对象,并返回指针。此时继承自该类的类将无法调用该类的构造函数,因此将在编译时报错 • 缺点:将类的使用变得与普通类不兼容,不能在友元函数外定义类对象,用户定义该类必须知道友元函数 • 优点:简单易理解Eg原创 2015-07-23 18:09:53 · 2206 阅读 · 0 评论 -
C语言实现变长数组
struct MyData { int nLen; char data[0];}; 开始没有理解红色部分的内容,上网搜索下,发现用处很大,记录下来。 在结构中,data是一个数组名;但该数组没有元素;该数组的真实地址紧随结构体MyData之后,而这个地址就是结构体后面数据的地址(如果给这个结构体分配的内容大于转载 2015-09-26 11:47:40 · 4385 阅读 · 0 评论 -
模板的模板参数匹配报错问题
今天写一个模板类,使用了模板的模板参数,在实例化类对象时,报错:1. 在VS2013中错误编码为:error C3201: 类模板“std::vector”的模板参数列表与模板参数“CONT”的模板参数列表不匹配 2. 在G++中错误信息为: error: type/value mismatch at argument 2 in template parameter list for ‘templ原创 2015-09-06 17:35:49 · 7239 阅读 · 1 评论 -
关于auto_ptr_ref的一点问题
今天我在看 The C++ Standard Library 的时候,总觉的上面讲的关于auto_ptr_ref的问题没有说清楚,查了网上的资料发现也没有说清。 也许还有很多朋友像我一样对此存在疑问。其实,这个问题有没有弄清楚,对实际编程影像并不大,但是本着“勿在浮沙筑高台”的精神,我用了一个晚上的时间,来个彻底的大调查,终于基本上弄明白了其中的道理。(大多数时间都浪费在VC上,因为 VC支持对右转载 2015-09-12 09:51:51 · 465 阅读 · 0 评论 -
c++关键字 mutable
mutable的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。 在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。 我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的函数里面转载 2015-10-17 16:18:08 · 688 阅读 · 0 评论 -
sizeif(i++).sizeof(++i) 的问题
考虑以下代码:int i = 3;int j = sizeof(++i);int k = sizeof(i++);cout << i << endl; 对上述代码,输出的结果为 : 3原因:根据C99规范, sizeof是一个编译时刻就起效果的运算符,在其内的任何运算都没有意义, k= sizeof(i++); 在编译的时候被翻译成 j=sizeof((i++的数据类型)) 也就是 j = s原创 2015-09-08 16:56:17 · 1165 阅读 · 0 评论 -
C/C++中的预编译指令
程序的编译过程可以分为预处理、编译、汇编三部分,其中预处理是首先执行的过程,预处理过程扫描程序源代码,对其进行初步的转换,产生新的源代码提供给编译器。预处理过程读入源代码之后,会检查代码里包含的预处理指令,完成诸如包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码的工作。下面介绍一些C/C++中预编译的指令。一 #指令预处理指令以#号开头,并且#号必须是该行除了转载 2015-09-08 09:32:48 · 547 阅读 · 0 评论 -
C++之char , signed char , unsigned char
ANSI C 提供了3种字符类型,分别是char、signed char、unsigned char.而不是像short、int一样只有两种(int默认就是unsigned int).三者都占1个字节(1 byte),因此:signed char取值范围是 -128 到 127(有符号位)unsigned char 取值范围是 0 到 255这个大家都很清楚!!转载 2015-09-28 15:44:28 · 781 阅读 · 0 评论 -
指针值加上一个数值的实际意义
一直没怎么注意指针值加上数值的问题,认为就是在指针地址上往后叠加n个字节,直到今天写STL 库中二级空间配置器,内存报错:堆被损坏!单步跟踪后才发现问题首先说明问题:int a(0); //假设 &a = 0x1002int * p = &a; //此时 p = 0x1002p = p + 3; //错误想法: p = 0x1002 + 3 = 0x1005//但该操作的实际原创 2015-09-11 16:08:54 · 1367 阅读 · 0 评论 -
使用模板获取迭代器所指对象的类型
假设现在要求通过迭代器类型推测出迭代器所指对象的类型,在不考虑 value_type 的情况下,使用模板的参数推导机制实现要求,即:template void func(T iter){ //需要知道迭代器 iter 所指对象的类型,注:不是T}可以通过加一层函数来实现,将当前函数当做通用接口,即:template void func(T iter)原创 2015-09-12 11:08:08 · 1398 阅读 · 0 评论 -
C++中export关键字的尴尬处境
C++中export关键字的尴尬处境【原创文章,转载请保留或注明出处:http://blog.youkuaiyun.com/hikaliv/article/details/4474835】分离编译模式(Separate Compilation Model)允许在一处翻译单元(Translation Unit)中定义(define)函数、类型、类对象等,在另一处翻译单元引用它们。编译器(Comp转载 2015-09-07 11:12:29 · 1030 阅读 · 0 评论