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

C++函数指针、对象指针、this指针以及指向类静态和非静态成员的指针是C++语言中常用的指针类型。这些指针类型的使用可以让我们更加灵活地实现一些复杂的功能和设计模式。下面我们会逐一讲解它们的使用。

函数指针

函数指针是指向函数的指针类型。函数指针可以用于实现回调函数、函数指针数组等功能。函数指针的通用形式为:返回值类型(*函数指针变量名)(参数列表)。

例如,我们定义一个函数指针类型func_ptr,指向一个返回值为int,有两个int型参数的函数:

typedef int(*func_ptr)(int, int);

以上的代码定义了一个名为func_ptr的函数指针类型,用typedef定义。

示例:使用函数指针调用函数

#include<iostream>
using namespace std;

int add(int a, int b)
{
    return a + b;
}

int main()
{
    int(*func_p)(int, int) = &add;    //定义函数指针并初始化
    int res = func_p(3, 5);           //调用函数指针

    cout << res << endl;              //输出计算结果
    return 0;
}

以上的代码定义了一个add()函数,它的作用是计算两个整数之和;然后定义了一个函数指针func_p,指向add()函数。最后,我们通过函数指针调用add()函数,计算两个整数之和并输出。

对象指针和this指针

对象指针指向类的实例对象。如果一个成员函数被调用时是通过类的实例对象来调用的,那么在成员函数内部,该对象的指针就被隐式地传递给了函数。在C++中,称这一指针为this指针。

示例:使用对象指针和this指针访问成员函数

#include<iostream>
using namespace std;

class Person
{
public:
    Person(int age) { m_age = age; }
    void display() { cout << "Age: " << m_age << endl; }
private:
    int m_age;
};

int main()
{
    Person p(20);               //定义并初始化Person对象
    Person* p_p = &p;           //定义Person对象指针

    p.display();                //通过对象调用成员函数
    p_p->display();             //通过对象指针调用成员函数
    return 0;
}

以上的代码定义了一个Person类,并在该类中定义了一个成员函数display(),它的作用是输出Person对象的年龄。在main()函数中,定义了一个Person对象p,并使用对象p访问了成员函数display()。接着,我们定义了一个Person对象指针p_p,并通过它访问了成员函数display()。需要注意的是,在成员函数display()内部,使用的隐含的指针是this指针,它指向调用该函数的Person对象。

静态成员指针和非静态成员指针

非静态成员指针指向类的非静态成员变量或函数,而静态成员指针则指向类的静态成员变量或函数。

示例:使用静态成员指针和非静态成员指针访问成员变量

#include<iostream>
using namespace std;

class Person
{
public:
    static int m_age_static;
    int m_age;

    void display() { cout << "Age: " << m_age << ", static Age: " << m_age_static << endl; }
};

int Person::m_age_static = 10;

int main()
{
    Person p;
    p.m_age = 20;

    int Person::*p_age = &Person::m_age;     //定义非静态成员指针
    int* p_age_static = &Person::m_age_static;//定义静态成员指针

    p.display();                             //输出成员变量
    p.*p_age = 25;                           //通过非静态成员指针修改值
    *p_age_static = 30;                      //通过静态成员指针修改值
    p.display();                             //输出修改后的成员变量
    return 0;
}

以上的代码定义了一个Person类,并在该类中定义了一个静态成员变量m_age_static和一个非静态成员变量m_age,还有一个成员函数display()用于输出成员变量的值。在main()函数中,我们首先创建了一个Person对象p,并将m_age的值设置为20。接着,我们定义了一个非静态成员指针p_age,指向m_age成员变量。我们还定义了一个静态成员指针p_age_static,指向m_age_static静态成员变量。最后,通过非静态成员指针p_age和静态成员指针p_age_static分别修改了成员变量的值,并通过对象p调用display函数输出了修改后的值。

