浅谈静态变量、成员变量、局部变量三者的区别

浅谈静态变量、成员变量、局部变量三者的区别

定义和声明

  • 静态变量:在函数内部或类的成员变量之外声明的变量,具有静态存储持续时间,意味着在整个程序执行期间都会一直存在,并且只会给初始化一次。
  • 成员变量:定义在类中的变量,只有在创建对象时才会被初始化,属于每个对象所特有,不同的对象具有独立的成员变量。
  • 局部变量:定义在函数或者代码块内部的变量,只在函数内或者该代码块内有效,一旦离开该函数或者代码块,便失效。

存储位置

  • 静态变量:存储在数据段,程序在运行时就已经分配了内存。
  • 成员变量:存储在类对象中,对象在被创建时分配内存。
  • 局部变量:存储在栈中,随着函数的调用和返回而生命周期结束。

生命周期

  • 静态变量:从程序开始执行到程序结束都存在。
  • 成员变量:随类对象的创建而存在,随类对象的销毁而销毁。
  • 局部变量:从函数或代码块开始执行时创建,函数或代码块结束时销毁。

访问方式

  • 静态变量:可以使用类名访问,也可以使用对象名访问。如果是通过类名访问,则需要加上作用域运算符。如果是通过对象名访问,需要加上"."运算符。
  • 成员变量:只能通过类的对象访问,使用"."运算符访问。
  • 局部变量:只能在函数内或者代码块内访问。

示例

示例1

#include <iostream>
using namespace std;

class Example {
public:
    int x;
    static int y;
    Example(int a) {
        x = a;
    }
    static void print() {
        cout << "static variable y = " << y << endl;
        // cout << "member variable x = " << x << endl; // 错误!静态成员函数不能访问非静态成员变量
    }
};

int Example::y = 100; // 静态成员变量必须在类外面进行初始化

int main() {
    Example e(10);
    cout << "member variable x = " << e.x << endl;
    cout << "static variable y = " << Example::y << endl;

    Example::print();

    return 0;
}

该程序展示了静态变量和成员变量的区别。静态变量y在类外面定义并初始化,成员变量x在对象创建时被初始化。静态函数print无法访问非静态变量x。

输出结果:

member variable x = 10
static variable y = 100
static variable y = 100

示例2

#include <iostream>
using namespace std;

void foo() {
    int a = 1;
    static int b = 1;
    a++;
    b++;
    cout << "a = " << a << ", b = " << b << endl;
}

int main() {
    foo();
    foo();
    foo();

    return 0;
}

该程序展示了局部变量和静态变量的区别。在函数中声明的变量a是局部变量,每次调用函数时都会重新创建一个新的a变量。而变量b是静态变量,每次调用函数时不会声明新的变量,而是沿用上一次函数调用时的变量。因此,对b的修改在函数调用间是保留的。

输出结果:

a = 2, b = 2
a = 2, b = 3
a = 2, b = 4

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈静态变量、成员变量、局部变量三者的区别 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • 使用VScode搭建ROS开发环境的教程详解

    使用VScode搭建ROS开发环境的教程详解 为了在 VScode 中开发 ROS 项目,我们需要以下常用插件: C/C++ 扩展插件 ROS 扩展插件 ROS msg 扩展插件 下面是一个详细的步骤列表,介绍如何准备环境、配置 VScode 以及开发在 ROS 中。 环境准备 为了完成本教程,你需要:1. 一台安装有 Ubuntu 的电脑。2. 你需要在电…

    C 2023年5月23日
    00
  • C++的替代:微软如何使用rust?

    C++的替代:微软如何使用Rust? Rust是一种系统级编程语言,它被称为C++的替代。它具有C++的高效和灵活性,同时也提供了强大的类型安全和内存安全保证。Microsoft正在积极使用Rust,以替代一些关键系统组件的底层编程语言。 使用Rust的原因 Microsoft决定使用Rust的主要原因是Rust的内存安全保证。内存相关的漏洞是造成系统崩溃和…

    C 2023年5月23日
    00
  • win10系统运行帝国时代2提示错误代码0xc0000022的原因及解决方法

    问题描述 当使用win10系统运行帝国时代2游戏时,会提示错误代码0xc0000022,导致游戏无法正常运行。那么这个错误的出现原因是什么?该如何解决呢? 问题原因 错误代码0xc0000022通常是由于系统权限问题引起的,可能是由于以下原因导致: 游戏所在的目录或文件夹没有设置读写权限。 游戏所在的目录或文件夹被防病毒软件或其他安全软件阻止了读取或写入操作…

    C 2023年5月24日
    00
  • C语言实现猜数字小项目

    C语言实现猜数字小项目 项目介绍 在本项目中,我们将使用C语言编写一个简单的猜数字游戏。玩家需要在规定时间内猜出一个随机数字,每猜一次,游戏将会告知玩家数字大小是否正确。 实现步骤 步骤1:生成随机数字 我们首先需要生成一个随机数字,使用C语言标准库中的rand()函数可以生成介于0和RAND_MAX之间的随机数,通过取模运算将其转换为我们需要的数字范围。 …

    C 2023年5月23日
    00
  • C语言实现俄罗斯方块课程设计

    C语言实现俄罗斯方块课程设计攻略 一、项目背景 俄罗斯方块是一款非常经典的游戏,它的玩法设置简单,但是需要玩家具备较强的空间认知能力和反应能力。本课程设计旨在通过实现俄罗斯方块游戏的过程,让学生掌握C语言的基本语法和常用库函数的使用,提高编程能力。 二、项目要求 本项目要求学生能够完成C语言实现俄罗斯方块游戏的所有模块(主函数、方块控制函数、边距控制函数、判…

    C 2023年5月23日
    00
  • 一篇文章带你了解C语言:入门基础(2)

    “一篇文章带你了解C语言:入门基础(2)”攻略 1. 简介 “一篇文章带你了解C语言:入门基础(2)”是一篇介绍C语言基础知识的教程。本文主要介绍了C语言的运算、表达式、控制语句等相关知识。通过阅读本文,读者可以了解C语言的基本语法结构,为学习C语言打下基础。 2. 内容概述 本文主要分为以下几个部分: 数据类型 运算符 表达式 条件语句 循环语句 在每个部…

    C 2023年5月23日
    00
  • C++ 程序抛出异常后执行顺序说明

    当一个 C++ 程序在运行过程中遇到了异常情况,它可以通过抛出异常来通知上层代码进行异常处理。在此过程中,C++ 运行时会自动执行一些有序的操作步骤,以保证程序能够正确地处理异常。下面我们就来详细讲解一下这些操作步骤。 C++ 异常抛出和捕获机制 在 C++ 中,我们可以使用 throw 语句来抛出一份异常。其语法形式如下: throw exception_…

    C 2023年5月23日
    00
  • 解决偶现的MissingServletRequestParameterException异常问题

    当我们在使用SpringMVC进行开发时,有时会碰到MissingServletRequestParameterException异常,这是因为我们在控制层方法的参数列表中注入了一个参数,但在请求的参数中却找不到该参数导致的。下面是解决该问题的完整攻略: 1. 确认请求参数名称与方法参数名称是否一致 当我们在控制层方法的参数列表中声明了一个参数,例如以下代码…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部