C++知识点
文章平均质量分 71
娃哈哈纯净李
这个作者很懒,什么都没留下…
展开
-
Makefile基础 4. 自动处理头文件的依赖关系
转自:http://blog.csdn.net/weiwangchao_/article/details/18799309现在我们的Makefile写成这样:all: mainmain: main.o stack.o maze.o gcc $^ -o $@main.o: main.h stack.h maze.hstack.o: stack.h main.hmaze.o:转载 2017-02-17 15:06:45 · 598 阅读 · 0 评论 -
new和malloc的区别
1. malloc()函数1.1 malloc的全称是memory allocation,中文叫动态内存分配。原型:extern void *malloc(unsigned int num_bytes); 说明:分配长度为num_bytes字节的内存块。如果分配成功则返回指向被分配内存的指针,分配失败返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。1.原创 2015-04-20 21:24:37 · 406 阅读 · 0 评论 -
C++ 虚函数表解析
转自:http://blog.csdn.net/haoel/article/details/1948051前言 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:转载 2015-04-15 22:01:20 · 509 阅读 · 1 评论 -
vector的所有函数和使用的注意事项
1、构造函数: (1)vector (2)vector (3)vector (4)vector (5)vector (6)vector2、assign函数:(只有顺序容器有)assign函数可以对已有容器进行重新赋值,可以改变原来容器的size和capacity。构造函数只能用相同容器类型和相同原创 2015-04-11 14:16:42 · 5532 阅读 · 1 评论 -
用优先级队列实现霍夫曼编码
用优先级队列实现霍夫曼编码,采用贪心算法,每次从优先级队列中选取两个最小元素进行合并。注意用优先级队列时用的是小顶堆,采用仿函数做比较器,不能用函数指针来实现。代码如下:#include#includeusing namespace std;struct Node{ char c; int val; Node *lChild; Node *rChild; Node(原创 2015-03-24 16:52:07 · 1049 阅读 · 0 评论 -
二维数组传递参数
在堆上开辟二维数组,和在栈上开辟二维数组传递参数是可以不一样的,尤其对于字符串更是这样。#includeusing namespace std;void printf(char **b){ while(*b)//注意此处传入的b必须最后至少最后一组字符是'\0'否则会出错 cout<<*b++<<endl;}void print(char **b){ for(int i原创 2015-03-23 16:04:26 · 524 阅读 · 0 评论 -
static的含义以及其在C/C++中的区别
转自:http://blog.csdn.net/yangcs2009/article/details/38359173static关键字是C, C++中都存在的关键字. 它主要有三种使用方式, 其中前两种只指在C语言中使用, 第三种在C++中使用(C,C++中具体细微操作不尽相同,本文以C++为准).(1)局部静态变量(2)外部静态变量/函数(3)静态数据成员/成员函数转载 2015-03-21 11:23:55 · 419 阅读 · 0 评论 -
普通函数和类成员函数const重载
函数参数的const重载只能重载引用型的,因为非引用的const和普通的非const参数一样。成员函数用const重载总共有三种方式,有三个地方可以写const,要注意const在不同的地方的意义。#include#include#includeusing namespace std;void fun(const int& i)//fun(10)这能用这个函数{ cout<<原创 2015-03-28 10:34:59 · 679 阅读 · 0 评论 -
C++类模板中的模板函数
在C++中类模板中可以嵌套函数模板,但是在使用时候有些注意事项如下:一、如果类模板中参数为template,在函数模板中,函数的不同模板名字是可以重载的,如template void assign(),和template void assign()注意这里重载的原因是,如果传入的参数是T类型,即和类模板参数类型相同,就调用第一个版本,如果传入的参数和类模板参数不一样,调用第二个版本。这和基本的原创 2015-01-24 10:05:23 · 6492 阅读 · 1 评论 -
二维数组如何作为函数参数使用?
转自:http://blog.csdn.net/xinshen1860/article/details/20620227如果我们需要编写一个处理二维数组的函数,那么这个函数原型应该如何声明呢?首先,我们应该牢记:数组名被视为其地址,因此,相应的形参是一个指针。例如,假设有如下的代码:[cpp] view plaincopy转载 2015-01-05 22:17:22 · 1423 阅读 · 0 评论 -
c++ 虚继承详解
#include using namespace std;class A{ virtual void f(){};};class B : public virtual A{ virtual void f(){};};class C: public virtual A{ virtual void f(){}; virtual void t(){转载 2015-04-16 22:17:51 · 556 阅读 · 0 评论 -
C++虚拟继承例子
代码如下:#includeusing namespace std;class Base {public: void fun(){cout<<"Base::fun"<<endl;} virtual void f() { cout << "Base::f" << endl; } virtual void g() { cout << "Base::g" << endl; }原创 2015-04-16 22:19:40 · 590 阅读 · 0 评论 -
单例模式
单例模式单例模式,可以说设计模式中最常应用的一种模式了,据说也是面试官最喜欢的题目。但是如果没有学过设计模式的人,可能不会想到要去应用单例模式,面对单例模式适用的情况,可能会优先考虑使用全局或者静态变量的方式,这样比较简单,也是没学过设计模式的人所能想到的最简单的方式了。一般情况下,我们建立的一些类是属于工具性质的,基本不用存储太多的跟自身有关的数据,在这种情况下,每次都去new一转载 2015-07-06 17:17:04 · 450 阅读 · 0 评论 -
构造函数不能为虚函数
1,从存储空间角度 虚函数对应一个vtable,这大家都知道,可是这个vtable其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,无法找到vtable,所以构造函数不能是虚函数。2,从使用角度 虚函数主要用于在信息不全的情况下,能使重载的函数得到对应的调用。构造函数转载 2015-06-08 17:15:23 · 455 阅读 · 0 评论 -
四种常用的类型转换
(1)static_cast(exdivssion)该运算符把exdivssion转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:①用于类层次结构中基类和子类之间指针或引用的转换。进行上行转换(把子类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。②用于基本数据原创 2015-05-06 11:27:43 · 1143 阅读 · 0 评论 -
浅议 Dynamic_cast 和 RTTI与虚函数表的关系
浅议 Dynamic_cast 和 RTTI写这篇博文的目的是,记录学习过程。对于问题要较真,在解决这个问题中会学到很多,远远超过自己期望,锻炼思维,享受这个过程。问题: Static_cast 与 Dynamic_cast的区别来自书本上的解释: 用 static_cast ( expression ) 1. static_cast(expression) The转载 2015-05-06 10:10:33 · 2993 阅读 · 0 评论 -
用C++实现一个不能被继承的类
在C++中,子类的构造函数会自动调用父类的构造函数子类的析构函数也会自动调用父类的析构函数。要想一个类不能被继承,我们只要把它的构造函数和析构函数都定义为私有函数。那么当一个类试图从它那继承的时候,必然会由于试图调用构造函数、析构函数而导致编译错误。可是这个类的构造函数和析构函数都是私有函数了,我们怎样才能得到该类的实例呢?这难不倒我们,我们可以通过定义静态来创建和释放类的实例转载 2015-05-06 11:32:44 · 579 阅读 · 0 评论 -
C++中new和delete
New运算符1、new表达式:当我们使用一条new表达式时:string *sp=newstring(“a value”);string *arr=newstring[10];实际上执行了三步操作。第一步,new表达式调用一个名为operatornew(或者operatornew[])的标准库函数。改函数分配一块足够大的、原始的、未命名的内存空间以便存储特定类型的对象(或者对象原创 2015-05-04 22:52:33 · 639 阅读 · 1 评论 -
union中的内存分配
在union联合体中,所有的变量是公用一个内存的,即以最大内存变量作为整个union的内存空间进行申请。同时也服从内存对其的策略,即如果同时又一个char和一个int类型,则占据4个字节的内存空间,最低字节就是char所对应的值,而如果单纯的只给char变量赋值,则int型变量的高三个字节是未定义的。#includeusing namespace std;union CC{ int原创 2015-04-21 17:10:34 · 4545 阅读 · 0 评论 -
c/c++内存分配与内存对齐全面探讨
不明白内存分配和指针的可以看看,其实这本是我们老师留的一个操作系统科技小论文作业,不知道写什么,干脆把以前收藏的经典C内存分配的文章整理并修改了一下。 此文章有2个用处,1:这是个小论文,格式完整,大家可以复制回去交作业;2:这是整理的经典C内存分配小教程(也加了些我自己的观点),不明白内存分配的可以看看。还有很重要的一个问题: 这篇文章引用的很多内容我也不知道究竟是出自转载 2015-04-17 10:50:33 · 442 阅读 · 0 评论 -
c++重载、覆盖和隐藏
4.c++重载、覆盖、隐藏的区别和执行方式既然说到了继承的问题,那么不妨讨论一下经常提到的重载,覆盖和隐藏4.1成员函数被重载的特征(1)相同的范围(在同一个类中); (2)函数名字相同; (3)参数不同; (4)virtual 关键字可有可无。 4.2“覆盖”是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类); (2)函数名字相同转载 2015-04-17 10:14:38 · 454 阅读 · 0 评论 -
编译器的工作过程
转自:http://www.ruanyifeng.com/blog/2014/11/compiler.html源码要运行,必须先转成二进制的机器码。这是编译器的任务。比如,下面这段源码(假定文件名叫做test.c)。#include stdio.h>int main(void){ fputs("Hello, world!\n", stdout); ret转载 2015-01-22 09:01:50 · 466 阅读 · 0 评论 -
C++中的typename关键字
在C++中typename除了用于在定义模板函数和模板类中来替代关键字class,例如template换成template意外,typename还可以用来做型别的定义。注意:下面的代码是有问题的templatevoid print2nd(const C& container){ if(container.size()>=2) { C::const_iterator iter(c原创 2015-01-21 10:56:52 · 2308 阅读 · 0 评论 -
Stack的三种含义
转自:http://www.ruanyifeng.com/blog/2013/11/stack.html学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈"。理解这个概念,对于理解程序的运行至关重要。容易混淆的是,这个词其实有三种含义,适用于不同的场合,必须加以区分。含义一:数据结构stack的第一种含义是一组数据的存放方式,特点为LIFO,即后进转载 2015-01-20 09:15:18 · 487 阅读 · 0 评论 -
二叉树(类模板、函数模板、函数对象、函数指针)
这个二叉树的代码只是简单的实现了一些功能,比如插入和遍历。关键是用到了函数指针和函数对象,还有shared_ptr。其中shared_ptr一定定义在节点中,因为new出来的空间时节点,释放的时候是释放节点。在函数模板中用到函数对象时,如果要传递的是函数指针则必须把函数名和要用的参数T传入,不能只传入函数名,注意这和调用函数模板是不一样。如果传递的是函数对象,需要向构造一个类,重载(),然原创 2014-12-04 10:08:09 · 765 阅读 · 0 评论 -
\n和\r有什么区别
转自:http://javaeye-mao.iteye.com/blog/211354'\r'是回车,'\n'是换行,前者使光标到行首,后者使光标下移一格。通常用的Enter是两个加起来。下面转一篇文章。 回车和换行 今天,我总算搞清楚“回车”(carriage return)和“换行”(line feed)这两个概念的来历和区别了。 在计算机还没有出现之前,有一种叫做电传打字转载 2015-01-06 18:59:13 · 1409 阅读 · 0 评论 -
auto_ptr解析
auto_ptr解析auto_ptr是当前C++标准库中提供的一种智能指针,或许相对于boost库提供的一系列眼花缭乱的智能指针,这个不怎么智能的智能指针难免会黯然失色。诚然,auto_ptr有这样那样的不如人意,以至于程序员必须像使用”裸“指针那样非常小心地使用它才能保证不出错,以至于它甚至无法适用于同是标准库中的那么多的容器和一些算法,但即使如此,我们仍然不能否认这个小小的auto_ptr转载 2014-11-24 22:07:15 · 398 阅读 · 0 评论 -
auto_ptr与异常抛出
下面这个代码是没有用auto_ptr的,这个当fun1()函数被调用,且参数传递为0时,会抛出异常,这个异常抛出以后就会终端这个函数接下来的执行,这样,就会导致fun1()函数中的delete p;的操作无法进行,进而导致内存泄露。#include#include using namespace std;class A{ int num;public: A() { num原创 2014-11-29 11:41:16 · 539 阅读 · 0 评论 -
指针问题
指针原创 2014-11-04 10:11:35 · 558 阅读 · 0 评论 -
C++容器元素遍历的问题
C++容器遍历可以用容器的迭代器来完成,但是像vector、dequeue等线性容器可以用[]来索引,迭代方式如下:#include#includeusing namespace std;int main() { vector temp(10,1); //有警告:unsigned int和int不匹配 for(int i=0;i<temp.size();i++) co原创 2014-11-26 19:06:53 · 1573 阅读 · 0 评论 -
函数返回类时调用构造函数次数
#includeusing namespace std;class A{ int m;public: A(int m=0) { cout<<"一般构造函数\n"; } A(const A &a) { m=a.m; cout<<"拷贝构造函数\n"; } void operator =(const A &a) { this->m=a.m; cout<<原创 2014-11-26 20:11:56 · 1559 阅读 · 1 评论 -
类中static成员变量定义和声明
类中static成员变量的定义和声明:在VS2010中,只能在类外定义同时赋值,在类中声明。不能再类中声明时赋值!!#includeusing namespace std;class A{public: static int a; static int b;};int A::a=1;int A::b=1;int main() { cout<<A::a<<en原创 2014-11-26 19:25:49 · 3420 阅读 · 0 评论 -
位域
转自:http://bbs.csdn.net/topics/330120699转载 2014-11-18 09:12:32 · 345 阅读 · 0 评论 -
关于namespace的文件组织
在C++新规定里面,引入了#include的方式,而虽然对#include兼容,但是前者解决了在大文件时候的命名冲突问题,下面就讨论一下namespace是如何使用,C++中的容器等使用时候为什么必须加std::,如std::vector vi。我查看了一下C++中的头文件(这里是不包含.h的模板头文件,关于头文件的组织形式,可以参考:C语言中关于.h和.c的问题和.h文件和.cpp文件组织结原创 2015-01-28 10:51:23 · 1234 阅读 · 0 评论 -
C++中定义函数参数默认值
原来一直没有想明白,为什么在C++中定义函数时,默认值一定要写在声明的地方,而不是写在定义的地方,今天突然想明白了。一、如果在头文件.h中声明函数,在.cpp中定义,那么如果在另一个.cpp文件中要访问该函数时,只会查看.h文件,如果在声明的时候没有默认值,那么在是用当前函数的时候就不会提示这个函数已经有默认值了。只有在连接的时候才会把多个.obj文件进行连接,此时只是用头文件中的声明。所以在原创 2015-01-28 11:34:47 · 8409 阅读 · 1 评论 -
C/C++语言中const的用法
转自:http://www.cnblogs.com/xkfz007/archive/2012/02/27/2370478.html1. const 在C和C++中的区别C++中的const正常情况下是看成编译期的常量,编译器并不为const分配空间,只是在编译的时候将期值保存在名字表中,并在适当的时候折合在代码中. 所以在C++中const修饰的量可以用在数组的定义中。转载 2014-12-12 20:37:09 · 504 阅读 · 0 评论 -
关于友元函数的总结
转自:http://www.cnblogs.com/BeyondAnyTime/archive/2012/06/04/2535305.html1.友元函数的简单介绍1.1为什么要使用友元函数在实现类之间数据共享时,减少系统开销,提高效率。如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数。具体来说:为了使其他类的成员原创 2014-12-11 14:33:37 · 564 阅读 · 0 评论 -
关于C++中模板例化产生的代码
首先,我先写了一段什么都没有的代码进行编译,运行,如下:int main() { return 0; }代码生成的.exe文件大小为27k。然后我加入了头文件:vector和list,但是没有引入其他元素:#include#include#includeusing namespace std;int main() { return 0;原创 2014-12-11 14:01:49 · 1434 阅读 · 0 评论 -
C++中类定义可以写在.h文件,但函数定义却不行
前两个转自:http://bbs.csdn.net/topics/390542206?page=1#post-395264705一、定义和声明1) 定义就是声明,声明不一定就是定义,声明的意思是已经定义了。 定义是直接说已经定义了,非定义声明,是间接说已经定义了。 声明,不需要明白告诉你,定义成什么样子,你懂得就行。 定义,必须清晰,不能含糊,因为要分配空间。转载 2014-12-09 21:08:50 · 10218 阅读 · 0 评论 -
const_cast的问题
CSDN上有人问到的问题:#include using namespace std;int main(){ const int i = 10; int *pi = const_cast(&i); ++*pi; cout << " i = " << i << ", @" << &i << endl; cout << "*pi = " << *p转载 2014-12-08 20:21:14 · 545 阅读 · 0 评论