我是靠谱客的博主 高挑摩托,最近开发中收集的这篇文章主要介绍Effective C++笔记之十九:static关键字一.面向过程中的static二.面向对象中的static关键字(类中的static关键字),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一.面向过程中的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关键字)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部