鱼C论坛

 找回密码
 立即注册
查看: 2106|回复: 4

[已解决]类内重载运算符的函数,是全局函数,还是静态成员函数的问题

[复制链接]
发表于 2023-2-21 12:16:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码
#include<iostream>
using namespace std;
#include <functional>
#include<vector>
#include<algorithm>

class V {
public:
        vector<int>v;

public:
        void creat() {
                for (int i = 0; i < 10; i++) {
                        v.push_back(i);
                }
                cout << endl;
                sort(v.begin(),v.end(),cmp);
                sort(v.begin(), v.end(), V());

                for (auto i : v) {
                        cout << i << " ";
                }
                cout << endl;

        }

        bool operator()(const int v1,const int v2) {
               
                return v1 > v2;
        }
        bool  static cmp(const int v1, const int v2) {

                return v1 > v2;
        }
       
       

};

bool cmp1(const int v1, const int v2) {

        return v1 > v2;
        }

void test01()
{
        V v;
        v.creat();
       
}


void test02()
{
        vector<int>v;
        for (int i = 0; i < 10;i++) {
                v.push_back(i);
        }
        cout << endl;

        sort(v.begin(),v.end(),cmp1);

        for (auto i : v) {
                cout << i << " ";
        }
        cout << endl;


}

int main() {

        test01();

        test02();

       

        return 0;
}
sort的compare函数要定义为全局或者成员静态函数才可以调用,当我在类内调用
sort(v.begin(),v.end(),cmp);
sort(v.begin(), v.end(), V());
两个函数的时候,cmp和V()都可以实现
我可不可以认为
bool operator()(const int v1,const int v2) {
               
                return v1 > v2;
        }
这个重载函数就是静态成员函数呢,还是全局函数?
最佳答案
2023-2-22 10:55:40
这是匿名对象,是局部的匿名对象
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-21 19:35:32 | 显示全部楼层
sort函数的第2个参数要求是一个可调用的对象
这可以是一个匿名函数,也可以是命名的函数,还可以是一个有operator()的类对象
bool operator()(const int v1,const int v2)
这个应该不是重载函数吧,这个是成员函数,不是静态的
下面是一个关于可调用对象的例子
sh-5.1$ cat main.cpp
#include <iostream>
#include <functional>

bool func(int a, int b, std::function<bool (int a, int b)> f) {
    return f(a, b);
}

bool equal(int a, int b) {return a == b;}

class less_t {
public:
    bool operator()(int a, int b) {return a < b;}
};

int main() {
    std::cout << func(1, 2, [](int a, int b) {return a > b;}) << std::endl;
    std::cout << func(1, 2, equal) << std::endl;
    std::cout << func(1, 1, equal) << std::endl;
    std::cout << func(1, 2, less_t()) << std::endl;
    std::cout << less_t()(1, 2) << std::endl;
    std::cout << less_t()(2, 1) << std::endl;
    return 0;
}
sh-5.1$ ./main
0
0
1
1
1
0
sh-5.1$
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-22 08:52:42 From FishC Mobile | 显示全部楼层
bool operator()(const int v1,const int v2)
我想起来了,这玩意叫运算符重载,是重载函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-22 10:53:07 | 显示全部楼层
人造人 发表于 2023-2-22 08:52
bool operator()(const int v1,const int v2)
我想起来了,这玩意叫运算符重载,是重载函数

sort(v.begin(), v.end(), V());  
可以是一个有operator()的类对象,可不可以认为是调用了一个匿名的函数对象V(),这个函数对象就是一个全局的类对象?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-22 10:55:40 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
这是匿名对象,是局部的匿名对象
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 19:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表