c++
scdxmoe
这个作者很懒,什么都没留下…
展开
-
新手学习----虚函数-
你一定不要被 "虚函数 "这个词吓着,我一开始就被它吓着了,以为这又是个什么东东。 现在我就把我脑子里的虚函数聊聊,各位大见笑了: 在我们现实生活中有很多词,比如“开”这个词,现在有一辆汽车和一辆自行车在你面前,我对你说,“请把这个车开起来!” 当我指向汽车时,你就会加油门,然后转方向盘,汽车开起来。如果我指向自行车时,你就会两脚一登,把自行车开起来。你看,我对两种东西(汽车、自行车)转载 2013-10-09 19:26:33 · 634 阅读 · 0 评论 -
c++ 内存管理:6、杜绝“野指针”
“野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。“野指针”的成因主要有两种: (1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。例如原创 2013-10-20 10:58:54 · 870 阅读 · 0 评论 -
c++ 内存管理:8、内存耗尽怎么办
如果在申请动态内存时找不到足够大的内存块,malloc和new将返回NULL指针,宣告内存申请失败。 通常有三种方式处理“内存耗尽”问题。 (1)判断指针是否为NULL,如果是则马上用return语句终止本函数。例如: void Func(void) { A *a = new A; if(a == NULL) { return; } … }原创 2013-10-20 13:43:09 · 1491 阅读 · 0 评论 -
c++ 内存管理:9、malloc/free的使用要点 new/delete的使用要点
一、malloc/free的使用要点 函数malloc的原型如下: void * malloc(size_t size); 用malloc申请一块长度为length的整数类型的内存,程序如下: int *p = (int *) malloc(sizeof(int) * length); 我们应当把注意力集中在两个原创 2013-10-20 13:53:16 · 918 阅读 · 0 评论 -
STL中map用法详解
std map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下std map内部数据的组织,std map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在std map内部所有的数转载 2013-10-20 15:24:42 · 673 阅读 · 0 评论 -
c++ 内存管理:7、有了malloc/free为什么还要new/delete?
malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。 对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加原创 2013-10-20 11:07:58 · 1376 阅读 · 0 评论 -
c++ 内存管理:5、指针参数是如何传递内存的
如果函数的参数是一个指针,不要指望用该指针去申请动态内存。如下示例中,Test函数的语句GetMemory(str, 200)并没有使str获得期望的内存,str依旧是NULL,为什么? void GetMemory(char *p, int num) { p = (char *)malloc(sizeof(char) * num); } void Test(void)原创 2013-10-20 10:57:28 · 1086 阅读 · 0 评论 -
C++ 虚函数 笔试题目--绿盟科技
求下面程序的输出值: class A{ public: A() {func(0);}; virtual void func(int data) {printf("A1 :%d\n",data);} virtual void func(int data) const {printf("A2 :%d\n",data);} void func(char *str) {printf("原创 2013-10-18 19:48:41 · 1692 阅读 · 0 评论 -
面试总结 --系统
僵死线程 :每次任务跑完了,线程会sleep,当程序停止时,线程仍然处于sleep中,久而久之,就出现了僵死线程,解决方法:在servlet中Destroy()方法中强制关闭线程。 操作系统_信号量的概念 信号量是一个记录型数据结构,包含信号量值和一个等待队列,其中信号量值是一个具有非负初值的整型变量,等待队列是一个初始状态为空的队列,又称信号灯。 除信号量的初值外,信号量的值仅能由P操原创 2013-10-13 21:35:36 · 806 阅读 · 0 评论 -
gcc和g++的区别
gcc和g++都是GNU(组织)的一个编译器。 误区一:gcc只能编译c代码,g++只能编译c++代码 两者都可以,但是请注意: 1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的。C++的语法规则更加严谨一些。 2.编译阶段,g++会调用gcc,对于c++代码,两者是等转载 2013-11-01 15:34:54 · 681 阅读 · 0 评论 -
c++ 多线程编程 笔记
1、 空悬指针(dangling pointer)指向已经销毁的对象或已经回收的地址, 野指针(wild pointer)指的是未经初始化的指针 2、在面向对象程序设计中,对象的关系主要有三种:composition、aggregation、association。 composition(组合/复合)关系在多线程里不会遇到什么麻烦,因为对象x 的生命期由其唯一的拥有者owner 控制,o原创 2013-11-19 15:37:58 · 936 阅读 · 0 评论 -
STL的容器
STL的容器可以分为以下几个大类: 一:序列容器, 有vector, list, deque, string. 二 : 关联容器, 有set, multiset, map, mulmap, hash_set, hash_map, hash_multiset, hash_multimap 三: 其他的杂项: stack, queue, valarray, bitset STL原创 2013-10-13 09:11:28 · 682 阅读 · 0 评论 -
Linux多线程同步机制 .linux多线程编程机制
一、互斥锁 尽管在Posix Thread中同样可以使用IPC的信号量机制来实现互斥锁mutex功能,但显然semphore的功能过于强大了,在Posix Thread中定义了另外一套专门用于线程同步的mutex函数。 1. 创建和销毁 有两种方法创建互斥锁,静态方式和动态方式。 POSIX定义了一个宏PTHREAD_MUTEX_INITIALIZER来静态初始化互斥锁,方法如转载 2013-11-13 20:54:55 · 904 阅读 · 0 评论 -
c++ 抽象类 纯虚函数
纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“=0” virtual void funtion1()=0 纯虚函数最显著的特征是:它们必须在继承类中重新声明函数(不要后面的=0,否则该派生类也不能实例化),而且它们在抽象类中往往没有定义。 定义纯虚函数的目的在于,使派生类仅仅只是继承函数的接口。 纯转载 2013-10-18 19:30:58 · 861 阅读 · 0 评论 -
c++ 虚函数
虚函数 一个拥有虚函数的类内部会有一个成员变量vptr,一个四字节大小的指针,指向虚函数表,虚函数表中记录了该类的各个虚函数的入口地址,如果该类重载了继承的虚函数,那么就存放自己的虚函数地址,否则就是父类的虚函数地址 自己备录,原创 2013-10-09 20:25:43 · 641 阅读 · 0 评论 -
c++ 析构函数为虚函数 可以防止内存泄露
我们来看一段代码 : class CParent { char *m_Parent; public: CParent() { cout<<"Parent constructor"<<endl; m_Parent=new char[10]; } ~CParent() { cout<<"Parent DEconstructor"<<endl;原创 2013-10-18 15:49:27 · 1068 阅读 · 0 评论 -
c++拷贝构造函数的调用时机
在C++中,下面三种对象需要调用拷贝构造函数! 1. 对象以值传递的方式传入函数参数 2. 对象以值传递的方式从函数返回 3. 对象需要通过另外一个对象进行初始化; 本人只是做个备案自己学习、详细可以参考http://write.blog.csdn.net/postlist原创 2013-10-09 19:01:38 · 985 阅读 · 0 评论 -
c++ typedef 函数指针的用法
typedef 函数指针的用法 代码简化, 促进跨平台开发的目的. typedef 行为有点像 #define 宏,用其实际类型替代同义字。 不同点:typedef 在编译时被解释,因此让编译器来应付超越预处理器能力的文本替换。 用法一: typedef int (*MYFUN)(int, int); 这种用法一般用在给函数定义别名的时候 上面的例子定义MYF转载 2013-10-09 20:44:59 · 824 阅读 · 0 评论 -
函数重载是什么意思?它与虚函数的概念有什么区别?
函数重载是一个同名函数完成不同的功能,编译系统在编译阶段通过函数参数个数、参数类型不同,函数的返回值来区分该调用哪一个函数,即实现的是静态的多态性。但是记住:不能仅仅通过函数返回值不同来实现函数重载。 而虚函数实现的是在基类中通过使用关键字virtual来申明一个函数为虚函数,含义就是该函数的功能可能在将来的派生类中定义或者在基类的基础之上进行扩展,系统只能在运行阶段才能动态决定该调用哪一转载 2013-10-10 14:32:21 · 2338 阅读 · 0 评论 -
c++volatile的变量
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了 精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子: 1). 并行设备的硬件寄存器(如:状态寄存器) 2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variable原创 2013-10-10 14:27:15 · 817 阅读 · 0 评论 -
链表:利用二级指针删除单向链表
感谢网友full_of_bull投递此文(注:此文最初发表在这个这里,我对原文后半段修改了许多,并加入了插图) Linus大婶在slashdot上回答一些编程爱好者的提问,其中一个人问他什么样的代码是他所喜好的,大婶表述了自己一些观点之后,举了一个指针的例子,解释了什么才是core low-level coding。 下面是Linus的教学原文及翻译—— “At the opposite e转载 2013-10-10 15:11:02 · 901 阅读 · 0 评论 -
C++模板与STL库介绍
提纲 o1. 概论 o2. 模板机制的介绍 o3. STL中的基本概念 o4. 容器概述 o5. 迭代器 o6. 算法简介 概论 C++ 语言的核心优势之一就是便于软件的重用 C++中有两个方面体现重用: 1. 面向对象的思想:继承和多态,标准类库 2. 泛型程序设计(generic programming) 的思想:模板机制,以及标准模板原创 2013-10-11 21:13:49 · 977 阅读 · 0 评论 -
数组指针和指针数组的区别
数组指针和指针数组的区别 数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二维数组赋给一指针,应这样赋值: int a[3][4]; int (*p)[4]; //该语句是定义一个数组指针,指向含4个元转载 2013-10-13 09:25:44 · 643 阅读 · 0 评论 -
常量指针与指针常量的区别
三个名词虽然非常绕嘴,不过说的非常准确。用中国话的语义分析就可以很方便地把三个概念区分开。 一) 常量指针。 常量是形容词,指针是名词,以指针为中心的一个偏正结构短语。这样看,常量指针本质是指针,常量修饰它,表示这个指针乃是一个指向常量的指针(变量)。 指针指向的对象是常量,那么这个对象不能被更改。 在C/C++中,常量指针是这样声明的: 1)const int *p; 2)int c转载 2013-10-13 09:26:44 · 660 阅读 · 0 评论 -
C++内存分配的五种方法 与 c++内存问题
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。 堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回原创 2013-10-13 10:32:14 · 694 阅读 · 0 评论 -
求二叉树的高度(非递归) .----美团二面=----硬伤 当时没有答上来
#include using namespace std; int calculateTreeHeight(Node *root) { if(root == NULL) return 0; int visitedNumber = 0; int enQueNumber = 1; //当前入栈的序号,root为1 int lastLevelNumber = 1; i原创 2013-10-13 20:08:20 · 898 阅读 · 0 评论 -
c++ virtual 实例分析
class A { public: A(){}; public: virtual test() { cout<<"virtual A"<<endl; } }; class B:public A { public: B(){}; public: virtual test() { cout<<"virtual B"<<endl; } };原创 2013-10-18 11:11:22 · 850 阅读 · 0 评论 -
c++ 内联函数
(1)什么是内联函数? 内联函数是指那些定义在类体内的成员函数,即该函数的函数体放在类体内。 (2)为什么要引入内联函数? 当然,引入内联函数的主要目的是:解决程序中函数调用的效率问题。另外,前面我们讲到了宏,里面有这么一个例子: #define ABS(x) ((x)>0? (x):-(x)) 当++i出现时,宏就会歪曲我们的意思,换句话说就是:宏的定义很容易产生二意性。转载 2013-10-18 16:06:18 · 702 阅读 · 0 评论