在我们平时写代码或阅读代码时,经常会看到,某个类A中需要使用另一个类B的方法。那么下面会看到两种用法:

  • 一种是直接定义一个B类对象。
  • 一种是在类A中定义一个B类指针;

如:

// 头文件
std::shared_ptr<cv::Mat>  img_ptr_;
std::shared_ptr<BlockingQueue<std::shared_ptr<cv::Mat>>>img_queue_ptr_;
// .cc文件
// std::make_shared在动态内存中分配一个对象并初始化它, 返回指向此对象的shared_ptr
img_ptr_= std::make_shared<cv::Mat>;
img_queue_ptr_ = std::make_shared<BlockingQueue<std::shared_ptr<cv::Mat>>>(1);

//定义在 头文件 .h 中,声明一个基类接口指针,没分配内存
std::unique_ptr<Visualizer> visualizer_;
//在 .cc文件中,将指针重置为类指针,并分配内存
visualizer_.reset(new Visualizer());

还有下面这种基类子类指针用法:

//定义在 头文件 .h 中,声明一个基类接口指针,没分配内存
std::unique_ptr<BaseDetector> detector_;
//在 .cc文件中,将指针重置为某个具体子类指针,并分配内存
detector_.reset(new Pix2pixDetector());

原文链接
类的指针:他是一个内存地址值,他指向内存中存放的类对象(包括一些成员变量所赋的值).
对象,他是利用类的构造函数在内存中分配一块内存(包括一些成员变量所赋的值).
在应用时:
1.引用成员: 对象用" . “操作符; 指针用” -> "操作符.
2.生命期: 若是成员变量,则是类的析构函数来释放空间;若是函数中的临时变量,则作用域是该函数体内.而指针,则需利用delete 在相应的地方释放分配的内存块.
注意:用new ,一定要delete…

类的对象:用的是内存栈,是个局部的临时变量.
类的指针:用的是内存堆,是个永久变量,除非你释放它.

当类是有虚函数的基类,Func是它的一个虚函数,则调用Func时:
类的对象:调用的是它自己的Func;
类的指针:调用的是分配给它空间时那种类的Func;

对于一个类的对象和这个类的指针(用new运算符分配内存)在应用时有何区别
1.类和对象是两回事,对象是类的实例;
2.对象是在栈中分配的,使用new生成的对象是在堆中分配的;
3.要发挥虚函数的强大作用,必须使用指针来访问对象.

指针可以实现多态,直接用对象不行
执行定义对象,在栈空间
new的在堆

类型决定了你能做什么.

其实作用基本一样 都是为了调用类的成员变量 和成员函数用的
当你希望明确使用这个类的时候,最好使用对象,如果你希望使用C++中的动态绑定,则最好使用指针或者引用
指针和引用用起来更灵活,容易实现多态

1.在类的声明尚未完成的情况下,可以声明指向该类的指针,但是不可声明该类的对象…
2.父类的指针可以指向子类的对象…

定义对象实例时,分配了内存。指针变量则未分配类对象所需内存,除非new

指针变量是间接访问,但可实现多态(通过父类指针可调用子类对象),并且没有调用构造函数。
直接声明可直接访问,但不能实现多态,声明即调用了构造函数(已分配了内存)。
至于那个效率高要看程序调用过程而定。

C++的精髓之一就是多态性,只有指针或者引用可以达到多态。对象不行

用指针:
第一实现多态。
第二,在函数调用,传指针参数。不管你的对象或结构参数多么庞大,你用指针,传过去的就是4个字节。如果用对象,参数传递占用的资源就太大了

原文链接
C++编程过程中,在一个类的数据成员是一个类时,定义这个成员变量为对象还是指针是有讲究的。

在C++中,

ClassTest objTest;就已经构造了对象,分配了空间

而在C#Java中,

ClassTest objTest;只是声明,并没有分配空间。

在C++中,ClassTest objTest;是在栈上分配空间,ClassTest *pobjTest = new ClassTest;是在堆上分配空间。
栈分配的空间自动回收,堆分配的空间需要手动回收。

那么对于C++类中数据成员为类类型时,将它定义为对象还是指针,并没有绝对的情况,具体情况可以具体对待。

本质上是对象分配区域的问题:前者是在栈(stack)上分配空间,后者是在堆(heap)上分配空间。

一般来说,可以定义为对象,在如下情况考虑把数据成员定义成指针:

  • 1)有多态的情况;会用到虚函数,基类指针;
  • 2)可能和别的类共享,或只是引用别的类里的某个对象,所以生命周期不是很确定(这个可以考虑智能指针);
  • 3)大数据类,如果定义成对象,会导致当前对象无法在栈内创建。

