C++中四种对象生存期和作用域以及static的用法总结分析

C++中四种对象生存期和作用域以及static的用法总结分析

在C++中,对象是程序中的基本组成单位之一。对象有不同的生存期和作用域,对于理解C++程序的运行过程至关重要。static是一个关键字,它有多种用途。本文将详细介绍C++中四种对象生存期和作用域以及static的用法。

对象的生存期和作用域

C++中的对象根据生存期和作用域的不同可以分为以下四类:

  1. 自动存储期对象:在函数内部定义的非static变量被称为自动存储期变量。它们的生存期和作用域都与所在的函数或块相同。当函数返回或块结束时,自动存储期变量被销毁。例如:
void myFunction() {
    int a = 10; // 自动存储期变量
    // ...
} // 在函数结束时,a被销毁
  1. 静态存储期对象:在函数外部定义的非static变量被称为静态存储期变量。它们的作用域与文件作用域相同,生存期则从程序开始运行到结束。例如:
int num; // 静态存储期变量

int main() {
    // ...
} // 在程序结束时,num被销毁
  1. 动态存储期对象:使用new运算符在堆上分配内存的对象被称为动态存储期对象。它们的生存期由程序员控制,可以在任何时候创建和销毁。例如:
int* p = new int(10); // 动态分配内存创建动态存储期对象
delete p; // 销毁动态存储期对象
  1. 线程存储期对象:线程存储期对象是在多线程程序中使用的。它们的生存期与线程的生存期相同,作用域与自动或静态存储期对象相同,但线程间不共享。例如:
thread_local int num; // 线程存储期变量

void myFunction() {
    // ...
} // 在线程结束时,num被销毁

static的用法总结分析

在C++中,static关键字有以下用途:

  1. 声明静态变量:在函数内部使用static声明的变量被称为静态变量。它们和自动存储期变量在存储位置上不同,但作用域和生存期相同。静态变量只会被初始化一次,无论函数执行多少次。例如:
void myFunction() {
    static int a = 10; // 静态变量
    a++;
    // ...
} // 在程序结束时,a被销毁

int main() {
    myFunction(); // a=11
    myFunction(); // a=12
    // ...
}
  1. 声明静态成员变量:在类中使用static声明的变量被称为静态成员变量。它们属于整个类,而不是某个具体对象。静态成员变量与普通成员变量有所不同,需要在类外部定义并初始化。例如:
class MyClass {
public:
    static int count; // 静态成员变量
};

int MyClass::count = 0; // 在类外部定义并初始化静态成员变量

int main() {
    MyClass obj1;
    MyClass obj2;
    MyClass::count++; // 修改静态成员变量
    // ...
} // 在程序结束时,count被销毁
  1. 声明静态成员函数:在类中使用static声明的函数被称为静态成员函数。它们属于整个类,而不是某个具体对象。静态成员函数无法访问非静态成员变量和非静态成员函数,但可以使用静态成员变量和静态成员函数。静态成员函数可以通过类名调用,也可以通过对象名调用。例如:
class MyClass {
public:
    static int count; // 静态成员变量
    static void printCount() { // 静态成员函数
        std::cout << count << std::endl;
    }
};

int MyClass::count = 0; // 在类外部定义并初始化静态成员变量

int main() {
    MyClass obj1;
    MyClass obj2;
    MyClass::count++; // 修改静态成员变量
    MyClass::printCount(); // 1
    obj1.printCount(); // 1
    obj2.printCount(); // 1
    // ...
} // 在程序结束时,count被销毁

示例说明

  1. 自动存储期对象的示例
#include <iostream>

void myFunction() {
    int a = 10; // 自动存储期变量
    std::cout << a << std::endl;
}

int main() {
    myFunction(); // 10
    myFunction(); // 10
    // ...
    return 0;
}
  1. 静态变量和静态成员变量的示例
#include <iostream>

class MyClass {
public:
    static int count; // 静态成员变量

    static void printCount() { // 静态成员函数
        std::cout << count << std::endl;
    }
};

int MyClass::count = 0; // 在类外部定义并初始化静态成员变量

