1094570635 发表于 2023-2-21 12:16:27

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

代码
#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;
        }
        boolstatic 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-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$

人造人 发表于 2023-2-22 08:52:42

bool operator()(const int v1,const int v2)
我想起来了,这玩意叫运算符重载,是重载函数

1094570635 发表于 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(),这个函数对象就是一个全局的类对象?

人造人 发表于 2023-2-22 10:55:40

这是匿名对象,是局部的匿名对象
页: [1]
查看完整版本: 类内重载运算符的函数,是全局函数,还是静态成员函数的问题