第十三问:C++中静态变量的用法有哪些?

简介: 本文介绍了 C++ 中静态变量和函数的用法及原理。静态变量包括函数内的静态局部变量和类中的静态成员变量,前者在函数调用间保持值,后者属于类而非对象。静态函数不能访问非静态成员,但可以通过类名直接调用。静态链接使变量或函数仅在定义文件内可见,避免命名冲突。

第十三问:C++中静态变量的用法有哪些?

1. 静态变量(Static Variables)

用法:

  • 在函数内部定义的静态变量在函数调用之间保持其值。
  • 在类中定义的静态成员变量属于类而不是对象。

代码示例:

#include <iostream>

void foo() {
   static int count = 0; // 静态局部变量
   count++;
   std::cout << "Count: " << count << std::endl;
}

class MyClass {
public:
   static int staticVar; // 静态成员变量声明
};

int MyClass::staticVar = 10; // 静态成员变量定义

int main() {
   foo(); // 输出 Count: 1
   foo(); // 输出 Count: 2
   foo(); // 输出 Count: 3

   MyClass obj1, obj2;
   std::cout << "Static Var: " << obj1.staticVar << std::endl; // 输出 Static Var: 10
   obj1.staticVar = 20;
   std::cout << "Static Var: " << obj2.staticVar << std::endl; // 输出 Static Var: 20
   return 0;
}

原理:

  • 静态局部变量在程序开始时初始化一次,之后的函数调用不会重新初始化。
  • 静态成员变量在类中声明,但在类外定义,属于类而不是对象,所有的对象共享同一个静态成员变量。

2. 静态函数(Static Functions)

用法:

  • 静态成员函数不能访问非静态成员变量或调用非静态成员函数。
  • 静态成员函数可以直接通过类名调用。

代码示例:

#include <iostream>

class MyClass {
public:
   static void staticFunction() {
       std::cout << "This is a static function." << std::endl;
   }

   void nonStaticFunction() {
       std::cout << "This is a non-static function." << std::endl;
   }
};

int main() {
   MyClass::staticFunction(); // 直接通过类名调用静态函数
   MyClass obj;
   obj.nonStaticFunction(); // 通过对象调用非静态函数
   return 0;
}

原理:

  • 静态成员函数没有this指针,因为它们不与任何对象实例相关联。
  • 静态函数可以访问静态成员变量,但不能访问非静态成员变量。

3. 静态链接(Static Linkage)

用法:

  • 在全局作用域或命名空间作用域内定义的静态变量或函数具有内部链接,只能在定义它们的文件内访问。

代码示例:

// file1.cpp
static int globalVar = 10; // 静态全局变量

void func() {
   std::cout << globalVar << std::endl;
}

// file2.cpp
// 这里无法访问file1.cpp中的globalVar

原理:

  • 静态链接的变量或函数在编译时被限制在当前文件内,防止命名冲突。

总结

目录
相关文章
|
2月前
|
存储 安全 编译器
第二问:C++中const用法详解
`const` 是 C++ 中用于定义常量的关键字,主要作用是防止值被修改。它可以修饰变量、指针、函数参数、返回值、类成员等,确保数据的不可变性。`const` 的常见用法包括:
135 2
|
3月前
|
存储 C++ 容器
【C++】map、set基本用法
本文介绍了C++ STL中的`map`和`set`两种关联容器。`map`用于存储键值对,每个键唯一;而`set`存储唯一元素,不包含值。两者均基于红黑树实现,支持高效的查找、插入和删除操作。文中详细列举了它们的构造方法、迭代器、容量检查、元素修改等常用接口,并简要对比了`map`与`set`的主要差异。此外,还介绍了允许重复元素的`multiset`和`multimap`。
62 3
【C++】map、set基本用法
|
6月前
|
编译器 C++ 容器
【C++】String常见函数用法
【C++】String常见函数用法
|
6月前
|
存储 程序员 编译器
c++学习笔记08 内存分区、new和delete的用法
C++内存管理的学习笔记08,介绍了内存分区的概念,包括代码区、全局区、堆区和栈区,以及如何在堆区使用`new`和`delete`进行内存分配和释放。
67 0
|
7月前
|
C++
C++ string中的函数和常用用法
C++ 中string中的函数和常用用法
70 4
|
8月前
|
存储 人工智能 C++
map容器在C++中的具体用法以及相关注意点
map容器在C++中的具体用法以及相关注意点
80 1
|
8月前
|
存储 C++
C++初阶学习第十一弹——探索STL奥秘(六)——深度刨析list的用法和核心点
C++初阶学习第十一弹——探索STL奥秘(六)——深度刨析list的用法和核心点
69 7
|
9月前
|
存储 C++ 容器
C++标准库容器的基本用法
C++标准库容器的基本用法
72 0
|
9月前
|
Linux Shell 开发工具
C++ 的 ini 配置文件读写/注释库 inicpp 用法 [ header-file-only ]
这是一个C++库,名为inicpp,用于读写带有注释的INI配置文件,仅包含一个hpp头文件,无需编译,支持C++11及以上版本。该库提供简单的接口,使得操作INI文件变得容易。用户可通过`git clone`从GitHub或Gitee获取库,并通过包含`inicpp.hpp`来使用`inicpp::iniReader`类。示例代码展示了读取、写入配置项以及添加注释的功能,还提供了转换为字符串、双精度和整型的函数。项目遵循MIT许可证,示例代码可在Linux环境下编译运行。
706 0
|
9月前
|
安全 程序员 C++
C++ new和delete的用法
需要注意的是,使用 `new`和 `delete`分配和释放内存时,程序员负责管理内存的分配和释放,这可能导致内存泄漏或释放已释放内存的问题。因此,C++引入了智能指针(如 `std::shared_ptr`和 `std::unique_ptr`)以更安全和自动化地管理内存。
136 2