C++基础系列(一) 对象指针

news2024/9/24 11:25:16

一. 函数指针和指针函数

1.1 函数指针

         这两个是C语言里两个比较绕的概念,我们先说一下函数指针

         函数指针本质是一个指针,该指针的地址指向了一个函数。

         在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址,而且函数名表示的就是这个地址。

        写法如下:   

        函数返回值类型 (* 指针变量名) (函数参数列表);

        int  (*fun) (int a , int b);

1.2 指针函数

         指针函数本质是一个函数, 其返回值为指针

         指针函数是一个函数。函数都有返回类型(如果不返回值,则为无值型),只不过指针函数返回类型是某一类型的指针。

        写法如下:

        *类型标识符 函数名(参数表);

        int  *fun(int x,int y);

       常规函数和指针函数区别: 在函数名前面多了一个 * 号,而这个函数就是一个指针函数。其返回值是一个 int 类型的指针,是一个地址。

其他理解方式:

指针函数:int* fun(int x,int y);

函数指针:int (*fun)(int x,int y);

可以简单粗暴的理解为,指针函数的*是属于数据类型的,而函数指针的星号是属于函数名的。

一个很简单的判定方法就是观察(*),记住其中一个即可:

int (*p)(int,int);有括号,*与p结合,*p就是个指针,指向返回值为整型且有两个整型参数的函数的指针,因此称为函数指针。

int*p(int,int); 没有括号,*与int结合,int*为返回类型,p就是一个函数名,这时就是一个指针函数,只不过返回值类型为int*。

二. 对象指针

      我们在来看看C++中的对象指针

2.1 指向对象成员函数的指针

        需要注意的:定义指向对象成员函数的指针变量的方法和定义指向普通函数的指针变量方法所有不同。

        指向普通函数的指针变量就是第一小节中说的函数指针

   而定义一个指向对象成员函数的指针变量要复杂一点,直接通过代码来说明

#include <iostream>
using namespace std;

class Time {
    public:
    Time(int, int, int);  //声明带参构造函数
    int hour;
    int minute;
    int sec;
    void get_time(); // 声明共有成员函数
};


Time :: Time(int h, int m, int s) {
    hour = h;
    minute = m;
    sec = s;
}

void Time::get_time() {
    cout<<hour <<":" <<minute << ":" << sec << endl;
}

int main(int argc, const char** argv){
    Time t1(10, 20, 25);  // 定义Time对象t1
    int *p = &t1.hour; //定义指向整型数据的指针变量p  并使p指向t1.hour
    cout<< *p << endl;  
    
    t1.get_time(); //调用对象 t1的成员函数get_time()

    Time *p2 = &t1;  //定义指向Time 类对象的指针变量 p2, 并使 p2指向   t1
    p2->get_time();  // 调用  p2 所指对象(即t1)的get_time() 方法

    void (Time :: *p3) (); //定义指向Time类公用成员函数的指针变量p3;
    p3 = &Time::get_time;  // 使p3指向Time类公用成员函数get_time();

    (t1.*p3)(); //调用对象 t1中   p3所指的成员函数即 t1.get_time();

     void (Time :: *p4) () = &Time::get_time; // 定义指针变量时指定其指向

    return 0;
}

打印输出:

10
10:20:25
10:20:25
10:20:25

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1110676.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

金融机器学习方法:K-均值算法

目录 1.算法介绍 2.算法原理 3.python实现示例 1.算法介绍 K均值聚类算法是机器学习和数据分析中常用的无监督学习方法之一&#xff0c;主要用于数据的分类。它的目标是将数据划分为几个独特的、互不重叠的子集或“集群”&#xff0c;以使得同一集群内的数据点彼此相似&…

window.location对象实例详解

一、前言 Window.location 只读属性返回一个 Location 对象&#xff0c;其中包含当前标签页文档的网页地址信息。 Window.location 是一个只读 Location 对象&#xff0c;但是我们仍然可以去重新赋值更改对象值。 下面就让我们详细介绍一下location的常用属性和方法&#xf…

基于springboot实现滴答拍摄影项目【项目源码+论文说明】

摘要 拍摄能让人放开自我、因看到不同的美景都想留下美好的记忆&#xff0c;有些人喜欢拍摄静物来表现宁静的氛围&#xff0c;通过小品类的照片&#xff0c;传达内心的情绪。而我更喜欢另一种方式&#xff0c;就是用长时间曝光把波动的海水或湖水雾化&#xff0c;拍摄出来的作…

为什么产品经理都要考NPDP?

最近很多宝子问我&#xff0c;产品经理适合考什么证书&#xff1f;那必然是NPDP啊&#xff01;作为国际产品专业认证&#xff0c;NPDP证书是现如今最炙手可热且含金量相对较高的证书了&#xff0c;下面胖圆讲给大家详细介绍一下NPDP证书的具体信息。 1&#xff09;NPDP是什么&…

Win10下基于VS2015编译SQLite3源码

一、下载SQLite SQLite SQLite Download Page 下载红框部分的3个文件 提示&#xff1a;这里有个 sglite-autoconf-3420000.tar.gz 是免编译版&#xff0c;想省事就下载这个&#xff0c;但我自己用这个老是编译不过 所以我这里不推荐这个了 二、配置SQLite 打开vs 2015或者其他…

vscode中快速生成vue3模板

