C高质量编程总结-3-R.doc:..1:指针参数是如何传递内存的?<1>看下面的例子voidGelMemory(char*p,intnum){p=(char*)malloc(num*sizeof(char));}voidTest(void){char*str=NULL;GetMemory(str,100);//执行完后,str仍然为NULLstrcpy(str,HhelloH);//运行错误}问题:编译器总是要为函数的每个参数制作临时副本,指针参数p的临时副本是_p,编译器使得_p=p,如果函数体内的程序修改了_p的内容,就导致参数p的内容作相应的修改。在本例屮,_p申请了新的内存,只是把_p所指的内存地址改变了,但是p丝毫没有变。<2>如果非要达到“用指针来申请内存”的目的,可以这样:voidGetMemory(char**p,intnum){*p=(char*)malloc(num*sizeof(char));}••••<3>由于指向指针的指针这个概念不号理解,我们可以利用函数的返回值来返回屮请的地址char*GetMemory(intnum){char*p=(char*)malloc(num*sizeof(char));returnp;1<4>注意把上面的例子和下面的例子作比较//这样是完全正确的,返回的是内存屮堆的地址char*GetMemory(intnum)Ichar*p=(char*)malloc(num*sizeof(char));returnp;}//这样返冋就错了,原因是函数返回了一个指向栈内存的指针char*GetMemoryO{char*p二”Hello”;returnp;}//总结:在函数中返回堆地址是可以的,但是返回栈地址是不正确的2:有了malloc/free之后为什么还要用new/delete?<1>对于非对象数据类型,这两个是等价的<2>对于对象就不一样了<1>malloc/free是系统函数,不是运算符,它们不能进行对象的构造和析构<2>free/delete是运算符,口J以进行对象的析构和构造<3>注意:<1>用free来释放new创建的对彖,程序可能会出现问题<2>用delete来释放malloc创建的内存,理论上不会出现问题,但是程序的可读性不强3:对一个指针释放两次会出现问题例如:下面是错误的:int*p=newintflOO];delete[]p;delete[]p;4:注意数据类型的隐式转换带來的问题例如,下面的程序:voidFun(intnum){cout«"Number:"«num«endl;}voidFun(floatnum){cout«"Number:"«num«endl;}intmain(){doubled_Num=;Fun(d_Num);//编译错误:调用的函数不明确return0;15:继承中的重载,隐藏和覆盖<1>重载比较好区别,在这里主要比较隐藏和覆盖<2>覆盖只有一-种情况:<1>基类和派生类的函数名称相同<2>函数的参数相同<3>其余的情况是隐藏:<1>函数名称相同,参数不同时,不论有没有virtual关键字,都是隐藏<2>函数名称相同,参数不同时,但是没有virtual关键字,是隐藏由此可见,隐藏和覆盖的重要一
C高质量编程总结-3-R 来自淘豆网m.daumloan.com转载请标明出处.