C++的static静态变量

1?  静态成员变量的初始化需要在类外完成

2?  静态成员不属于具体的某个对象,而属于整个类

3?  所有对象共享本类中的静态成员

4?  静态成员最好直接通过类名::成员来访问和调用

//
//  main.cpp
//  Static
//
//  Created by 06 on 15/2/3.
//  Copyright (c) 2015年 黄永锐. All rights reserved.
//

/*
 *

 static 有什么作用
 static 在C和C++里面是两个概念
 C++中的static一般是指这个类中的static是怎么解释,而这种写在类外的一般都是C的static

 *
 */

#include <iostream>
using namespace std;

int y;  //全局区的变量 在哪里都可以访问

/*** C中的使用方式 ****/
//1.限制只能在本文件中访问
static int x;

//2.函数中的static变量,不受函数的生命周期影响,程序开始时候创建,程序结束时候销毁
void test(){
    static int s;
}

/*
 **
 C++中的使用方式
 **
 */

class Example{
public:
    int a;
    //static修饰的变量,属于类,但是所有对象共享它,也就是说通过这个类创建的对象都可以访问它。换而言之,假如创建了10个对象,如果其中一个对象修改了这个变量的值,那么其他9个对象访问这个变量的值也都变了
    static int x;
#pragma 那么问题来了,这个x变量创建出来,x内存到底在哪??
};

//类中的static变量,我们必须在静态区手动为他分配空间
//变量类型  类名:: 变量名
int Example:: x; //也可以直接初始化

//主函数
int main(int argc, const char * argv[])
{

    //
    Example ex1;
    ex1.a = 100;
    ex1.x = 200;

    Example ex2;
    ex2.a = 300;
    ex2.x = 400;

    cout << "ex1.a = " << ex1.a << endl;
    cout << "ex2.a = " << ex2.a << endl;
    cout << "ex1.x = " << ex1.x << endl;
    cout << "ex2.x = " << ex2.x << endl;

    //一般不建议用对象直接调用static的变量,而是通过类名。对象调用不报错是因为编译器帮忙通过对象找到类型调用的
    cout << "通过类名调用 " << Example::x << endl;
    return 0;
}

运行结果如下:

ex1.a = 100
ex2.a = 300
ex1.x = 400
ex2.x = 400
通过类名调用 400
Program ended with exit code: 0
时间: 2024-08-02 17:49:04

C++的static静态变量的相关文章

java中的关键字static(静态变量)和final定义常量

1 package point; 2 3 class Point { 4 5 int x = 0; 6 int y = 0; 7 static int z = 100; // 定义静态变量z,类变量 8 static final double PI = 3.1415926;// final定义常量,它的值在运行时不能被改变 9 10 Point(int a, int b) { 11 //PI=3.1415926; 12 /* 13 * 当使用静态常量的时候,不能在构造函数中初始化, 因为静态时,

C#中static静态变量的用法

使用 static 修饰符声明属于类型本身而不是属于特定对象的静态成员static修饰符可用于类.字段.方法.属性.运算符.事件和构造函数,但不能用于索引器.析构函数或类以外的类型 静态全局变量 定义:在全局变量前,加上关键字 static 该变量就被定义成为了一个静态全局变量. 特点: A.该变量在全局数据区分配内存. B.初始化:如果不显式初始化,那么将被隐式初始化为0. 静态局部变量 定义:在局部变量前加上static关键字时,就定义了静态局部变量. 特点: A.该变量在全局数据区分配内存

Static静态变量和非静态变量

Static静态变量:   不同的对象共享这个变量的存储空间 而不是静态变量   每个对象具有可变的存储器空间 public class StaticDemo { private int count=0; private static int staticCount=0; public StaticDemo() { System.out.println(++count); System.out.println(++staticCount); } public static void main(S

[转] C# 中的static静态变量

logitechyan原文关于C#中static静态变量 C#静态变量使用static 修饰符进行声明,在类被实例化时创建,通过类进行访问不带有 static 修饰符声明的变量称做非静态变量,在对象被实例化时创建,通过对象进行访问一个类的所有实例的同一C#静态变量都是同一个值,同一个类的不同实例的同一非 静态变量可以是不同的值.静态函数的实现里不能使用非静态成员,如非静态变量.非静态函数等. 使用 static 修饰符声明属于类型本身而不是属于特定对象的静态成员static修饰符可用于类.字段.

android 尽量不要使用static静态变量

使用静态static静态变量潜在性问题: 1.占用内存,并且内存一般不会释放: 2.在系统不够内存情况下会自动回收静态内存,这样就会引起访问全局静态错误. 3.不能将activity作为static静态对象,这样使activity的所有组件对象都存入全局内存中,并且不会被回收: (转自:http://blog.csdn.net/ctcwri/article/details/8858414) 静态变量的生命周期: 类在什么时候被加载? 当我们启动一个app的时候,系统会创建一个进程,此进程会加载一

PHP之static静态变量详解(一)

什么是static静态变量?(以下为在C语言中的理解) 静态变量 类型说明符是static. 静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在静态存储区内分配存储单元),该 区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间都不释放),也可以认为是其内存地址不变,直到整个程序运行结束(相反,而 auto自动变量,即动态局部变量,属于动态存储类别,占动态存储空间,函数调用结束后即释放).静态变量虽在程序的整个执行过程中始终存在,但是在它作 用域之外不能使用. 另外

static静态变量

static静态变量 static 关键字来定义静态方法和属性.static 也可用于定义静态变量声明类属性或方法为静态,就可以不实例化类而直接访问.静态属性不能通过一个类已实例化的对象来访问(但静态方法可以). 为了兼容 PHP 4,如果没有指定访问控制,属性和方法默认为公有. 由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用. 静态属性不可以由对象通过 -> 操作符来访问. 用静态方式调用一个非静态方法会导致一个 E_STRICT 级别的错误. 就像其它所有的

java学习(四)static静态变量 和this

java中的this /* this:是当前类的对象引用.简单的记,它就代表当前类的一个对象. 注意:谁调用这个方法,在该方法内部的this就代表谁. this的场景: 解决局部变量隐藏成员变量 */ //定义学生类 class Student { //姓名 private String name; //年龄 private int age; //姓名获取值 public String getName() { return name; } //姓名设置值 public void setName(

static静态变量的理解

静态变量 类型说明符是static. 静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在 静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间都不释放),也可以认为是其内存地址不变,直 到整个程序运行结束(相反,而auto自动变量,即动态局部变量,属于动态存储类别,占动态存储空间,函数调用结束后即释放).静态变量虽在程序的整个执 行过程中始终存在,但是在它作用域之外不能使用. 另外,属于静态存储方式的量不一定就是静态变量. 例如:外部变

Spring它不支持依赖注入static静态变量

在springframework在,我们不能@Autowired静态变量,制作spring bean,例如,没有那么: @Autowired private static YourClass yourClass; 可以试一下,yourClass在这样的状态下不可以被依赖注入,会抛出执行时异常java.lang.NullPointerException,为什么呢?静态变量/类变量不是对象的属性,而是一个类的属性,spring则是基于对象层面上的依赖注入. 而使用静态变量/类变量扩大了静态方法的使用