C++ static详解
来源:互联网 发布:wan微型端口 ipv6 编辑:程序博客网 时间:2024/06/04 17:52
一 静态变量
1 全局静态变量
全局静态变量不具有链接性。在本文件中一直是可见的,但是在工程中其他文件中是不可见的。
#include <iostream>
using namespace std;
void fn();
static int n;
//静态全局变量在本文件中一直可见,但是在工程中的其他文件中是不可见的。
int main()
{
n=20;
cout<<n<<endl;
fn();
return 0;
}
void fn()
{
using namespace std;
n++;
cout<<n<<endl;
}
2 全局变量
全局变量具有外部连接性。在整个工程中所有的文件都是可见的。
3 局部变量
在定义它的函数内部有效,但是函数返回后失效。
4 静态局部变量
静态局部变量只在定义它的函数内部有效,但是程序仅分配一次内存,函数返回时该变量不会消失。
#include <iostream>
void fn();
int main()
{
fn();
fn();
fn();
return 0;
// 程序运行结果为:11,12,13
}
void fn()
{
static int n=10;
n++;
std::cout<<n<<std::endl;
}
二 静态函数
静态函数只在声明的文件中可见。不能被其他文件使用。在其他文件中可以定义相同的函数名。
三 静态成员变量
静态成员函数是不能在类体中进行赋值的,因为它是被所有该类对象所共有的。你在一个对象中对它进行赋值,相应的其他对象也会发生改变。所以只能在类体外进行赋值。类的静态数据成员有两种访问方式。类的静态成员变量的优点:1 静态成员变量的名字在类的作用域中,因此可以避免冲突。2 静态成员变量可以实现封装,可以是私有成员,但是,全局对象不可以。3 静态成员函数与特定类关联,结构清晰。
四 静态成员函数
静态成员函数和非静态成员函数的根本区别:静态成员函数没有this指针。非静态成员函数有this指针。因此,静态成员函数不能访问类中的非静态成员变量。静态成员函数的作用就是为了访问静态数据成员。
静态成员函数不能被声明为const。静态成员函数也不能被声明为虚函数。
注意事项:
1)出现在类体外的函数不能指定关键字static;
(2)静态成员之间可以互相访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
(3)非静态成员函数可以任意地访问静态成员函数和静态数据成员;
(4)静态成员函数不能访问非静态成员函数和非静态数据成员;
(5)由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比,速度上会有少许的增长;
(6)调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指调用静态成员函数。
(2)静态成员之间可以互相访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
(3)非静态成员函数可以任意地访问静态成员函数和静态数据成员;
(4)静态成员函数不能访问非静态成员函数和非静态数据成员;
(5)由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比,速度上会有少许的增长;
(6)调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指调用静态成员函数。
#include <iostream>
using namespace std;
class Myclass{
public:
Myclass(int a, int b, int c);
static void fun(); //静态成员函数
private:
int a,b,c;
static int sum;//声明静态数据成员
};
int Myclass::sum = 0; //在类体外对静态成员变量初始化
Myclass::Myclass(int a, int b, int c)
{
this->a = a;
this->b = b;
this->c = c;
sum += a+b+c;
}
void Myclass::fun()
{
cout<<"sum = "<<sum<<endl;
}
int main()
{
Myclass M(1,2,3);
M.fun();
Myclass N(4,5,6);
N.fun();
Myclass::fun();//静态成员函数的访问
return 0;
}
using namespace std;
class Myclass{
public:
Myclass(int a, int b, int c);
static void fun(); //静态成员函数
private:
int a,b,c;
static int sum;//声明静态数据成员
};
int Myclass::sum = 0; //在类体外对静态成员变量初始化
Myclass::Myclass(int a, int b, int c)
{
this->a = a;
this->b = b;
this->c = c;
sum += a+b+c;
}
void Myclass::fun()
{
cout<<"sum = "<<sum<<endl;
}
int main()
{
Myclass M(1,2,3);
M.fun();
Myclass N(4,5,6);
N.fun();
Myclass::fun();//静态成员函数的访问
return 0;
}
阅读全文
0 0
- C/C++-----static详解
- C Static 详解
- C Static 详解
- c语言static详解
- C语言Static详解
- C语音static详解
- static 详解for C
- C语言static 详解
- C语言static详解
- static详解(c/c++)
- C/C++static关键字详解
- C/C++static关键字详解
- C/C++static、const详解
- c中static的详解
- C&C++中Static详解
- c/c++中static详解
- C/C++ static关键字详解
- C/C++中static详解
- LeetCode伴侣:从零开始 LeetCode内置数据结构库的开发
- 函数和循环闭包的理解
- thymeleaf中th标签整理
- elasticsearch5安装
- 回归分析
- C++ static详解
- 为什么选择Spring Boot作为微服务的入门级微框架
- Linux安装Composer
- 【loli的胡策】NOIP训练7.20(二分+主席树)
- OJ提交结果的整理(hdoj,poj)
- ajax中responseText与responseXML区别
- HTML 实现伪类之input输入框鼠标点击边框变色效果
- ie浮动问题总结
- Java 中 StringBuilder 在高性能用法总结