从Java到C++,Android程序员的QT之路
单位做界面都习惯用QT,我这个苦逼Android程序员,也重新开始了C++阵营。说说我的一些理解和看法,求诸位大神说说我哪些理解的不对。好不容易找到咱这论坛。
1. 关于Java和QT做GUI
我以前学过Java的Swing,也是可以跨平台呀,而且我们是做Android的,有很多jar包可以直接用呀。想不通为什么单位一定要坚持用QT,说是这方面技术单位有积累。QT应用更加广泛什么的。大家可以谈谈意见,为什么做GUI, 用QT要好于Java
2. 函数返回的问题
主要是习惯了Java的内存管理以及统一的引用概念,
最显著的就是参数返回的问题:
C/C++都习惯用返回值表示执行成功或者失败,而通过指针参数来返回对象的改变后的值。虽然这样要取地址,用起也比较难看。但是也还不错。然后就是C++的引用方式返回。但是,我用Java一般都是直接通过返回值返回对象,错误通过异常抛出。看同事(也是一个Java程序员)写的,直接通过返回值返回对象,想想以前学的,这里要再复制一次,不然就得返回Object&总觉心里有点不是滋味。
另外,用返回值返回有个好处就是可以减少调用时的代码量。比如
int a = count(arr,n)
然后如果是参数返回,就得写两句了。
int a;
count(arr,n,&a);
还有打印的时候,连写的时候。
qDebug()<<toHexStr(arr,n)<<endl;
就得写成
QString hexStr;
toHexStr(arr,n,hexStr);
qDebug()<<hexStr<<endl;
总之就是不习惯。
3. static 变量和函数的问题
用习惯Java就会习惯在类成员变量定义时,直接赋初值,这相当于在构造函数中赋值一样。但是C++不支持这样,C++的头文件里,全部是声明,是不可以有可以实际执行的代码。就连定义一个static const int HASH_SIZE = 5; 也会给个warning, 这是C11才支持的方式。当初学C++时候,我就对C++的static 变量初始化特别不习惯,初始化必须在.cpp中完成,这也还可以理解,但是不可以在前加static, 只能通过 int ClassName::HASH_SIZE = 5;
然后就是函数的问题,用惯了Java, 静态函数也习惯放到一个类里,然后通过 ClassName.staticFun()调用。但是用C++的ClassName::staticFun()总觉得有些不伦不类,我们都有全局函数了,还要这货干什么?装什么面向对象呀?真以为自己有女朋友似的。
4.还有就是对象分配空间的问题
这个也是看同事的代码,明明是一个局部变量,还一定要new 然后delete,有时候还delete, 说是QT自己会释放
就偈有这个:
Object obj(path);
obj.ouput();
非要写成
Object* obj = new object(path);
obj->output();
delete obj;
看着可真是不爽呀,这可不是我本科学了四年的原生的C/C++呀