美文网首页c/c++
可调用对象

可调用对象

作者: 简书网abc | 来源:发表于2024-12-03 00:41 被阅读0次

1, 可调用对象->普通函数

#include <iostream>
using namespace std;

// 可调用对象->普通函数

using Fun = void(int, const string&);   // 普通函数类型的别名
Fun show;                               // 声明函数类型

int main()
{
    show(1, "我是一只傻鸟");      // 直接调用普通函数

    // c风格调用
    void(*fp1)(int, const string&) = show;  // 声明函数指针,指向普通函数。
    void(&fr1)(int, const string&) = show;  // 声明函数引用,引用普通函数.
    fp1(2, "我是一只傻鸟");                   // 用函数指针调用普通函数。
    fr1(3, "我是一只傻鸟");                   // 用函数引用调用普通函数。

    Fun *fp2 = show;                        // 声明函数指针,指向普通函数
    Fun &fr2 = show;                        // 声明函数引用,引用普通函数
    fp2(4, "我是一只傻鸟");                   // 用函数指针调用普通函数
    fr2(5, "我是一只傻鸟");                   // 用函数引用调用普通函数

    return 0;
}

// 定义普通函数
void show(int bh, const string& message) {
    cout << "亲爱的 " << bh << "号," << message << endl;
}

2, 类的静态成员函数

#include <iostream>
using namespace std;

// 可调用对象->普通函数

using Fun = void(int, const string&);   // 普通函数类型的别名
struct AA   // 类中有静态成员函数。
{
    static void show(int bh, const string& message) {
        cout << "亲爱的" << bh << "," << message << endl;
    }
};

int main()
{
    AA::show(1, "我是一只傻傻鸟。");    // 直接调用静态成员函数。

    void(*fp1)(int, const string&) = AA::show;  // 用函数指针指向静态成员函数。
    void(&fr1)(int, const string&) = AA::show;  // 引用静态成员函数。
    fp1(2, "我是一只傻傻鸟。");                 // 用函数指针调用静态成员函数。
    fr1(3, "我是一只傻傻鸟。");                 // 用函数引用调用静态成员函数。

    Fun* fp2 = AA::show;                        // 用函数指针指向静态成员函数。
    Fun& fr2 = AA::show;                        // 引用静态成员函数。
    fp2(4, "我是一只傻傻鸟。");                 // 用函数指针调用静态成员函数。
    fr2(5, "我是一只傻傻鸟。");                 // 用函数引用调用静态成员函数。

    return 0;
}

3, 仿函数

#include <iostream>
using namespace std;
// 仿函数的类型就是类的类型
struct BB   // 仿函数。
{
    void operator()(int bh, const string& message) {
        cout << "亲爱的" << bh << "," << message << endl;
    }
};

int main()
{
    BB bb;
    bb(11, "我是一只傻傻鸟。");     // 用对象调用仿函数。
    BB()(12, "我是一只傻傻鸟。");       // 用匿名对象调用仿函数。

    BB& br = bb;                // 引用函数
    br(13, "我是一只傻傻鸟。");     // 用对象的引用调用仿函数。
}

4, lambda函数

#include <iostream>
using namespace std;

int main()
{
    // 创建lambda对象。
    auto lb = [](int bh, const string& message) {
        cout << "亲爱的" << bh << "," << message << endl;
    };

    auto& lr = lb;  // 引用lambda对象。

    lb(111, "我是一只傻傻鸟。");        // 用lambda对象调用仿函数。
    lr(222, "我是一只傻傻鸟。");        // 用lambda对象的引用调用仿函数。
}

5, 类的非静态成员函数

#include <iostream>
using namespace std;
/*
 * 类的非静态成员函数有地址,但是,只能通过类的对象才能调用它,
 * 所以,C++对它做了特别处理。
 * 类的非静态成员函数只有指针类型,没有引用类型,不能引用
 */

struct CC   // 类中有普通成员函数。
{
    void show(int bh, const string& message) {
        cout << "亲爱的" << bh << "," << message << endl;
    }
};

int main()
{
    CC cc;
    cc.show(14, "我是一只傻傻鸟。");

    void (CC::* fp11)(int, const string&) = &CC::show;  // 定义类的成员函数的指针。
    (cc.*fp11)(15, "我是一只傻傻鸟。");                 // 用类的成员函数的指针调用成员函数。

    using pFun = void (CC::*)(int, const string&);      // 类成员函数的指针类型。
    pFun fp12 = &CC::show;                              // 让类成员函数的指针指向类的成员函数的地址。
    (cc.*fp12)(16, "我是一只傻傻鸟。");             // 用类成员函数的指针调用类的成员函数。
}

相关文章

  • 小结-Python-可迭代、迭代器和生成器的区别

    可迭代对象 可迭代对象指的是定义了_ _ iter _ _ 方法的对象,调用该方法会返回一个迭代器对象。 可迭代对...

  • Kotlin 内联函数 apply、let、run、with、a

    Apply 用this代表当前引用对象; 调用其方法时,this可省略; 一定有返回值,且返回值为当前对象 对象可...

  • 7月4日 晴

    1.可扩展性表示对象是否可以扩展,可以调用Object.esExtensible判定对象是否可扩展,Object....

  • 传递消息objc_msgSend

    在OC中,如果像对象传递消息,就会调用动态绑定机制来绝对调用的方法,对象在接收消息时调用的方法则由运行期决定,也可...

  • 迭代器和生成器

    for..of 语句for..of会遍历可迭代的对象,调用对象上的Symbol.iterator方法。 下面是在数...

  • jQuery的动画和jQuery的事件

    1.jquery链式调用 jquery对象的方法会在执行完后返回这个jquery对象,所有jquery对象的方法可...

  • Python 不可变对象

    不可变对象=》可哈希 对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新...

  • Dart学习-类

    使用类成员 对象的成员包括函数和数据(分别是方法和实例变量)。当你调用一个方法时,你在一个对象上调用它:这个方法可...

  • callable 可调用对象

    有call 方法的就是可调用对象 ,并且可以传入参数可像函数一样使用 可调用对象的意义: 在普通情况下,当一个类只...

  • 对象方法和类方法

    -对象方法 +类方法 调用对象方法必须先创建对象,在通过对象来调用。 类方法不依赖对象,使用对象名直接调用。 类方...

网友评论

    本文标题:可调用对象

    本文链接:https://www.haomeiwen.com/subject/sjzesjtx.html