【c++随笔07】常量、变量、static
- 1、常量、变量
- 1.1、声明变量
- 1.2、使用常量
- 2、static介绍
- 2.1、static 局部变量
- 2.2、static 全局变量
- 2.3、C++ static静态成员变量
- 2.4、C++ static静态成员函数详解
原创地址,https://zhengjunxue.blog.csdn.net/article/details/131677709
原创作者,郑同学的笔记
1、常量、变量
变量是内存变量的简称,用于存放数据。
1.1、声明变量
-
变量在使用之前要先声明。
-
语法:数据类型 变量名
C++常用的数据类型有五种:整数(int)、浮点数(float和double)、字符(char)、字符串(string)和布尔(bool)。
变量在声明的时候可以赋初始值。
语法:数据类型 变量名=值
- 1.2、变量的赋值
语法:变量名=值
1.2、使用常量
常量是程序中固定不变的数据。
-
2.1、宏常量
一般在main函数的上面声明,用大写命名。
语法:#define 常量名 值 -
2.2、const修饰的变量
在程序的任何地方都可以声明。
语法:const 数据类型 常量名=值 -
2.3、常量的特点
程序中不允许改变常量的值,否则编译的时候会报错。
2、static介绍
我们通常将不需要被其他模块调用的全局变量或函数用 static 关键字来修饰,static 能够将全局变量和函数的作用域限制在当前文件中。
2.1、static 局部变量
static 除了可以修饰全局变量,还可以修饰局部变量,被 static 修饰的变量统称为静态变量(Static Variable)。
不管是全局变量还是局部变量,只要被 static 修饰,都会存储在全局数据区(全局变量本来就存储在全局数据区,即使不加 static)。
全局数据区的数据在程序启动时就被初始化,一直到程序运行结束才会被操作系统回收内存;对于函数中的静态局部变量,即使函数调用结束,内存也不会销毁。
网上的错误说法:全局数据区的变量只能被初始化(定义)一次,以后只能改变它的值,不能再被初始化,即使有这样的语句,也无效。------------------------如下demo,发现是可以重写初始化的
#include <iostream>
using namespace std;
static int g_static = 10;
void show()
{
cout << g_static << endl;
}
int main(void)
{
static int l_static =20;
g_static = 11;
l_static = 22;
cout << "g_static = " << g_static << endl;
cout << "l_static = " << l_static << endl;
show();
return 0;
}
输出
2.2、static 全局变量
-
全局变量定义在函数体外部,在全局数据区分配存储空间,且编译器会自动对其初始化。
-
普通全局变量对整个工程可见,其他文件可以使用extern外部声明后直接使用。也就是说其他文件不能再定义一个与其相同名字的变量了(否则编译器会认为它们是同一个变量)。
-
静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响。
在定义不需要与其他文件共享的全局变量时,加上static关键字能够有效地降低程序模块之间的耦合,避免不同文件同名变量的冲突,且不会误使用。
函数
函数的使用方式与全局变量类似,在函数的返回类型前加上static,就是静态函数。其特性如下:
- 静态函数只能在声明它的文件中可见,其他文件不能引用该函数
不同的文件可以使用相同名字的静态函数,互不影响
1、c语言中文网——C语言static变量和函数
2、C语言 static变量和函数详解
2.3、C++ static静态成员变量
对象的内存中包含了成员变量,不同的对象占用不同的内存(已在《C++对象的内存模型》中提到),这使得不同对象的成员变量相互独立,它们的值不受其他对象的影响。例如有两个相同类型的对象 a、b,它们都有一个成员变量 m_name,那么修改 a.m_name 的值不会影响 b.m_name 的值。
可是有时候我们希望在多个对象之间共享数据,
- 在C++中,我们可以使用静态成员变量来实现多个对象共享数据的目标。静态成员变量是一种特殊的成员变量,它被关键字static修饰。
静态成员: 在C++中,静态成员是类的成员,它被该类的所有实例所共享,而不是每个实例都有自己的独立副本。以下是使用静态成员的示例代码:
#include <iostream>
class MyClass {
public:
static int count; // 声明静态成员变量
MyClass() {
count++;
}
};
int MyClass::count = 0; // 初始化静态成员变量
int main() {
MyClass obj1;
MyClass obj2;
MyClass obj3;
std::cout << "Count: " << MyClass::count << std::endl;
return 0;
}
输出结果:
Count: 3
在上面的示例中,MyClass类中的count是一个静态成员变量。每次创建MyClass的实例时,构造函数会自增count。由于count是静态的,因此它将被所有实例所共享,并且在整个程序运行期间只能有一个副本。在main函数中,我们创建了三个MyClass的实例,然后通过MyClass::count访问静态成员变量并输出其值。
static 成员变量的内存既不是在声明类时分配,也不是在创建对象时分配,而是在(类外)初始化时分配。反过来说,没有在类外初始化的 static 成员变量不能使用。
2.4、C++ static静态成员函数详解
在类中,static 除了可以声明静态成员变量,还可以声明静态成员函数。
普通成员函数可以访问所有成员(包括成员变量和成员函数),
- 静态成员函数只能访问静态成员。
静态成员函数: 静态成员函数不依赖于任何特定的对象,而是属于整个类。因此,我们可以在没有创建类的实例对象的情况下直接调用静态成员函数。
以下示例演示了如何声明和使用静态成员函数:
class MathUtils {
public:
static int multiply(int a, int b) { // 静态成员函数声明
return a * b;
}
};
int main() {
int result = MathUtils::multiply(3, 4); // 调用静态成员函数
cout << "Result: " << result << endl;
return 0;
}
在上述示例中,我们声明了一个名为multiply的静态成员函数,并在程序的主函数中通过MathUtils::multiply直接调用它。
需要注意的是,静态成员函数只能访问静态成员变量和其他静态成员函数,它们无法直接访问非静态的成员变量和成员函数。
静态成员的使用为我们提供了一种在类和对象之间共享数据和行为的机制。通过合理地使用静态成员,可以提高代码的可维护性和可扩展性。
C++ static静态成员函数详解