第十三问: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

原理:

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

总结

目录
相关文章
|
7月前
|
存储 算法 编译器
【C++ TypeName用法 】掌握C++中的TypeName:模板编程的瑞士军刀
【C++ TypeName用法 】掌握C++中的TypeName:模板编程的瑞士军刀
508 1
|
9天前
|
存储 安全 编译器
第二问:C++中const用法详解
`const` 是 C++ 中用于定义常量的关键字,主要作用是防止值被修改。它可以修饰变量、指针、函数参数、返回值、类成员等,确保数据的不可变性。`const` 的常见用法包括:
45 0
|
1月前
|
存储 C++ 容器
【C++】map、set基本用法
本文介绍了C++ STL中的`map`和`set`两种关联容器。`map`用于存储键值对,每个键唯一;而`set`存储唯一元素,不包含值。两者均基于红黑树实现,支持高效的查找、插入和删除操作。文中详细列举了它们的构造方法、迭代器、容量检查、元素修改等常用接口,并简要对比了`map`与`set`的主要差异。此外,还介绍了允许重复元素的`multiset`和`multimap`。
30 3
【C++】map、set基本用法
|
4月前
|
编译器 C++ 容器
【C++】String常见函数用法
【C++】String常见函数用法
|
7月前
|
人工智能 机器人 测试技术
【C++】static_cast基本用法(详细讲解)
【C++】static_cast基本用法(详细讲解)
160 0
|
4月前
|
存储 程序员 编译器
c++学习笔记08 内存分区、new和delete的用法
C++内存管理的学习笔记08,介绍了内存分区的概念,包括代码区、全局区、堆区和栈区,以及如何在堆区使用`new`和`delete`进行内存分配和释放。
53 0
|
5月前
|
C++
C++ string中的函数和常用用法
C++ 中string中的函数和常用用法
60 4
|
6月前
|
存储 C++
C++初阶学习第十一弹——探索STL奥秘(六)——深度刨析list的用法和核心点
C++初阶学习第十一弹——探索STL奥秘(六)——深度刨析list的用法和核心点
58 7
|
6月前
|
存储 人工智能 C++
map容器在C++中的具体用法以及相关注意点
map容器在C++中的具体用法以及相关注意点
64 1
|
7月前
|
编译器 C++
【C++】【C++的常变量取地址问题(对比C的不同)】const修饰的常变量&volatile修饰用法详解(代码演示)
【C++】【C++的常变量取地址问题(对比C的不同)】const修饰的常变量&volatile修饰用法详解(代码演示)