步骤&#xff1a;设置 -> 用户代码片段 -> vue.json&#xff08;没有vue.json,选vue也可&#xff09;-> 定义自己所需的代码段 代码段 如下&#xff0c; {"Print to console": {"prefix": "vue3", //键入该值&#xff0c;按tab…

自定义类型(结构体 , 枚举 , 联合)详解

文章目录 结构体结构体变量初始化结构体内存对齐结构体的对齐规则:为什么存在内存对齐 修改默认对齐数结构体实现位段(位段的填充&可移植性)什么是位段(位是二进制位)位段的内存分配位段的跨平台问题 实现offsetof&#xff08;计算结构体成员相较于起始位置的偏移量&#x…

Netty入门指南之基础介绍

作者简介&#xff1a;☕️大家好&#xff0c;我是Aomsir&#xff0c;一个爱折腾的开发者&#xff01; 个人主页&#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏&#xff1a;Netty应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献介绍为什么…

报错:AttributeError: module ‘tensorflow‘ has no attribute ‘flags‘

改成如下&#xff1a; 报错原因&#xff1a;tensorflow1.x与2.x版本问题不兼容

重装操作系统后 gitee:Failed to create Gitee Repository

错误描述 重装系统后&#xff0c;提交项目代码到gitee程序报错&#xff1a; 11:21 Failed to create Gitee Repositorydetected dubious ownership in repository at E:/Workspaces/SpringBoot/saTokenE:/Workspaces/SpringBoot/saToken is owned by:S-1-5-21-1301660696-421…

【已解决】ubuntu耳机单侧有声音

背景 台式机&#xff0c;双系统&#xff1a;win10 ubuntu 20.04&#xff1b;ubuntu 系统当中&#xff0c;左侧耳机有声音&#xff0c;右侧没有&#xff1b; 解决方法 终端输入&#xff1a;alsamixer&#xff0c;显示下面的图片&#xff1a; 调整方法&#xff1a;键盘上下左…

微信native-v3版支付对接流程及demo

1.将p12证书转为pem证书&#xff0c;得到商户私钥 openssl pkcs12 -in apiclient_cert.p12 -out apiclient_cert.pem -nodes 密码是&#xff1a;商户id 2.将获取到的apiclient_cert.pem证书&#xff0c;复制出这一块内容&#xff0c;其他的不要 3.下载这个工具包 https://gi…

Sqoop技术文档笔记

Sqoop是一个用于在Hadoop和关系型数据库之间传输数据的开源工具。它可以将结构化数据从关系型数据库&#xff08;如MySQL、Oracle、SQL Server等&#xff09;导入到Hadoop的分布式文件系统&#xff08;HDFS&#xff09;或hive中&#xff0c;并且可以将数据从HDFS、hive导出到关…

数据分析在游戏行业的应用

数据分析在游戏行业中扮演着至关重要的角色&#xff0c;它可以用于以下方面&#xff1a; 1、玩家行为分析 了解玩家在游戏中的行为&#xff0c;包括游戏时长、最喜欢的游戏模式、关卡通过率等&#xff0c;从而为游戏设计和运营提供参考。 2、留存率 监控玩家在游戏中的持续参…

ChatGPT/GPT4科研技术应用与AI绘图及论文高效写作

2023年我们进入了AI2.0时代。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车&#xff0c;就有可能被淘汰在这个数字化时代&#xff0c;如何能高效地处理文本、文献查阅、PPT…

交换奇偶位

写一个宏&#xff0c;可以将一个整数的二进制位的奇数位和偶数位交换。 要交换二进制位的奇数位和偶数位&#xff0c;那么肯定要先拿到奇数位和偶数位&#xff0c;然后让奇数位左移一位&#xff0c;偶数位右移一位&#xff0c;再将移动后的这两组数相加就可以了&#xff08;一个…

【网络安全】被恶意攻击的IP地址有多可怕?

被恶意攻击的IP地址可以导致一系列问题&#xff0c;其严重性和可怕程度取决于攻击的性质、目标、攻击者的动机以及受影响的系统或组织。以下是一些可能出现的问题和可怕性的因素&#xff1a; 数据泄露和盗窃&#xff1a;攻击者可能试图入侵系统&#xff0c;窃取敏感数据&#x…

barzilar_borwein算法微调函数的优化收敛

import optimtool as oo from optimtool.base import np, sp, pltpip install optimtool>2.4.2加载barzilar_borwein算法 import optimtool.unconstrain as ou barzilar_borwein ou.gradient_descent.barzilar_borwein初始化输入数据 f ( x ) ∑ i 1 n / 2 c ( x 2 i −…

ZKP4.2 SNARKs via Interactive Proofs (Sum-check Protocol [LFKN90])

ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 4: SNARKs via Interactive Proofs (Justin Thaler) 4.3 Interactive proof design: Technical Preliminaries SZDL Lemma Equal test (in multivariate polynomials) Low-Defree and Multilinear Extensions Extensions …

新版多功能去水印工具微信小程序源码下载+带流量主功能

新版多功能去水印工具微信小程序源码下载&#xff0c;带流量主功能。自带去水印接口的多功能小程序&#xff0c;支持各大平台短视频去水印。 支持保存封面、图集、标题等等&#xff1b;支持本地图片去水印&#xff1b;支持图片拼接&#xff1b;支持九宫格切图&#xff1b;支持修…