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

这篇具有很好参考价值的文章主要介绍了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<int,int>,因此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关键字主要有以下几个作用:

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

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

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

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

例如:文章来源地址https://www.toymoban.com/news/detail-481331.html

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

到了这里,关于c++静态变量成员函数和全局函数的区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++:常成员变量、常成员函数、常对象

    常成员变量: 1.用const修饰,可位于类型前后,若是成员变量类型为指针则只可位于类型后。 即:int  *const  p; 2.只能通过构造函数的初始化表对常成员变量进行初始化。 3.常成员所在类中的所有构造函数都必须对常成员变量初始化(通过初始化表)。 4.常成员变量可以被访

    2024年02月11日
    浏览(35)
  • 【C++】继承的基本特性(定义,赋值转换,友元,静态成员,虚拟继承,默认成员函数,作用域)

    🌏博客主页: 主页 🔖系列专栏: C++ ❤️感谢大家点赞👍收藏⭐评论✍️ 😍期待与大家一起进步! 它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。 Person是父类,也称作基类。Student是子类,也称作派生类 总结: 基类private成员

    2024年02月14日
    浏览(34)
  • C++笔记之静态成员函数可以在类外部访问私有构造函数吗?

    参考笔记: 1.C++笔记之静态成员函数可以在类外部访问私有构造函数吗? 2.C++笔记之设计模式:setter函数、依赖注入 3.C++笔记之两个类的实例之间传递参数——通过构造函数传递类对象的方法详细探究 4.C++笔记之智能指针和单例、依赖注入结合使用 5.C++笔记之两个类的实例之

    2024年02月11日
    浏览(31)
  • C++类和对象-C++对象模型和this指针->成员变量和成员函数分开存储、this指针概念、空指针访问成员函数、const修饰成员函数

    #includeiostream using namespace std; //成员变量 和 成员函数 分开储存的 class Person { public:     Person() {         mA = 0;     }     //非静态成员变量占对象空间     int mA;     //静态成员变量不占对象空间     static int mB;     //函数也不占对象空间,所有函数共享一个函数实例

    2024年02月20日
    浏览(35)
  • Java成员变量(全局变量)和局部变量

    在Java中变量类型有 成员变量 、 局部变量 和 静态变量(类变量、static变量) ,本篇文章主要介绍成员变量(全局变量)和局部变量的区别。 根据变量的作用范围,将程序中的变量分为成员变量(全局变量)和局部变量。 一、成员变量(全局变量) 成员变量(全局变量):

    2024年02月04日
    浏览(34)
  • C++共享之道:用extern实现源文件变量与类成员函数的巧妙共享

    概述: 在C++中,使用`extern`可实现在源文件之间共享变量与类成员函数。通过声明变量或类在头文件中,再在一个源文件中定义,其他源文件通过`extern`引用,促使模块化、可维护的代码组织。 在C++中, extern 可用于在源文件之间共享变量。它告诉编译器某个变

    2024年03月24日
    浏览(46)
  • 带你深入理解 Java成员变量,局部变量和静态变量的创建和回收时机

    Java中的成员变量、局部变量和静态变量具有不同的创建和回收时机。下面我将详细介绍它们的特点和生命周期。 成员变量(实例变量): 成员变量是定义在类中的变量,每个类的实例都会拥有自己的成员变量。它们的生命周期与对象的创建和销毁相对应。 创建时机:成员变

    2024年02月07日
    浏览(31)
  • 全局变量、局部变量和静态变量

    定义:在函数外定义的变量是全局变量,全局变量可以为本文件中其它函数所共用,它的有效范围从定义变量的位置开始到本源文件结束。 设全局变量的作用:增加了函数间数据联系的渠道; 不必要时不要使用全局变量,因为:a) 全局变量在程序的全部执行过程中都占用存

    2024年02月06日
    浏览(27)
  • Java 成员变量与局部变量有什么区别?

    节选自JavaGuide(Github 标星 134k star!「Java学习 + 面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识) 语法形式 :从语法形式上看,成员变量是属于类的,而局部变量是在代码块或方法中定义的变量或是方法的参数;成员变量可以被 public , private , static 等修饰符所修

    2024年02月05日
    浏览(41)
  • C++笔记之设计模式全局状态管理类:使整个工程项目中的所有函数可以访问同一个变量,并且能够感知到这个变量的变化(变量共享)

    —— 杭州 2024-03-21 夜 实现方法 : 全局变量(不介绍) 单例模式 全局状态管理类 全局状态管理类+单例模式 静态变量或静态成员(不介绍) code review!

    2024年03月22日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包