`
isiqi
  • 浏览: 16480242 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

static的全部用法

阅读更多
static的全部用法
要理解static,就必须要先理解另一个与之相对的关键字,很多人可能都还不知道有这个关键字,那就是auto,其实我们通常声明的不用static修饰的变量,都是auto的,因为它是默认的,就象short和long总是默认为int一样;我们通常声明一个变量:
int a;
string s;
其实就是:
auto int a;
auto string s;
而static变量的声明是:
static int a;
static string s;
这样似乎可以更有利于理解auto和static是一对成对的关键字吧,就像private,protected,public一样;
对于static的不理解,其实就是对于auto的不理解,因为它是更一般的;有的东西你天天在用,但未必就代表你真正了解它;auto的含义是由程序自动控制变量的生存周期,通常指的就是变量在进入其作用域的时候被分配,离开其作用域的时候被释放;而static就是不auto,变量在程序初始化时被分配,直到程序退出前才被释放;也就是static是按照程序的生命周期来分配释放变量的,而不是变量自己的生命周期;所以,像这样的例子:
void func()
{
int a;
static int b;
}
每一次调用该函数,变量a都是新的,因为它是在进入函数体的时候被分配,退出函数体的时候被释放,所以多个线程调用该函数,都会拥有各自独立的变量a,因为它总是要被重新分配的;而变量b不管你是否使用该函数,在程序初始化时就被分配的了,或者在第一次执行到它的声明的时候分配(不同的编译器可能不同),所以多个线程调用该函数的时候,总是访问同一个变量b,这也是在多线程编程中必须注意的!
static的全部用法:
1.类的静态成员:
class A
{
private:
static int s_value;
};
在cpp中必须对它进行初始化:
int A::s_value = 0; // 注意,这里没有static的修饰!
类的静态成员是该类所有实例的共用成员,也就是在该类的范畴内是个全局变量,也可以理解为是一个名为A::s_value的全局变量,只不过它是带有类安全属性的;道理很简单,因为它是在程序初始化的时候分配的,所以只分配一次,所以就是共用的;
类的静态成员必须初始化,道理也是一样的,因为它是在程序初始化的时候分配的,所以必须有初始化,类中只是声明,在cpp中才是初始化,你可以在初始化的代码上放个断点,在程序执行main的第一条语句之前就会先走到那;如果你的静态成员是个类,那么就会调用到它的构造函数;
2.类的静态函数:
class A
{
private:
static void func(int value);
};
实现的时候也不需要static的修饰,因为static是声明性关键字;
类的静态函数是在该类的范畴内的全局函数,不能访问类的私有成员,只能访问类的静态成员,不需要类的实例即可调用;实际上,它就是增加了类的访问权限的全局函数:void A::func(int);
3.只在cpp内有效的全局变量:
在cpp文件的全局范围内声明:
static int g_value = 0;
这个变量的含义是在该cpp内有效,但是其他的cpp文件不能访问这个变量;如果有两个cpp文件声明了同名的全局静态变量,那么他们实际上是独立的两个变量;
如果不使用static声明全局变量:
int g_value = 0;
那么将无法保证这个变量不被别的cpp共享,也无法保证一定能被别的cpp共享,因为要让多个cpp共享一个全局变量,应将它声明为extern(外部)的;也有可能编译会报告变量被重复定义;总之不建议这样的写法,不明确这个全局变量的用法;
如果在一个头文件中声明:
static int g_vaule = 0;
那么会为每个包含该头文件的cpp都创建一个全局变量,但他们都是独立的;所以也不建议这样的写法,一样不明确需要怎样使用这个变量,因为只是创建了一组同名而不同作用域的变量;
这里顺便说一下如何声明所有cpp可共享的全局变量,在头文件里声明为extern的:
extern int g_value; // 注意,不要初始化值!
然后在其中任何一个包含该头文件的cpp中初始化(一次)就好:
int g_value = 0; // 初始化一样不要extern修饰,因为extern也是声明性关键字;
然后所有包含该头文件的cpp文件都可以用g_value这个名字访问相同的一个变量;
4.只在cpp内有效的全局函数:
在cpp内声明:
static void func();
函数的实现不需要static修饰,那么这个函数只可在本cpp内使用,不会同其他cpp中的同名函数引起冲突;道理和如果不使用static会引起的问题和第3点一样;不要在头文件中声明static的全局函数,不要在cpp内声明非static的全局函数,如果你要在多个cpp中复用该函数,就把它的声明提到头文件里去,否则在cpp内部声明需要加上static修饰;在C语言中这点由为重要!
5.局部静态变量:
void func()
{
static int s_value = 0;
}
在其作用域内的静态变量,多线程情况下将访问同一个变量,由于函数调用结束仍保持静态变量的内存,因而可以作为一些动态变量返回值的存放位置:
const char * func()
{
string s = “ABCD”;
static char msg[256];
strcpy(msg, s);
return msg;
}
不能直接返回s,因为它是动态的;否则将导致一个很经典的内存问题(不用我细说了吧),通常情况下我们返回一个常量字符串:return “ABCD”;其实是因为”ABCD”就是static char[]类型的(所以才能没有问题);
分享到:
评论

相关推荐

    C语言static的用法

    ### C语言中的`static`关键字用法详解 在C语言编程中,`static`关键字具有非常重要的作用。本文将从不同角度对`static`在C语言中的应用进行深入解析,并结合具体的示例来帮助理解其背后的逻辑。 #### 一、`static`...

    const与static用法完整总结

    ### const与static用法完整总结 #### 一、const关键字详解 **1. 常量定义** 在C++中,`const`关键字用于声明一个常量或对象的一部分为不可变。例如: ```cpp const int max = 100; ``` 此处`max`被声明为一个...

    static用法小结.doc

    《static用法小结》 在C和C++编程中,`static`关键字是一个非常重要的概念,它在不同上下文中有着不同的用途。本篇将详细阐述`static`的三种主要用法及其特性。 1. 局部静态变量 在函数内部,`static`关键字用于...

    java中final与static的用法

    下面将详细解析这两个关键字的用法及其在Java中的重要性。 ### 一、`final`关键字 `final`关键字在Java中有多种用途,它可以用来修饰类、方法和变量,其主要目的是确保被修饰的对象具有不可变性或只读性。 #### 1...

    final关键字和static_用法

    public static int staticVar = 10; // 静态变量 public static void staticMethod() { // 静态方法 System.out.println("This is a static method."); } } ``` #### 四、static修饰内部类 除了变量和方法外...

    static和const用法详解

    本文将详细介绍static和const的用法和特性。 static static是C语言中的一个存储类型限定符,主要用来限定变量或函数的作用域。static变量或函数只能在定义它们的文件中可见,对于其他文件是不可见的。static变量或...

    c语言中static_用法总结

    ### C语言中Static关键字的用法总结 #### 一、引言 在C语言中,`static`关键字是一个非常重要的概念,它可以帮助开发者更好地管理内存和控制变量的作用域。本文将详细介绍`static`关键字的不同用途及其对程序行为...

    static用法大全

    《static用法大全》 static关键字在C和C++中都是关键的角色,它有三种主要的使用方式,分别对应局部静态变量、外部静态变量/函数以及静态数据成员/成员函数。尽管C和C++中的一些具体操作细节有所不同,但本文将主要...

    java中final关键字和static关键字详细用法

    Java中的`final`和`static`关键字是编程中非常重要的两个修饰符,它们分别用于不同的场景,以确保代码的稳定性和高效性。 首先,`final`关键字主要用于表示不可变性。它可以用来修饰类、方法和变量。对于类,如果一...

    C#静态static的用法实例分析

    本文实例讲述了C#静态static的用法,分享给大家供大家参考。具体用法分析如下: 一、静态类 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量。在声明一个类时...

    C语言中static用法大全

    ### C语言中static用法详解 #### 一、C程序存储空间布局 C语言程序的存储空间主要分为以下几个部分: 1. **正文段**: 包含CPU执行的机器指令部分,一个程序通常只有一个副本,这部分内容是只读的,以防止程序因...

    c# static的全部用法收集整理

    static的全部用法 要理解static,就必须要先理解另一个与之相对的关键字,很多人可能都还不知道有这个关键字,那就是auto,其实我们通常声明的不用static修饰的变量,都是auto的,因为它是默认的,就象short和long...

    static、this、super、final的JAVA用法

    Java 中 static、this、super、final 的用法 静态方法(static method)是一种特殊的方法,它可以在不需要创建对象的情况下被调用。Java 中的静态方法使用 static 关键字来修饰,例如 public static void main...

    static的用法

    ### static的用法详解 在C++编程语言中,`static`关键字扮演着至关重要的角色,它具有多种用途,能够显著地改变变量和函数的行为。本文将深入探讨`static`在面向过程和面向对象编程中的两种主要应用方式,并提供...

    关键字static的用法

    在C语言或者面向过程的C++中,关键字static经常和变量、函数一起来定义...而静态变量、静态函数的用法经常让人和普通变量、普通函数产生混淆,因此决定对static在C语言和面向过程的C++中用法进行一次全面的分析总结。

    static用法小结

    《C语言static用法小结》 在C和C++编程中,`static`关键字扮演着重要的角色,它有三种主要的使用方式:局部静态变量、外部静态变量/函数以及静态数据成员/成员函数。本篇文章将详细阐述这三种用法,并结合实例探讨...

    static变量和static函数的用法摘抄

    在C++编程中,`static`关键字有着独特的用途,它主要用在变量和函数的声明上,以控制它们的存储方式、作用域和生命周期。以下是关于`static`变量和`static`函数的详细解释。 **一、static变量** 1. **静态局部变量...

    final和static用法详解JAVA

    Java 中的 final 和 static 关键字详解 final 关键字是 Java 中的一种访问修饰符,用于修饰类、方法和变量,以确保它们不能被修改或继承。下面是 final 关键字的详细解释: 1. final 类 final 类不能被继承,也...

    extern和static的详细用法

    ### extern和static的详细用法 #### 一、引言 在编程中,尤其是在C/C++这类语言中,`extern`和`static`是两个重要的关键字,它们在控制变量的作用域以及链接可见性方面扮演着关键角色。正确理解和运用这两个关键字...

    c语言static用法总结

    以下是对`static`关键字在C语言中用法的详细解释: 1. **全局静态变量** - 全局变量通常在程序的整个生命周期中都在内存的静态存储区中存在。如果在全局变量前加上`static`,这个变量就成为全局静态变量,其作用域...

Global site tag (gtag.js) - Google Analytics