C++函数指针+对象指针+this指针+指向类静态和非静态成员的指针

 更新时间:2022年03月10日 11:50:49   作者:机器学习入坑者  
这篇文章主要介绍了C++函数指针+对象指针+this指针+指向类静态和非静态成员的指针,函数指针定义和赋值的语法指其中数据类型代表指向函数的返回类型,形参表为指向函数的形参表,更多相关资料需要的朋友可以参考一下下面文章内容

1、指向函数的指针

函数的代码在内存中的首地址,是由函数名表示的,也就是说函数名等价于函数代码首地址。因此,可以定义一个指向函数的指针,即函数指针。函数指针定义和赋值的语法如下,其中数据类型代表指向函数的返回类型,形参表为指向函数的形参表;赋值时必须保证指向的函数名和函数指针的返回类型和形参完全相同:

数据类型 (*函数指针名)(形参表);
函数指针名 = 函数名;

下面的例子定义了一个函数和一个函数指针,通过函数指针调用函数代码:

/// 1、预先定义一个返回int类型的函数
int addOne(int x) {
    x = x + 1;
    return x;
}

/// 2、定义并赋值函数指针
int (*pointerAddOne)(int x);
pointerAddOne = addOne;

/// 3、使用函数指针和使用函数名的方式相同
data = pointerAddOne(data);

2、对象指针

顾名思义,对象指针表示指向对象的指针。对象名即对象的地址,所以可以将对象的地址赋值给同类型的指针,从而通过该指针使用此对象。

定义与使用对象指针包含4个步骤:

  • 定义XXX类型指针;
  • 定义XXX类型对象;
  • 将对象地址赋值给指针;
  • 使用“(*对象指针名).成员名”或者“对象指针名->成员名”的形式使用对象的成员;

下面的例子展示了对象指针的定义与使用:

Duck duck(666);
/// 定义并赋值对象指针
Duck *pointerDuck;
pointerDuck = &duck;
/// 对象指针采用两种方式访问对象的成员
printf("%d \n", (*pointerDuck).getAge());
printf("%d \n", pointerDuck->getAge());

3、this指针

C++中,类的每个对象的数据成员都需要单独分配内存,但是类的所有对象的函数成员共享内存。this指针是对象的非静态成员函数的隐含参数,不需要自己进行定义,this指针指向当前调用非静态成员函数的对象。当类对象调用非静态成员函数时,对象的地址作为this指针的值,进而非静态成员函数通过this指向的地址,来访问对象的数据成员(类的不同对象的数据成员存储在不同的地址,this指针用于传递对象的地址)。

this指针访问其指向的对象数据成员的语法为:

this->数据成员名

下面的例子中,Duck类的成员函数getAge需要访问对象的数据成员duckAge,但是由于函数中已经存在同名的duckAge变量,所以需要通过this来访问数据成员duckAge

class Duck{
public:
    Duck(int age) { duckAge = age; };
    int getAge() { 
        int duckAge = 3;
            /// 通过this访问对象的数据成员duckAge,而不是局部变量duckAge
        return this->duckAge; 
    };
private:
    int duckAge;
};

4、指向类的非静态成员的指针

首先,类的静态成员和非静态成员是不同的,静态成员属于类,而非静态成员属于对象。指向类的非静态成员的指针,包含指向数据成员的指针和指向函数成员的指针。声明时需要指明指针指向的“类名”和“类型”,类型表示数据成员或函数成员的数据类型:

类型 类名::*数据成员指针名;
类型 (类名::*函数成员指针名)(参数表);

下面定义的Duck类包含public成员:int类型数据成员duckWeight和int类型函数成员getAge()(指向非静态成员的指针也必须遵守访问权限,不能指向private成员)下面分别声明指向二者的指针:

int Duck::*pointerDuckWeight;
int (Duck::*pointerGetAge)();

指向非静态成员的数据指针和函数指针赋值语法为:

数据成员指针名 = &类名::数据成员名;
函数成员指针名 = &类名::函数成员名;
下面对两个指针进行赋值:

