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)调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指调用静态成员函数。

#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;
}




原创粉丝点击