总之,C++函数指针、对象指针、this指针、以及静态和非静态成员指针都是很重要的指针类型,它们的使用技巧对于C++程序的设计和实现具有重要意义。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++函数指针+对象指针+this指针+指向类静态和非静态成员的指针 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C++ Boost log日志库超详细讲解

    C++ Boost log日志库超详细讲解 什么是C++ Boost log日志库? C++ Boost log是一个高度灵活和可定制的C++日志库,它提供了一系列便利的接口和功能,帮助我们实现日志的收集、保存、查询和分析等操作。同时,它还提供了多种日志输出格式和输出目标,例如标准输出、文件、syslog等。 安装C++ Boost log日志库 在使用C+…

    C 2023年5月22日
    00
  • C++11/14 线程中使用Lambda函数的方法

    C++11/14标准引入了Lambda表达式,Lambda表达式可以方便地定义匿名函数,并且Lambda表达式在多线程编程中具有很大的优势。本文将详细讲解C++11/14线程中使用Lambda函数的方法,并给出两个实例说明。 Lambda表达式简介 Lambda表达式可以用来创建匿名函数,这些函数通常用于需要手动创建函数的地方,比如函数指针的回调函数。 La…

    C 2023年5月22日
    00
  • C语言错误使用sizeof操作符

    介绍C语言中错误使用sizeof操作符的完整使用攻略。 什么是 sizeof 操作符 sizeof是C语言中的一元操作符,用于计算某个数据类型所占内存的字节数。其用法如下: sizeof(type) 其中 type 可以是任何C语言中的数据类型,包括基本数据类型、数组、结构体、联合体或指针等。 错误用法示例 sizeof 数组 有些C语言开发者会尝试使用si…

    C 2023年5月9日
    00
  • Java面试题冲刺第一天–基础篇1

    下面我将详细讲解“Java面试题冲刺第一天–基础篇1”的完整攻略。 一、需求分析 本篇攻略是针对Java初学者、准备面试的人群而编写的,旨在帮助大家复习Java基础知识,从而在面试中表现更加出色。 该篇攻略包含以下几个方面的内容: Java基础知识概述 Java数据类型 Java运算符与表达式 Java流程控制语句 Java数组 通过学习和掌握这些内容,可…

    C 2023年5月23日
    00
  • win10系统更新提示错误代码0xc0000409怎么办?

    解决win10系统更新提示错误代码0xc0000409的完整攻略 问题描述 当你在win10系统中尝试进行系统更新时,突然出现错误提示:“更新时发生意外错误,错误代码0xc0000409”。这个错误代码可能让你不知所措,但是不要担心!本文将会为你提供解决方案。 解决方案 1. 确认错误信息 首先,我们需要进一步了解出现这个错误的具体原因。我们需要打开Wind…

    C 2023年5月23日
    00
  • php json转换成数组形式代码分享

    当我们在开发过程中需要将json格式的数据转换成数组的形式,可以使用PHP中提供的json_decode()函数。下面,我来详细讲解如何将json格式的数据转换成数组,并分享两个示例。 1. 将json转换成数组 使用方法: mixed json_decode(string $json, bool $assoc = false, int $depth = 5…

    C 2023年5月23日
    00
  • C++面向对象编程之析构详解

    C++面向对象编程之析构详解 概述 在C++面向对象编程中,析构函数是一种特殊的成员函数,它在对象被销毁时调用。析构函数通常用于在对象被销毁前,释放对象所占用的资源,如动态分配的内存空间、文件句柄等。 析构函数的函数名与类名相同,但前面加上 “~” 符号,且析构函数没有返回值和参数。 class MyClass { public: MyClass(); ~M…

    C 2023年5月22日
    00
  • C语言实现俄罗斯方块小游戏

    C语言实现俄罗斯方块小游戏 简介 俄罗斯方块是一种经典的电子游戏,是由前苏联设计师在1984年开发的。这个游戏的基本玩法是在一个长方形的游戏界面中不断地掉落各种形状的砖块,玩家需要操控这些砖块的位置和方向,让它们在界面内排列出完整的一行或几行,以获得分数。 在此,我们将使用C语言来实现俄罗斯方块小游戏。 实现步骤 步骤一:界面设计 首先,我们需要确定游戏的界…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部