C/C++
akonlbjrd
这个作者很懒,什么都没留下…
展开
-
C++只能允许类创建一个对象的做法
方法一:利用引用计数:#include using namespace std;class Object{public: ~Object() { count=1; } Object() { if (count==0) { cout<<"该类只能创建一个对象!"; return ;原创 2010-05-24 22:18:00 · 5340 阅读 · 2 评论 -
理解有符号数和无符号数
<br />声明网上看到的文章,原文找不到了,原文被转载的不成样子,重复很多,整理花了很长时间,在翻看了维基百科后发现,原文中对于负数原码和补码存在一些问题,修改了一部分,原作者看到后可以联系我。<br />1、你自已决定是否需要有正负。 <br /><br />就像我们必须决定某个量使用整数还是实数,使用多大的范围数一样,我们必须自已决定某个量是否需要正负。如果这个量不会有负值,那么我们可以定它为带正负的类型。 <br /><br />在计算机中,可以区分正负的类型,称为有符类型(signed),无正负的转载 2011-03-23 21:54:00 · 1723 阅读 · 0 评论 -
指向函数的指针
<br />指向函数的指针<br />假定我们被要求提供一个如下形式的排序函数:<br />sort( start, end, compare );<br />start 和end 是指向字符串数组中元素的指针。函数sort()对于start 和end 之间的数组元素进行排序。compare 定义了比较数组中两个字符串的比较操作。<br />该怎样实现compare 呢?我们或许想按字典顺序排序数组内的字符串,或许想按长度排序它们,以便将最短的字符串放在前面,而长的放在后面。解决这种需求的一种策略是将第三个转载 2011-03-18 17:44:00 · 3274 阅读 · 0 评论 -
数据成员的存取与布局
<br />已知下面一组数据成员:<br /><br />class Point3d{<br />public:<br />//…<br />private:<br />float x;<br />static List<Point3d*> *freeList;<br />float y;<br />static const int chunkSize = 250;<br />float z;<br />} 数据成员的存取与布局 收藏 <br />数据成员的布局<br />已知下面一组数据成员:<br /转载 2011-03-18 18:59:00 · 732 阅读 · 0 评论 -
指向成员函数的指针
<br />指向成员函数的指针<br />取一个非静态成员函数的地址,如果该函数是nonvirtual,则得到的结果是它在内存中真正的地址。然而这个值也不是完全的,它也需要被绑定于某个class object的地址上,才能够通过它调用该函数。所有的非静态成员函数都需要对象的地址(以参数this指出)。<br />一个指向成员函数的指针,其声明语法如下所示:<br />double //return type<br />(Point::* //class the function is membe转载 2011-03-18 17:10:00 · 731 阅读 · 0 评论 -
指向数据成员的指针
<br /> 指向数据成员的指针 收藏 <br />指向数据成员的指针<br />指向数据成员的指针,是一个有点神秘又颇有用处的语言特性,特别是如果你需要详细调查class members的底层布局的话。这样的调查可以用于决定vptr是放在class的起始处或者尾端。另外一个用途是可以用来决定class中的access sections的次序。<br />考虑下面的Point3d声明。其中有一个virtual function,一个static data member,以及三个坐标:<br />class转载 2011-03-18 21:15:00 · 651 阅读 · 0 评论 -
数组参数传递的几种方法
<br />#include <iostream>using namespace std;/* 方法一 *传递数组参数和长度 *******************/void DisArray(int a[], int len); /* 方法二 *传递数组引用 * 提示:一定要写成 int(&a)[5], 少了括号非法 *******************/void DisArray(int (&a)[5]);/*方法三 * 使用一对迭代器参数原创 2011-03-08 18:34:00 · 1990 阅读 · 0 评论 -
C语言实现strlen,atoi, strcpy等函数
strlen的实现很简单:如下:int my_strlen(const char* p){ assert(p != NULL); int len =0; while (*p++) { len++; } return len;}strcmp的实现:int my_cstrcmp(const char* p , const char* q){ assert(p != NULL && q != NULL); //循环找到第一个不相等的字符 for (;原创 2010-11-06 01:25:00 · 1472 阅读 · 0 评论 -
C++ 四种强制转换符的区别
<br />作为四个内部类型转换操作符之一的dynamic_cast和传统的C风格的强制类型转换有着巨大的差别。除了dynamic_cast以外的转换,其行为的都是在编译期就得以确定的,转换是否成功,并不依赖被转换的对象。而dynamic_cast则不然。在这里,不再讨论其他三种转换和C风格的转换。<br />首先,dynamic_cast依赖于RTTI信息,其次,在转换时,dynamic_cast会检查转换的source对象是否真的可以转换成target类型,这种检查不是语法上的,而是真实情况的检查。<b转载 2010-10-30 20:29:00 · 2574 阅读 · 1 评论 -
void 指针 void*
<br />void* 可以保存任何对象的任意地址 如:<br />int i = 0;<br />double d = 3.23;<br />string s = "aaaa";<br /> <br />void * p = &i;<br /> p = &d;<br /> p = &s;<br /> <br /> <br />上面的代码正确<br />但是如果直接对void* 解引用的话,编译器报错<br /> <br />cout<<*p <<endl;<br /> <br />编译器报错:非法的间接原创 2010-10-30 21:00:00 · 988 阅读 · 0 评论 -
C++中 explicit的用法
explicit 是避免构造函数的参数自动转换为类对象的标识符#include using namespace std;class A{public: explicit A(int a) { cout上面的代码编译不成功,原因是当显式地定义了一个带一个参数的构造函数( 带explicit),必须要显示地调用构造函数,A a(10);如果不加 explicit的话A a=10;实际的转换过程如下:相当于直接调用A(10);(1)explicit此关键字只能对用户自己定原创 2010-06-03 13:36:00 · 17053 阅读 · 1 评论 -
浅析C++中内存分配的方式
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/ 静态存储区和常量存储区。<br /><br />栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。<br /><br />堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个 delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。<br /><br />自由存储区,就是那些由malloc等分配的内存块,他转载 2011-04-04 00:26:00 · 704 阅读 · 0 评论