概述
一.面向过程中的static
1.静态全局变量
在全局变量前,加上关键字static,该变量就定义成为一个静态全局变量
int m = 3; //全局变量,默认为extern
static int n = 5; //静态全局变量
int main()
{
printf("%dn",n);
return 0;
}
静态全局变量n和全局变量m和都存放于程序的全局数据区,它们的生存周期都是程序的整个运行期,但是m的作用域为全局作用域,可以通过extern在其他文件中使用,而n的作用域为文件作用域,只能在该文件中使用。
例如在test2文件中:
extern int m; //OK
extern int n; // error: n在文件test2中不可见
int a = m; // OK
int b = n; // error
即:在声明全局的static变量时,static没有改变它的生存周期,也即存储位置(因为全局变量本来就存储在全局数据域),而是将变量的作用域限制在当前文件中。
静态全局变量的特点:
1.静态全局变量在声明它的整个文件中都是可见的,而在文件之外是不可见的。
2.静态全局变量不能被其它文件所用;其它文件中可以定义相同名字的变量,不会发生冲突。
3.静态变量存储在全局数据区,全局数据区的数据不会因为函数的退出而释放空间。
4.未经初始化的静态全局变量会被程序自动初始化为0(自动变量的值是随机的,除非它被显式初始化);
2.静态局部变量
在局部变量前,加上关键字static,该变量就被定义成为一个静态局部变量。
void fun()
{
int m = 10; // 局部变量,具有动态生存期,每次进入函数时都初始化
static int n = 20; //静态局部变量,具有全局寿命,局部可见,只第一次进入函数时被初始化
}
int main()
{
static int j; //静态局部变量,具有全局寿命,局部可见
return 0;
}
静态局部变量的特点:
1.该变量在全局数据区分配内存;
2.静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;
3.静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;
3.它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。
3.静态函数
在函数的返回类型前加上static关键字,函数即被定义为静态函数。
static void test() {};
静态函数的特点:
1.静态函数只在声明它的文件中可见,不能被其它文件所用。
2.其它文件中可以定义相同名字的函数,不会发生冲突。
二.面向对象中的static关键字(类中的static关键字)
1.静态成员变量
在类内数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员
class A
{
private:
int m;
static int n; //声明静态成员变量
};
int A::n = 0; //在类外定义并初始化
静态成员变量特点:
1.静态成员变量没有包含在具体的对象中,是所有对象共享的成员变量,只有一份,是类的属性。
2.静态成员变量不会影响sizeof(类名)的结果,sizeof(A) 等于4。
3.静态数据成员存储在全局数据区。
4.初始化:静态数据成员在初始化时分配空间。所以静态成员变量必须初始化,而且只能在类体外进行。否则,编译能通过,链接不能通过。初始化时可以赋初值,也可以不赋值。如果不赋值,那么会被默认初始化,一般是 0。
5.使用方法:对象.静态成员变量 类名::静态成员变量
2.普通成员变量
普通成员变量,每个对象都有一份,只能在构造函数初始化列表位置进行初始化。
使用方法:对象.普通成员变量
3.静态成员函数
#include <iostream>
class A {
public:
A() {++n;}
A(const A& t) {++n;}
static int GetACount() {return n;} //静态成员函数
private:
int m;
static int n;
};
int A::n = 0;
int main()
{
std::cout << A::GetACount() << std::endl;
A a1, a2;
A a3(a1);
std::cout<<A::GetACount()<<std::endl;
system("pause");
return 0;
}
静态成员函数特性:
1.内部没有隐藏的this指针。静态成员函数中不能访问非静态成员变量,不能访问非静态的成员函数。
2.静态成员之间可以相互访问,包括静态成员函数访问静态成员变量和访问静态成员函数。
3.静态成员函数不能使用const进行修饰,因为const修饰成员函数,本质在修饰this指针,而静态成员函数没有this指针。
4.静态成员函数默认的调用约定:_cdecl
5.注意:构造函数/拷贝构造函数/赋值运算符重载/析构函数都不能被static修饰。
静态成员函数使用方法:
调用:对象.静态成员函数名(); 类名::静态成员函数名();
4.普通函数
普通函数
调用:对象.成员函数();
特性:
1.普通成员函数有this指针。普通成员函数可以访问静态成员函数,也可以访问静态成员变量
2.普通函数可以被const修饰--const成员函数
3.普通函数的默认调用约定:this_call
原文链接:https://blog.csdn.net/qq_44695386/article/details/112278697
最后
以上就是高挑摩托为你收集整理的Effective C++笔记之十九:static关键字一.面向过程中的static二.面向对象中的static关键字(类中的static关键字)的全部内容,希望文章能够帮你解决Effective C++笔记之十九:static关键字一.面向过程中的static二.面向对象中的static关键字(类中的static关键字)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复