当前位置: 首页 > 科技观察

Java程序员学习C++一天半的心得

时间:2023-03-18 16:04:22 科技观察

大学期间,学了一个学期的C语言,当然在学习数据结构的时候用到了C语言。那时我刚接触计算机,对编程一窍不通。上课学习学习,偶尔照着书本敲代码。大二下学期,丢了,不需要了。最近由于工作需要,需要用到JavaNativeInterface,所以学习了一天半的C++。本人对C++略有了解,写出自己的理解。一天半的时间,我并没有学到多少。主要搞清楚了以下几个问题:1)做了这么多年的指针,我还记得在C语言中,最难理解的应该就是指针了。还记得谭浩强的C语言书(书名是什么,真的忘了。不过作者谭浩强先生应该是大多数中国开发者都知道的),之前的大部分都是用的基本数据类型(也就是nativetypeinJava),还有一小部分突然说到指针,顿时蒙圈了。不过庆幸的是,我终于明白了指针,虽然后来忘记了。什么是指针?指针是保存另一事物地址的变量。指针是一个变量,具有特殊作用的变量称为指针。它的特殊功能是存放另一个东西的内存地址。也就是说,指针变量的值代表一个地址,而这个地址是属于另外一个东西的。那另一件事是什么?这就是我们所说的对象(或实例)。在C++中,还给这个对象起了一个别名:reference。总结一下:指针变量指向一个对象(或引用)。*、&用于声明语句:*表示声明是指针,&表示引用。这里所说的声明语句可以是变量声明,也可以是函数声明。在函数声明中,返回值、函数名和参数都可以声明为指针。使用指针变量时,(*变量名)表示获取一个对象。(&reference)代表取一个指针。voidpersonTest(Person*p){if(p!=NULL){p->setAddress("BeiJing,HaiDian");//指针赋值(*p).setName("FangJiNuo");//使用对象方式赋值。(*p).setAge(23);printf("showinfo:\n%s\n",(*p).toString());deletep;p=NULL;}}这两个字函数指针和函数指针八话,不知道被多少人绊倒过,其实很好理解。中国人说话大多是用叙事的方式。这两个词都是省略句,但是省略的是助词。函数指针的全称是:函数名就是指针。指针函数的全称是:返回值为指针的函数。这两个中,指针函数比较好理解:char*func(char[]p);这个函数是一个指针函数。函数指针,函数名就是指针。指针也是一个变量,所以可以理解为:函数名是一个变量。下面是一个函数指针变量的声明:typedefint(*func)(intx);然后将这个变量作为另一个函数的参数:typedefint(*func)(intarg);//定义一个函数指针/*一个函数指针实现*funcImpl可以赋值为func的值。*/intfuncImpl(intarg){returnarg;}/**声明一个函数,将函数指针作为函数调用的参数*/voidcall(funcf){for(inti=0;i<10;i++){cout<,#include"xxxx.h"。这两种方式还是有区别的,<>方式是先从系统目录下找.h文件,“”是先从用户目录下找.h文件。有点类似于Java中的ClassLoader。默认使用委托加载,也可以使用子类优先级加载。创建实例和回收在C语言中,声明一个变量,可以直接使用声明方式,也可以使用molloc方式。在C++中,增加了一个新的方法,其写法与Java相同。创建释放语句(隐式):对象本身被创建,不会指针隐式释放,不需要写代码。因为声明的对象在栈中,所以molloc出栈后自动释放(显示):该方法用于分配内存,返回值是要释放的指针使用free()new:分配内存,返回value是一个指针,使用delete释放Molloc,new分配内存后,返回值是一个指针。并且分配在内存的Heap区,不会自动释放,所以需要使用free和delete来释放。另外,使用feee和delete后,最好将指针的值设置为NULL,因为free和delete只是释放对象占用的内存空间,指针的值仍然是该空间的首地址在被释放之前被对象占用。这一点不同于Java,它可以自动回收。该对象可以设置为空。Java中的回收机制是:使用分代回收算法回收不可达对象。voidfun(){Menu*m1=newMenu();//显式声明对象Menu2;//隐式声明对象this->menulist->push_back(m1);this->menulist->push_back(&m2);}voidshowList(){list::iteratoriter=this->menulist->begin();while(iter!=this->menulist->end()){Menu*menu=*iter;cout<toString()<