初学C++时:对象是对象,指针是指针。
掌握Java后:有些混乱的C++。
1. C++中创建对象的两种方式
就说Qt包装后的 QList<T> ,一个类似于 Java 中的 List<T>的容器。
1.1 创建命名对象
它既可以这么用:
QList<QString> myList;
myList.append(“hahaha”);
//该对象用完即弃,跟随调用函数一起被自动销毁,无需手动析构销毁
//此方式类似于 声明个 普通的命名对象,变量名 myList 即该对象的名称
//使用该对象名称即可使用该对象
//该对象是在栈内分配的内存,属于局部变量。
//所以包含该对象的函数一旦执行完毕,该对象也随之销毁,不用主动执行析构函数
1.2 创建指向匿名对象的指针
也可以这么用:
QList<QString> *pMyList = new QList<QString>();
pMyList->append("hahaha");
pMyList->~QList(); //最后万万记得主动调用析构函数,否则此内存泄露
//此方式是在 Heap 堆 中分配存储
//所以在用完后,需要使用主动执行析构函数释放该匿名对象占用的堆存储
//因为该对象无名无姓,没有登记在册
//指向该匿名对象的指针(局部变量)一旦被销毁了,那这个匿名对象就
//再也无法被找到和管理了,被人遗忘了,这点内存就泄露了。
其中,QString是 Qt包装后,类似Java的String类。
恼人。
第一种写法是:创建一个命名对象,然后使用该对象名称 使用该对象,类似于Java的引用,和Java写法一致。这才是面向对象的用法。
第二种写法是:创建指向一个匿名对象的指针,使用C++特有的指针概念去间接使用该对象。指针这玩意和面向对象一点关系都没有。
2. 二者的使用场景
既然C++创造了这两种不同的用法,自然有其原因。二者的用途不同。
2.1 对象指针的用途
2.1.1 实现多态
C++作为面向对象语言,必须要实现面向对象的一个重要特性:多态性。
只有指针才能实现 多态性,而普通的对象不行。
如果你用到多态性,那就只能创建对象指针,使用对象指针。
至于多态性是什么,你用的时候,自然会知道。如果你不了解,那说明你用不到,那就用 命名对象的方式创建即可。
2.1.2 传输复杂数据简单高效
在函数调用,传递较为复杂的对象时,使用指向对象的指针作为参数,会更高效。
因为不管你的对象多么复杂和庞大,使用指向该对象的指针,那么只需把指针值(永远都是4个字节大小)传给函数即可。如果用对象作为参数,传递占用的资源就比较大。
2.2 命名对象的用途
简单使用,用完即弃。
参考资料