iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++函数指针,对象指针,this指针,指向类静态怎么用
  • 109
分享到

C++函数指针,对象指针,this指针,指向类静态怎么用

2023-06-29 11:06:58 109人浏览 独家记忆
摘要

这篇文章主要介绍了c++函数指针,对象指针,this指针,指向类静态怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++函数指针,对象指针,this指针,指向类静态怎么用文章都会有所收获,下面我们一起来看

这篇文章主要介绍了c++函数指针,对象指针,this指针,指向类静态怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++函数指针,对象指针,this指针,指向类静态怎么用文章都会有所收获,下面我们一起来看看吧。

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++函数指针,对象指针,this指针,指向类静态怎么用”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网其他教程频道。

--结束END--

本文标题: C++函数指针,对象指针,this指针,指向类静态怎么用

本文链接: https://www.lsjlt.com/news/324420.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c语言怎么计算字符串长度
    在C语言中,可以使用内置的strlen()函数来计算字符串的长度。该函数位于string.h头文件中。以下是一个示例代码: #inc...
    99+
    2024-05-14
    c语言
  • c语言怎么判断三个数的大小
    可以通过比较三个数之间的大小关系来判断它们的大小。以下是一个示例代码: #include <stdio.h> int ...
    99+
    2024-05-14
    c语言
  • c++排序函数sort怎么使用
    在C++中,使用sort函数对容器中的元素进行排序,可以按照默认的升序排列,也可以自定义排序规则。 下面是一个简单的例子,对一个ve...
    99+
    2024-05-14
    c++
  • c++中string的compare函数怎么使用
    在C++中,可以使用string的compare函数来比较两个string对象的大小。该函数的原型如下: int compare(c...
    99+
    2024-05-14
    c++
  • c++中string的compare函数有什么用
    c++中string的compare函数用于比较两个字符串的大小关系。该函数返回一个整数值,表示两个字符串的比较结果。 具体来说,如...
    99+
    2024-05-14
    c++
  • c++中print函数的功能有哪些
    在C++中,通常使用std::cout来进行输出操作,而不是使用print函数。std::cout是C++标准库中的一个输出流对象,...
    99+
    2024-05-14
    c++
  • c语言数据结构怎么使用
    在C语言中,数据结构可以通过定义结构体来实现。以下是一些常见的数据结构的使用方法示例: 链表: #include <std...
    99+
    2024-05-14
    c语言
  • c++中print函数的用法是什么
    在C++中没有内置的print函数,但可以使用cout来输出内容到控制台。cout是C++标准库中的一个输出流对象,可以使用<...
    99+
    2024-05-14
    c++
  • c++中concept的用法是什么
    在C++20中,Concept是一种新的语言特性,用于定义类型要求和约束。Concept可以被用来约束函数模板、类模板和普通函数的参...
    99+
    2024-05-14
    c++
  • c++中concept的作用是什么
    在C++中,concept的作用是定义一种通用的约束,用于限制模板参数的类型范围。通过使用concept,可以在编译时对模板参数进行...
    99+
    2024-05-14
    c++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作