【C++】38.类成员变量声明为 对象与指针的区别相关推荐

  1. java中如何声明班干部,java类成员变量的定义和声明

    在 Java 中类的成员变量定义了类的属性.例如,一个学生类中一般需要有姓名.性别和年龄等属性,这时就需要定义姓名.性别和年龄 3 个属性.声明成员变量的语法如下:[public|protected| ...

  2. java 成员变量声明顺序_C++核心准则讨论:按照成员声明的顺序定义和初始化成员变量...

    Discussion: Define and initialize member variables in the order of member declaration 讨论:按照成员声明的顺序定义 ...

  3. C++ static、const和static const类型成员变量声明及其初始化

    C++ static.const和static const类型成员变量声明及其初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. ...

  4. 【Java开发语言 03】第三章 面向对象编程(面向对象与面向过程+类和对象+类成员一:属性+类成员二:方法+对象的创建和使用+封装和隐藏+构造器+关键字this,package,import)

    面向对象编程 1 面向对象与面向过程 1.1 java类及类的成员 2 java语言的基本元素:类和对象 2.1 类的语法格式 2.2 创建Java自定义类 2.3 对象的创建及使用 3 类的成员之一 ...

  5. 使用Mockito对类成员变量进行Mock

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Mock ...

  6. java实例成员和类成员变量_Java 中成员变量又分为 和类成员变量。_学小易找答案...

    [简答题]I'm not quite so poetic, but I do know that the subway is as essential to the character of New ...

  7. 编写Java程序,创建Dota游戏中的兵营类,兵营类有一个类成员变量count、一个实例变量name和另一个实例变量selfCount。

    返回本章节 返回作业目录 需求说明: 创建Dota游戏中的兵营类 兵营类有一个类成员变量count.一个实例变量name和另一个实例变量selfCount. count表示的是兵营已经创建士兵的总数: ...

  8. C++---类成员变量定义为引用

    C++---类成员变量定义为引用 摘要:类成员变量是可以定义为引用类型的,但是我们需要注意一下用法 note1:在类中定义引用变量, 必须要在初始化列表中初始化该成员变量(const 类型数据成员也必 ...

  9. C++中两个类中互相包含对方对象的指针问题

    前几天很不爽,因为C++中两个类中互相包含对方对象的指针编译时提示某一个类未定义...所以我就想啊想,这样也对,我的头文件都有#ifndef的,包含了一次就不能再包含了,以为就实现不了这样的功能,于是 ...

最新文章

  1. D2 日报 2019年6月11日
  2. 让程序常驻后台运行的原理和方法
  3. c++控制台下输出sin函数图形
  4. Java创建一个文件变量_java如何定义一个类,创建它的成员变量和方法?
  5. C# 把字符串类型日期转换为日期类型
  6. php 动态显示数字,php – 如何动态创建具有指定数字的图像?
  7. “约见”面试官系列之常见面试题第二十二篇之函数闭包(建议收藏)
  8. bit java实验2_2018-2019-2 20175120 实验五《Java网络编程》实验报告
  9. Nexus 3.X(Maven仓库私服)仓库迁移与备份
  10. THINKPHP3文件缓存管理
  11. 总结几个经典的java陷阱给大家。
  12. kotlin面向对象实战~
  13. java终止程序语句总结 System.exit(1)、System.exit(0)、return;break;continue;
  14. backupexec Oracle授权,通过BackupExec重定向Oracle 8I数据库
  15. 2022年2月份报告合集(共326份)
  16. 几种简单的图像加密方法
  17. aes ccm模式 java_AES_GCM和AES_CCM的选择
  18. 嵌入式系统设计师需要掌握什么
  19. swift 打开第三方应用_Swift常用第三方
  20. HDU 2566 统计硬币 【模拟】

热门文章

  1. 【android-tips】installfailedinsufficientstorage解决方案
  2. 携程在线风控系统架构
  3. 快速定位java系统的线上问题--转
  4. 支付系统路由系统设计
  5. 十分钟教你开发EOS智能合约
  6. 亚马逊与微软赢得一亿美元云计算合约,IBM黯然神伤
  7. 八、【栈和队列】栈的应用
  8. 深入理解分布式技术 - 分布式调用跟踪
  9. 并发编程-03线程安全性之原子性(Atomic包)及原理分析
  10. 实战SSM_O2O商铺_20【商铺编辑】View层开发