C/C++static关键字的作用

1   c语言中static修饰函数/变量:所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问;static修饰函数和变量时,变量和函数就变成了内部链接,外部不可见,(作用域只在本文件)其他源文件不能访问

代码例子如下:

.h文件

#pragma once
static void testc();

.c文件

#include<stdio.h>
#include"c.h"
static void testc()
{
	printf("%s\n","ccccc");
}

.main文件

#include<stdio.h>
#include"c.h"
int main()
{
	testc();
	getchar();
	
}

运行结果出错:,如果去掉static就编译正确

 

2.1   c语言中static修饰局部变量:变量的生命周期是整个程序的运行期间生命周期是整个程序的运行期间,变量没有初始化的话,自动初始化为0

例子如下:

#include<stdio.h>
int* test()
{
	static int b = 0;
	int* p = &b;
	return p;
}
void T()
{
	static int c;
	printf("%d\n", c);
}
int main()
{
	int* p = test();
	++(*p);
	printf("%d\n", *p);
	T();
	getchar();
}

运行结果如下:

b在函数调用结束后还没有释放掉,说明b的生命周期是整个程序的运行期间,因为static修饰后b放在静态区

 

2.2  c语言中static修饰全局变量:他与全局变量的区别在于全局变量作用域是全局(所有文件只能定义一个),而static修饰的在不同的文件中可以定义相同的名称,因为static作用域在本文件中 所以不同文件中的变量名虽然一样 但是他是不同的变量(和两个不同函数中定义相同名字的局部变量一样)

例子:

.h文件

void TestA();

a.c文件

#include <stdio.h>
static int a=10;
void TestA()
{
  a = 1000;
  printf("a.c:%d\n", a);
}

main.c文件

#include <stdio.h>
static int a=100;

int main()
{
  TestA();
  printf("main.c: %d\n", a);
  system("pause");
  return 0;
}

在main函数中TestA打印的是自己a.c中的变量a1000 main文件中输出是自己的变量a 100,而且a.c和main.c可以定义static int a说明static修饰后是内部链接 如果你去掉static就会报错

 

 

3  C++static修饰数据成员变量/成员函数:

注意:在c++中static作用兼容修饰c语言的作用(改变作用域和生命周期)最重要的只有一种作用,就是static修饰的静态成员是属于这个类,所有对象共享这个静态成员

成员变量: 

   静态成员变量必须在类中声明,在类外定义

   静态数据成员不属于某个对象,在为对象分配空间中不包括静态成员所占空间

   静态数据成员可以通过类名或者对象名来引用

例子如下:

#include<iostream>
using namespace std;
class test
{
	
public:
	test()
	{
		//val = 100;不能放在构造函数初始化,因为静态成员变量是对象共享的,不然每创建一个对象就要重新初始化一次值,这是不允许的,所以编译运行时会报错
	}
	static void Test()
	{
		cout << "TTT" << endl;

	};

	static int val;
};

int test::val = 100; //不能在类内初始化,类内初始化的值必须为常量,必须在类外定义初始化,定义不能加static
int main()
{
	//test::Test();
	cout << test::val << endl;
	cout << sizeof(test) << endl;
	system("pause");

}


运行结果:

结果为100说明是可以通过类名访问,等于1说明静态成员变量不在类中,空类值为1

 

成员函数:

  静态成员函数只能访问静态变量,不能访问普通成员变量,因为静态成员函数不含this指针

  静态成员函数的使用和静态成员变量一样,可以通过类名调用

  静态成员函数也有访问权限,

 

例子如下:

.h文件

#pragma once
class test
{
public:	
	test();
	void Nstatic();
	static void Test();

public:
	static int val;
	int val2;
};

.cpp文件

#include<iostream>
using namespace std;
#include"cpp.h"
int test::val = 100;
test::test()
{
	val2 = 1000;
}
void test::Test()//类外定义时和静态数据成员一样不能加static
{
	cout << val << endl;
}
void test::Nstatic()
{
	cout << val2 << endl;
	cout << val << endl;
}

main文件

#include<iostream>
#include"cpp.h"
using namespace std;
int main()
{
	test T;
	T.Nstatic();//非静态成员函数只能可以调用静态数据成员和非静态数据成员
	test::Test();
	T.Test();//静态成员函数只能调用静态数据成员,静态成员函数没有this指针
	system("pause");

}


运行结果:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值