随笔分类 - C/C++
摘要:索引:1、内存分配简介2、内存分配常见错误3、new()/delete()函数的使用4、malloc()/free()函数的使用在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free
阅读全文
摘要:RTTI(Runtime TypeIdentification)提供了运行时确定对象类型及转换指针或引用类型的方法。 有关内容包括类名称,数据成员名称与类型,函数名与类型等。在大多数面向度地向专家传播自己设计理念时,都主张在设计和开发中使用虚拟成员函数而不是使用RTTI机制,但是再很多情况下虚拟成员函数无法克服本身的局限。每当涉及处理异类容器和根基类层次时,不可避免要对对象类型进行动态判断,也就是动态类型的侦测。在C++中提供了两个运算符typeid 和 dynamic_cast。typeid可以获取与某个对象关联的运行时类型信息。他返回的是type_info类型,该类型描述类型信息。Type
阅读全文
摘要:所有一元运算符 建议重载为成员函数= () [] —> 只能重载为成员函数+= -= /= *= |= ~= %= >>= 只能重载为成员函数+=、-=、/=、*=、&=、|=、~=、%=、>>=、 operator ()
{
函数体
} 成员函数: 类名::operator ()
{
函数体
}2、参数表的结构不同在成员运算符函数的参数表中,如果运算符时单目的,则参数为空,此时当前对象作为运算符的一个操作数,通过this指针隐含地传递给函数;如果运算符时双目的,则参数表中有一个操作数,该操作数作为运算符的右操作参数,此时当前对象作为运算符的左操作数,它是
阅读全文
摘要:大家都应该知道i++和++i的区别,前者是先使用i的值,然后再增加1,而后者是先增加1然后再使用i的值。但是i++和++i那个更好呢? 我们通过程序来比较一下:#includeusing namespace std;class I{public: I(); ~I(); I(const I &i); I& operator=(const I &i); I& operator++(); I operator++(int);};I::I(){ cout << "con" << endl;}I::~I(){ cout <
阅读全文
摘要:先来说一下指针的命名:我们声明指针变量的时候,建议用“ptr”来开头,这样是一种好的习惯,可以让你看到这个变 量就知道他是一个指针变量。也要注意给指针添加必要的注释。先来看看内存: 内存是以字节为单位的一片连续的存储空间,这些单元都有自己的编号,这就是内存地址。操作系统通过内存地址来实现对内存的管理。而这里指针他就是一个变量,指针就是一个标尺,来告诉程序内存在那一片区域可以找到。地址就是内存的编号,而只这点你就是用于存放内存地址的。而地址的单位是字节,他来唯一标识内存中的某个特定的单元。 这里要注意的是:无论指针指向什么数据类型,32位系统中的指针...
阅读全文
摘要:今天听到CRT这个词,又听说:main 是应用程序的入口点,但是不是应用程序起来调用的第一个函数,在这之前由crt来调用main函数。现在就来看一下CRT是什么?来看一下:///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////摘录:自http://www.cnblogs.com/chio/archive/2007/11/26/972152.html/////////////////////////////
阅读全文
摘要:什么是指向函数的指针函数指针是指向函数的指针变量,不是指向对象的指针!函数指针本身应该是“指针变量”;“在C语言中,函数本身不是变量,但可以定义指向函数的指针,这种指针可以被赋值、存放于数组之中,传递给函数及作为函数的返回值等” --《The C Programming Language Second Edition》一个函数在编译的时候被分配一个入口地址,这个入口地址就称为函数指针。就一个函数来说,他做两件事,1、调用它。2、取得他的地址。 当你通过取得函数的地址来得到指针,那你就可以用这个指针来调用函数了!下面来看一个实例: bool (*pf)(const string &, c
阅读全文
摘要:virtual 面向对象,他的多态性是如何体现的呢 那就要看我们的虚函数了, 我们的虚函数是我们在基类里面声明了一些能够在各个派生类里面重新定义的函数。编译器和装载程序能够保证对象和应用于他们的函数之间的正确的对应关系。C++中,虚函数起了很大的作用,类中至少有一个虚函数的时候,类就会构造出一个虚函数表来指示这些函数的地址,假如继承该类的子类定义并实现了一个同名并具有同样函数签名(function siguature)的方法重写了基类中的方法,那么虚函数表会将该函数指向新的地址。来看看此时的多态性:当我们将基类的指针或引用指向子类的对象的时候,调用方法时,就会顺着虚函数表找到对应子类的...
阅读全文
摘要:dynamic_cast (expression)可以安全的将类的指针或者引用沿着他们的继承层次转换! 但是指针必须有效,必须为0(可以对值为0的指针应用dynamic_cast,结果仍然是0)或者指向一个对象! 他只接受基于类对象的指针和引用的类型转换!在类层次上进行转换的时候 dynamic_cast于static_cast的效果一样!他返回一个新类型的值,或者会抛出一个异常!来看代码:#include
using namespace std; struct V { virtual void f() {}; // must be polymorphic to use run...
阅读全文
摘要:reinterpret_cast (expression)reinterpret_cast是强制类型转换符!他是用来处理无关类型转换的,通常为操作数的位模式提供较低层次的重新解释!但是他仅仅是重新解释了给出的对象的比特模型,并没有进行二进制的转换!他是用在任意的指针之间的转换,引用之间的转换,指针和足够大的int型之间的转换,整数到指针的转换,在家面的文章中将给出!来看一个例子:int *pi;
char *pc = reinterpret_cast(pi);
OK, 在这里你可以看到reinterpret_cast的强大作用,但是要注意的是,他并没有进行二进制的转换,pc指向的真实对象其实.
阅读全文
摘要:在C语言中可以看到这样一种形式的代码:if (a > 0) if (b > 0) printf("~~~~~");
else printf("!!!!!!!!!");问题就出来了,这个else 到底是和那个if搭配?也许在这里容易发现,但是如果是大块的代码嵌入到了类似这样的框架中,那么寻找起来是很麻烦的! 其实上面的语句是想else跟第一个if搭配的,但是事实上else是和内部的if搭配了!因为C编译器会忽略空白!大家可以和python来比较一下,python设计的就比较好了~它可以避免此类情况的发生!来看一段代码:if a > 0:
阅读全文
摘要:用法:static_cast ( expression )《C++primer 第四版》中说编译器隐式执行的任何类型转换都可以由static_cast显式完成!要注意的是,此转换没有运行时检测安全!他不能转换掉expression的const、volatile、或者__unaligned属性。他也不是用来去掉static属性的! 大家应该清楚static限定符吧,他会造成范围性的影响,而const则不同,他只是限定变量或对象自身!当你用static限定符限定一个变量的时候,就拿类中吧,他会随类的第一个实例对象的出现而出现,并且可以被这个类的所有对象所使用!!C++中的static_cast执.
阅读全文
摘要:用法:const_cast (expression)此运算符是用来消除类型的const和volatile属性的。看到const_cast的你应该知道,他是用来转换掉表达式的const性质的。对也,只有使用我们的const_cast才能将const性质转换掉!ok,我们来看一段代码: const char m = 't'; const char *cm = &m; char *n = const_cast(cm); *n = 'a'; cout (cm); *n = 'a'; cout (ss));ok,我们编译通过了!不过我在写代码的时候
阅读全文
摘要:C++提供了四个转换运算符:const_cast (expression)static_cast (expression)reinterpret_cast (expression)dynamic_cast (expression)dynamic_cast: 通常在基类和派生类之间转换时使用;static_cast: 一般的转换,如果你不知道该用哪个,就用这个。reinterpret_cast: 用于进行没有任何关联之间的转换,比如一个字符指针转换为一个整形数。static_cast在编译时期强制转换,dynamic_cast在运行时期转换(较安全) ,reinterpret_cast主...
阅读全文
摘要:作者:jofranks原创作品,转载请标明出处!版权所有,侵权必究!来源:http://blog.csdn.net/jofranks★ 相同点:都是地址的概念;指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。★ 区别:1. 指针是一个实体,而引用仅是个别名;2. 引用使用时无需解引用(*),指针需要解引用;3. 引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终” !4. 引用没有 const,指针有 const,const 的指针不可变;5. 引用不能为空,指针可以为空;6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”
阅读全文

浙公网安备 33010602011771号