c++静态变量成员函数和全局函数的区别

静态成员函数和全局函数在某些方面是相似的,但它们有一些关键的区别。

静态成员函数是与类相关联的函数,但它们不依赖于特定的类实例。这意味着它们可以在没有类实例的情况下被调用,并且没有隐含的this指针。静态成员函数可以通过类名直接调用,例如:

ClassName::staticMemberFunction()

静态成员函数只能访问类的静态成员变量和其他静态成员函数,而不能访问非静态成员变量或成员函数

全局函数是定义在命名空间范围内的函数,它们不属于任何特定的类。全局函数可以在任何地方被调用,只需通过函数名即可,例如functionName()。全局函数可以访问全局变量和其他全局函数,但不能直接访问类的成员变量或成员函数。如果需要访问类的成员,可以将类的实例作为参数传递给全局函数

在C++中,静态成员变量和全局函数的主要区别在于其作用域和生命周期。以下是具体区别:

静态成员函数:

  • 作用域:静态成员函数的作用域是其所属的类。除了作用域内的类成员其他地方也可以通过类名和作用域解析运算符(::)访问
  • 生命周期:静态成员函数的生命周期与程序的生命周期一致。它在程序开始时创建,程序结束时销毁。
  • 静态成员函数没有this指针,因此只能访问静态成员数据和静态成员函数,不能访问非静态成员数据和非静态成员函数。

全局函数:

  • 作用域:全局函数的作用域是整个程序,可以在任何地方调用。
  • 生命周期:全局函数的生命周期与程序的生命周期一致。它在程序开始时创建,程序结束时销毁。

静态关键字static的应用示例

示例:

class Solution { 
public:
   //遍历整棵树,用map统计频率
    //这里的遍历顺序不重要,只要全部遍历了就行
    unordered_map<int,int>map;
    vector<int>result;
    void searchTree(TreeNode* root){
        if(root==nullptr){
            return;
        }
        //此处用了前序
        map[root->val]++; //统计元素频率
        searchTree(root->left);
        searchTree(root->right);
    }
    //把统计出来的value进行排序,注意map不能直接对value排序
    //因为map中的数据类型是pair,因此sort的cmp需要重新定义降序排列
    bool static cmp(pair<int,int>& a,pair<int,int>& b){
        //注意键值对的pair类型并不是指针,不能用->来访问
        if(a.second>b.second){
            return true;
        }
        else
            return false;
    }
    vector<int> findMode(TreeNode* root) {
        if(root==nullptr){
            result[0] = 0;
            return result;
        }
        searchTree(root);
        //把map里的数据存在数组里
    	vector<pair<int,int>>vec(map.begin(),map.end());
    	//对数组里的pair.second进行排序
    	sort(vec.begin(),vec.end(),cmp);
        //取最高value的元素key,此时数组vec中已经是value降序排好序的
        result.push_back(vec[0].first);
        //把vec中最高value元素存进result里
        for(int i=1;i<vec.size();i++){
            if(vec[i].second == vec[0].second){
                result.push_back(vec[i].first);
            }
        }
  		return result; 
    }

};

在上面的代码中,cmp函数被声明为static,这是因为std::sort需要一个能够在全局访问的函数,或者一个lambda函数

如果cmp不是static的,那么这就意味着它需要一个对象上下文(因为非静态成员函数都有一个隐含的this指针参数)。然而在这种情况下,我们不能给出这样一个上下文。所以,我们需要使cmp函数成为一个静态成员函数,这样它就可以在没有对象上下文的情况下被调用。

static在cpp中的应用总结

在C++中,static关键字主要有以下几个作用:

静态局部变量:在函数内部声明的静态变量。它在程序执行到该对象的声明处时首次进入初始化,直到程序的生命周期结束时才会被销毁。即使函数结束,静态局部变量的值也会保留。

静态全局变量:在函数外声明的静态变量(也可以是在命名空间内)。它的作用范围局限于声明它的文件内。

静态成员变量:类中的静态成员变量。它们是类的所有对象共有的。静态成员变量在所有对象中有且只有一个副本。

静态成员函数:类中的静态成员函数。它们也是类的所有对象共有的。静态成员函数只能访问静态成员数据、其他静态成员函数和类外部的其他函数。

例如:

class MyClass {
public:
    static int static_var; // 静态成员变量
    static void static_func() { // 静态成员函数
        cout << "This is a static member function." << endl;
    }
};

你可能感兴趣的:(c++,算法,数据结构)