从Java到C++,Android程序员的QT之路

quietwave 2016-05-17 09:36:06
单位做界面都习惯用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++呀


...全文
355 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiqiang01234 2016-05-19
  • 打赏
  • 举报
回复
引用 8 楼 quietwave 的回复:
[quote=引用 3 楼 jiqiang01234 的回复:] 在android上根本没必要java转Qt
那QT For Android,就没有市场啦?[/quote] 在android上java已经是官方语言,各种库很齐备,Qt无法和java的生态相比。就像楼上有人说的,除非想一套代码打遍天下,否则使用Qt的意义不大。我倒是建议如果想在android下写c++,ndk是个不错的选择
dext 2016-05-18
  • 打赏
  • 举报
回复
关于 C++ 语法 和 Java 的语法 没有什么可说的,就是习惯问题。 至于Android 上的开发,我还是推荐 Java,如果公司 是迁移到Android 或者 跨 Desktop OS, iOS 之类的话,另当别论。 每个公司 代码都有自己的风格,看不惯,不好,可能还有很多历史原因。你这种 推倒重来的想法只适合在新型创业公司。 某种意义上,我不是很喜欢 有GC的语言。并不是因为速度慢,是因为 计算机 的资源 申请 回收 本来就是成对 操作的。内存 申请回收 只是计算机资源的一部分,文件打开 你能不关闭么?socket 开了,你能不关么?Java C# 这种只负责 内存的“半吊子”,我是没有什么感觉。 至于你说的那个两个函数调用,完全可以封装一下。count(arr,n,&a); 可以通过或异常来捕捉 失败成功。当然 性能会有损失。 toHexStr 的话,只要你仔细注意Qt文档你会发现,QString::isNull其实就是 一个异常返回。 少抱怨,静下心来 多看看。
quietwave 2016-05-18
  • 打赏
  • 举报
回复
我得说一下,我们的主要业务还是Android qt 只是一个临时的小项目。我也没有抱怨,就是想跟大家交流一下,想看看专业的qt是如何编程的
jiqiang01234 2016-05-18
  • 打赏
  • 举报
回复
在android上根本没必要java转Qt
quietwave 2016-05-18
  • 打赏
  • 举报
回复
引用 6 楼 foxyz 的回复:
Qt还真是原生的C++所以应该是你遗忘了许多的C++知识。主要问题还是写惯了java代码回头不习惯C++的原因。
你没有看仔细,我是说我同事的写法,不够原生的C++. 原生的C++,如果编译时可以分配空间的,不需要等到运行时,再new再动态分配吧。 我还记得老师讲过,在栈上分配要比堆上快。 我是说,下面那种,仿Java的写法不够原生C++.
quietwave 2016-05-18
  • 打赏
  • 举报
回复
引用 3 楼 jiqiang01234 的回复:
在android上根本没必要java转Qt
那QT For Android,就没有市场啦?
quietwave 2016-05-18
  • 打赏
  • 举报
回复
引用 1 楼 dext 的回复:
至于Android 上的开发,我还是推荐 Java,如果公司 是迁移到Android 或者 跨 Desktop OS, iOS 之类的话,另当别论。
感谢版主的专业回答。谢谢您的建议。又学习了一招,以前都没有注间过QString::isNull() 也要学习在C++中使用异常了。 以后发贴子,我得写清背景,我们做QT是一个桌面程序,是一个配置小工具,在PC上运行的。并不是在Android上运行的。所以,我才想用Java Swing实现 可以这样理解吗,Java只是对C++的一个精简,并做了很多设计模式上的指引。但是,Java的所有功能C++也都能实现。 Java的接口是一个抽象类 其他的Java里面有引用,C++里面也有引用。不同的是C++的引用必须在定义时就赋初值。 算了,这写这些吧。
FlyToTMoon 2016-05-18
  • 打赏
  • 举报
回复
带着怨气看一个语言,能看到什么。不愿意接受就换个工作好了,java的工作也不少
donwmufromdying 2016-05-18
  • 打赏
  • 举报
回复
Qt还真是原生的C++所以应该是你遗忘了许多的C++知识。主要问题还是写惯了java代码回头不习惯C++的原因。
蒲锦_up 2016-05-18
  • 打赏
  • 举报
回复
没用c++写过android ,大学用的vs ,现在忘记的差不多了 哈哈

16,216

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