int main() {
    MyClass obj1;
    MyClass obj2;
    MyClass::count++; // 修改静态成员变量
    MyClass::printCount(); // 1
    obj1.printCount(); // 1
    obj2.printCount(); // 1
    // ...
    return 0;
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++中四种对象生存期和作用域以及static的用法总结分析 - Python技术站

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

相关文章

  • C 错误处理

    当我们编写 C 语言程序时,难免会遇到错误。C中的错误可以说在程序中随时出现。 在这种情况下,我们需要一些工具来检查和处理这些错误,从而使程序更加健壮和稳定。 因此,C 语言为程序员提供了一些内置的错误处理机制。 错误处理函数 C语言中有一些错误处理函数,这些函数可以检测并报告代码中的错误。它们通常在程序发生错误时调用。以下是一些常用的错误处理函数: per…

    C 2023年5月10日
    00
  • C++如何调用matlab函数

    要在C++中调用Matlab函数,可以使用Matlab Engine API提供的函数。Matlab Engine API是Matlab提供的一组C和C++函数,使得C++程序可以调用Matlab引擎并执行Matlab函数。 以下是在Visual Studio 2019中如何配置和调用Matlab的步骤: 1. 安装Matlab和Visual Studio …

    C 2023年5月23日
    00
  • 减少OpenCV读取高分辨率图像的时间示例

    下面是减少OpenCV读取高分辨率图像时间的完整攻略。 1. 问题背景 当读取高分辨率图像时,OpenCV可能需要较长的时间来加载和处理图像。这会导致我们无法快速地处理图像,例如进行实时图像处理等操作。因此,我们需要采取一些方法来减少OpenCV读取高分辨率图像的时间。 2. 解决方案 以下是减少OpenCV读取高分辨率图像的时间的解决方案: 方案一:降低图…

    C 2023年5月22日
    00
  • win10无法开机提示0xc0000098错误代码怎么办 疑难杂症快速修复

    Win10无法开机提示0xc0000098错误代码怎么办?疑难杂症快速修复 当你遇到win10无法开机提示0xc0000098错误代码时,不要惊慌。以下是针对这种情况的一些快速修复方法。 解决方法1:修复启动记录 如果win10无法开机提示0xc0000098错误代码,可能是启动记录出现了一些问题。我们可以使用 bcdedit 命令进行修复。 步骤 在启动时…

    C 2023年5月23日
    00
  • C程序 打印简单的半右星金字塔图案

    以下是详细讲解“C程序 打印简单的半右星金字塔图案”的完整使用攻略。 程序代码 #include <stdio.h> int main() { int i, j, row; printf("请输入要打印的行数:"); scanf("%d", &row); for(i=1; i<=row; i+…

    C 2023年5月9日
    00
  • C语言实现简单的贪吃蛇游戏的示例代码

    下面是详细的讲解“C语言实现简单的贪吃蛇游戏的示例代码”的攻略。 1. 前置知识 在开始编写贪吃蛇游戏代码之前,我们需要了解一些基本的C语言知识,包括:基本数据类型、条件语句、循环语句、函数、数组等等。如果对这些基础知识掌握不够熟练,建议先学习一下。 2. 游戏规则设计 在编写代码之前,我们需要明确游戏的规则和基本操作,例如: 蛇的移动方式:蛇可以向上、下、…

    C 2023年5月24日
    00
  • vscode插件设置之Golang开发环境配置全过程

    VS Code插件设置之Golang开发环境配置全过程 为什么需要配置Golang开发环境 Golang 是一种高效、可靠、快速和简单的编程语言,适用于Web开发以及云计算领域等。 在进行Golang项目开发时,需要搭建相应的开发环境,其中包括对Golang语言的了解,安装Golang编译器、配置编译器环境等。本文将为大家讲解VS Code插件设置之Gola…

    C 2023年5月23日
    00
  • 关于Http持久连接和HttpClient连接池的深入理解

    关于Http持久连接和HttpClient连接池的深入理解 什么是Http持久连接 在Http1.0中,每次客户端想要请求内容时,都会和服务器建立一次连接,产生一次完整的Http事务。连接关闭后,所有的相关资源被释放。 在Http1.1中,为了提高效率,引入了持久连接,即同一个连接可以请求多个资源。所以,Http持久连接可以理解为,在同一个连接上可以发送多个…

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