详解 C++ static

举报
Linux猿 发表于 2021/09/30 14:30:58 2021/09/30
【摘要】 详解 C++ static

🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


 先说一下C语言中的static,然后接着说C++中的static。

C语言中的static作用:

1.修饰变量:static关键字用于修改标识符的链接属性,从external改为internal,但标识符的存储类型和作用域不受影响,会延长它的生存周期。static修饰全局变量,全局变量具有外延性,被static修饰后,作用域仅限制在本文件,不能在其它文件中访问,即便是extern外部声明也不可以,他们都是程序运行结束后才释放。

2.修饰函数:加在函数定义或声明的前面,会限制函数作用域到文件作用域。

C++中static作用:

    在C++中,关键字static除了继续保持上面的特性外,还可以用来修饰类的成员变量和成员函数,使之成为静态成员变量和静态成员函数,统称为静态成员。

静态数据成员 :

静态数据成员可以实现多个对象之间的数据共享,它是类的所有对象的共享成员,它在内存中只占一份空间,如果改变它的值,则各对象中这个数据成员的值都被改变。 

静态数据成员是在程序开始运行时被分配空间,到程序结束之后才释放,只要类中指定了静态数据成员,即使不定义对象,也会为静态数据成员分配空间。 

静态数据成员可以被初始化,但是只能在类体外进行初始化(类内定义,类外初始化,type 类名::变量名=初值)。

静态数据成员既可以通过对象名引用,也可以通过类名引用。

静态成员函数 :

静态成员函数和静态数据成员一样,他们都属于类的静态成员,而不是对象成员。 

非静态成员函数有this指针,而静态成员函数没有this指针,所以静态对象不能直接调用非静态成员函数。

static 修饰成员函数,它的作用只有一个,用于管理static成员。

静态成员函数主要用来访问静态数据成员而不能直接访问非静态成员。

需要注意的几点:

    (1)sizeof不将静态成员变量的大小计算在内,例如:

class Test
{
    private:
        int value;
        static int count;
};
int Test::count=0;
int main(int argc, char *argv[])
{
    Test t;
    cout<<"sizeof(Test) = "<<sizeof(Test)<<endl;
}

运行结果:sizeof(Test) = 4,验证了sizeof运算符不会将静态成员变量的大小计算在内。另外,在使用静态变量成员的时候不进行初始化,链接的时候会出错。

    (2)静态成员是属于类的,而不是属于某个对象的,即便没有一个实例,类的静态成员变量也已经存在了,因此静态变量除了能够和普通成员一样通过对象访问外,还可以通过类名访问,访问形式为    类名::成员名。同时静态成员受到private、public等的限制,因此,在类外通过类名访问时,需要其访问权限为public。

    (3)静态成员函数不能直接访问类的非静态成员

    由于静态成员函数属于整个类,在类实例化对象之前就已经分配空间了,而类的非静态成员必须在类实例化对象后才有内存空间,因此在静态成员函数中直接访问非静态成员变量或者直接调用非静态成员函数就会出错。


🎈 有任何疑问欢迎交流!

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。