静态成员函数和全局函数在某些方面是相似的,但它们有一些关键的区别。
静态成员函数是与类相关联的函数,但它们不依赖于特定的类实例。这意味着它们可以在没有类实例的情况下被调用,并且没有隐含的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
例如:文章来源地址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模板网!