【C++】38.类成员变量声明为 对象与指针的区别
在我们平时写代码或阅读代码时,经常会看到,某个类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.类成员变量声明为 对象与指针的区别相关推荐
- java中如何声明班干部,java类成员变量的定义和声明
在 Java 中类的成员变量定义了类的属性.例如,一个学生类中一般需要有姓名.性别和年龄等属性,这时就需要定义姓名.性别和年龄 3 个属性.声明成员变量的语法如下:[public|protected| ...
- java 成员变量声明顺序_C++核心准则讨论:按照成员声明的顺序定义和初始化成员变量...
Discussion: Define and initialize member variables in the order of member declaration 讨论:按照成员声明的顺序定义 ...
- C++ static、const和static const类型成员变量声明及其初始化
C++ static.const和static const类型成员变量声明及其初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. ...
- 【Java开发语言 03】第三章 面向对象编程(面向对象与面向过程+类和对象+类成员一:属性+类成员二:方法+对象的创建和使用+封装和隐藏+构造器+关键字this,package,import)
面向对象编程 1 面向对象与面向过程 1.1 java类及类的成员 2 java语言的基本元素:类和对象 2.1 类的语法格式 2.2 创建Java自定义类 2.3 对象的创建及使用 3 类的成员之一 ...
- 使用Mockito对类成员变量进行Mock
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Mock ...
- java实例成员和类成员变量_Java 中成员变量又分为 和类成员变量。_学小易找答案...
[简答题]I'm not quite so poetic, but I do know that the subway is as essential to the character of New ...
- 编写Java程序,创建Dota游戏中的兵营类,兵营类有一个类成员变量count、一个实例变量name和另一个实例变量selfCount。
返回本章节 返回作业目录 需求说明: 创建Dota游戏中的兵营类 兵营类有一个类成员变量count.一个实例变量name和另一个实例变量selfCount. count表示的是兵营已经创建士兵的总数: ...
- C++---类成员变量定义为引用
C++---类成员变量定义为引用 摘要:类成员变量是可以定义为引用类型的,但是我们需要注意一下用法 note1:在类中定义引用变量, 必须要在初始化列表中初始化该成员变量(const 类型数据成员也必 ...
- C++中两个类中互相包含对方对象的指针问题
前几天很不爽,因为C++中两个类中互相包含对方对象的指针编译时提示某一个类未定义...所以我就想啊想,这样也对,我的头文件都有#ifndef的,包含了一次就不能再包含了,以为就实现不了这样的功能,于是 ...
最新文章
- D2 日报 2019年6月11日
- 让程序常驻后台运行的原理和方法
- c++控制台下输出sin函数图形
- Java创建一个文件变量_java如何定义一个类,创建它的成员变量和方法?
- C# 把字符串类型日期转换为日期类型
- php 动态显示数字,php – 如何动态创建具有指定数字的图像?
- “约见”面试官系列之常见面试题第二十二篇之函数闭包(建议收藏)
- bit java实验2_2018-2019-2 20175120 实验五《Java网络编程》实验报告
- Nexus 3.X(Maven仓库私服)仓库迁移与备份
- THINKPHP3文件缓存管理
- 总结几个经典的java陷阱给大家。
- kotlin面向对象实战~
- java终止程序语句总结 System.exit(1)、System.exit(0)、return;break;continue;
- backupexec Oracle授权,通过BackupExec重定向Oracle 8I数据库
- 2022年2月份报告合集(共326份)
- 几种简单的图像加密方法
- aes ccm模式 java_AES_GCM和AES_CCM的选择
- 嵌入式系统设计师需要掌握什么
- swift 打开第三方应用_Swift常用第三方
- HDU 2566 统计硬币 【模拟】