pointerDuckWeight = &Duck::duckWeight;
pointerGetAge = &Duck::getAge;

上面进行的声明和赋值都是针对类进行的,所以并没有指向对象的成员地址。这里涉及到类的定义过程,类定义时并没有分配内存,而只是确定各个数据成员所占内存大小和相对位置。所以,可以使用对象的起始地址加相对位置对数据成员进行访问。非静态数据成员指针访问成员的语法有如下两种方式:

对象名.*数据成员的指针名
对象指针名->*数据成员指针名

/// 调用例子
printf("%d \n", duck.*pointerDuckWeight);

函数成员并不针对每个对象都有一个副本,而是共享的。对象调用函数成员时需要通过this指针,非静态成员函数指针的调用包含下面两种语法:

(对象名.函数成员指针名)(实参表)
(对象指针名->*函数成员指针名 )(实参表)

/// 实际调用的例子
printf("%d \n", (duck.*pointerGetAge)());

5、指向类的静态成员的指针

对于类的静态数据成员和函数成员,由于其并不属于具体的对象,所以只需要普通的数据型指针和函数型指针即可。

下面定义的Duck类包含用static声明的静态数据成员和静态函数成员:

class Duck{
public:
    static int getAge() { 
        return 666;
    };
    static int duckWeight;
};
int Duck::duckWeight = 333;

下面是指向类的静态成员的数据型指针和函数型指针的定义和赋值过程:

int *pointerDuckWeight;
int (*pointerGetAge)();
/// 赋值语法:指针名=&类名:静态成员名
pointerDuckWeight = &Duck::duckWeight;
pointerGetAge = &Duck::getAge;

调用指针的时候,只需要遵守基本数据型指针和函数型指针的调用语法即可:

printf("%d \n", *pointerDuckWeight);
printf("%d \n", (*pointerGetAge)());

到此这篇关于C++函数指针+对象指针+this指针+指向类静态和非静态成员的指针的文章就介绍到这了,更多相关C++指针内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入了解C++封闭类的定义与使用

    深入了解C++封闭类的定义与使用

    一个类的成员变量如果是另一个类的对象,就称之为“成员对象”。包含成员对象的类叫封闭类(enclosed class)。本文主要和大家聊聊C++封闭类的使用,需要的可以参考一下
    2022-11-11
  • 数据结构与算法中二叉树子结构的详解

    数据结构与算法中二叉树子结构的详解

    这篇文章主要介绍了数据结构与算法中二叉树子结构的详解的相关资料,需要的朋友可以参考下
    2017-04-04
  • cocos2dx-3.10 C++实现滚动数字

    cocos2dx-3.10 C++实现滚动数字

    这篇文章主要为大家详细介绍了cocos2dx-3.10 C++实现滚动数字效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • 使用C语言编写钢琴小程序

    使用C语言编写钢琴小程序

    这篇文章主要为大家详细介绍了使用C语言编写钢琴小程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • C++中不得不说的map容器

    C++中不得不说的map容器

    大家好,本篇文章主要讲的是C++中不得不说的map容器,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • VC基于ADO技术访问数据库的方法

    VC基于ADO技术访问数据库的方法

    这篇文章主要介绍了VC基于ADO技术访问数据库的方法,较为详细的分析了VC使用ADO操作数据库的相关实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • C++模板二段名字查找方法

    C++模板二段名字查找方法

    下面小编就为大家带来一篇C++模板二段名字查找方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • C语言如何建立链表并实现增删查改详解

    C语言如何建立链表并实现增删查改详解

    这篇文章主要给大家介绍了关于C语言如何建立链表并实现增删查改的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C语言具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • C++ Qt之halcon读取像素项目过程详解

    C++ Qt之halcon读取像素项目过程详解

    这篇文章主要介绍了C++ Qt之halcon读取像素项目过程详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • C++构造函数详解

    C++构造函数详解

    这篇文章主要介绍了C++构造函数详解,上一篇文章我们介绍了定义了类,在使用之前,往往还需要对类进行初始化。这篇介绍的就是对类进行初始化的方法,需要的朋友可以参考一下
    2022-01-01

最新评论