首页 > 编程语言 >C++中的类指针

C++中的类指针

时间:2023-09-20 11:55:06浏览次数:36  
标签:函数 对象 多态 C++ 内存 Student 指针

Student a; 
s.setName("A");

// Studeng *b = new Student();
Student *b;				// 声名指针
b = new Student();		// 动态分配内存
b->setName("B");		// 访问成员函数

分析

  定义类对象基本格式是:Student a;在定义时就已经为a对象分配好了内存空间,且为内存栈

  定义类指针基本格式是:Student *b = new Student();在定义*b的时候并没有分配内存空间,在执行new关键字后才真正为其分配内存,且为内存堆

类对象类指针区别

A: 定义

类对象:

  利用类的构造函数(构造函数:对类进行初始化工作)在内存中分配一块区域(包括一些成员变量赋值);

类指针:

  是一个内存地址值,指向内存中存放的类对象(包括一些成员变量赋值;类指针可以指向多个不同的对象,这就是多态);

B: 使用

引用成员:

  • 对象使用 . 操作符
  • 指针用 -> 操作符

生命周期:

  • 若是成员变量,则由类的析构函数来释放空间;若是函数中临时变量,则作用域是函数体内;
  • 而指针则需要利用delete在相应的地方释放分配的内存块。

注意:new与delete必须要成对存在!!!

C: 存储位置

类对象:

  用的是内存栈,是个局部的临时变量;

类指针:

  用的是内存堆,是个永久变量,除非主动释放它,不然一直在。

D: 多态

  指针可以实现多态,直接用对象不行。

F: 访问方式

  • 指针变量是间接访问,但可实现多态(通过父类指针可调用子类对象),并且没有调用构造函数;
  • 直接声明可直接访问,但不能实现多态,声明即调用了构造函数(已分配了内存)。

(2)类对象和类指针联系

  • 在类的声明尚未完成的情况下,可以声明指向该类的指针,但是不可声明该类的对象;
  • 父类的指针可以指向子类的对象。

(3)指针与多态

  由前面可知:类指针是一个指向内存中存放类对象的内存地址值,那么这个指针可以指向多个不同的对象,这就是多态

拓展:指针 与 虚函数

  要发挥虚函数的强大作用,必须使用指针来访问对象。

当类是有虚函数的基类,Func是它的一个虚函数,则调用Func时:

  • 类对象:调用的是它自己的Func;
  • 类指针:调用的是分配给它空间时那种类的Func。

(4)什么情况使用类对象与类指针?

  • 其实作用基本一样 都是为了调用类的成员变量和成员函数用的;

  • 当你希望明确使用这个类的时候,最好使用对象;

  • 如果你希望使用 C++ 中的动态绑定,则最好使用指针或者引用,指针和引用用起来更灵活,容易实现多态等。

(5)指针好处

  第一,实现多态。

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

标签:函数,对象,多态,C++,内存,Student,指针
From: https://www.cnblogs.com/hhddd-1024/p/17716980.html

相关文章

  • C++文件的读写
    文件读写函数库对于文件对象的操作,主要使用库:#include<fstream>类可以定义三种类对象:ifstream定义的对象只能读文件ofstream定义的对象只能写文件iofstream定义对象既能读文件,也能写文件类定义的对象中open()方法的第二个参数文件模式(filemode)有多种属性:in:......
  • C++ STL之向量vector
    /*vector_example.cpp*/#include<iostream>#include<vector>#include<string>usingnamespacestd;intmain(){vector<string>msg={"Hello","C++","World","from","VSCode"......
  • C++中的转换构造函数
    在C/C++中,不同的数据类型之间可以相互转换。无需用户指明如何转换的称为自动类型转换(隐式类型转换),需要用户显式地指明如何转换的称为强制类型转换。自动类型转换示例:inta=6;a=7.5+a;编译器对7.5是作为double类型处理的,在求解表达式时,先将a转换为double类型,然......
  • C++ 类成员函数全家桶
    RAIIResourceAcquisitionIsInitialization,资源获取即初始化这是一种解决资源管理问题的方法,将资源的有效期与持有资源的对象的生命期严格绑定,由对象的构造函数完成资源的分配,由析构函数完成资源的释放C++借助构造函数和析构函数,解决了传统的malloc&free和new&del......
  • WebAssembly实践指南——C++和Rust通过wasmtime实现相互调用实例
    C++和Rust通过wasmtime实现相互调用实例1wasmtime介绍wasmtime是一个可以运行WebAssembly代码的运行时环境。WebAssembly是一种可移植的二进制指令集格式,其本身与平台无关,类似于Java的class文件字节码。WebAssembly本来的设计初衷是想让浏览器可以运行C语言这种编译型语言的......
  • C++-类和对象(5)
    今天,继续和大家分享与类和对象相关的知识,本次的内容包含日期类的实现,const成员,static成员及友元函数等方面。继上篇文章,我们说到了日期类前置++和后置++的实现。现在,我们从前置--和后置--接着往下,完成我们日期类的实现。日期类的实现日期类前置--和后置--的实现在实现前置--和后置-......
  • 不透明指针
    typedefstructpmpi_s*pmpi;pmpips1=null;制作库的时候,不希望将结构体暴露在.h中,怎么办呢?由voidhandle_s(structpmpi_s*p)变为voidhandle_s(pmpi*p)参考文章1使用typedef来抽象存在的结构体参考文章2......
  • 开发微信支付C/C++代码
     抄自:  https://zhuanlan.zhihu.com/p/606909332?utm_id=0 在QtC++中实现微信收费使用功能需要借助微信开放平台提供的API接口,具体步骤如下:注册微信开放平台账号,并创建应用。在创建应用时,需要选择相应的应用类型(如网页应用、移动应用等)和使用场景(如公众号、小程序等),并......
  • visual studio 配置 c++ 引入三方库 注意事项:
    1、首先需要注意配置的选项要和运行的选项一致(如果要运行debug下32位的程序就需要配置Configuration选择Debug,platform选32) 2、这个是根据需要生成lib、dll、还是windows程序来选择:  VC++目录默认不要修改: 这里添加引入#include所需要的头文件 这个地方配置链......
  • 关联式数据结构_红黑树剖析 #C++
    红黑树的性质和定义红黑树的性质红黑树是一种平衡搜索二叉树。红黑树的每个节点存储了一个标记颜色的变量(红色或黑色),通过对任意一条从根到叶子结点的路径中节点着色方式的限制,使树的最长路径不超过最短路径的两倍,因而红黑树处于一种近似平衡的状态。与AVL树相比,红黑的平衡条件更......