C++中的const和static(1)

本文详细解析了C++中const和static关键字的用法,包括它们在变量、函数及指针上的应用,并通过示例代码说明了这些关键字如何帮助开发者实现更安全、高效的编程实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

const 是constant(常量)的缩写。
static是静态变量。
1.常变量和静态变量
静态变量只初始化一次,即如果一个函数中定义了一个静态变量,则第一次调用这个函数时,如果函数中对该变量有改变,下次调用则不会重新定义该变量的值,而是直接使用改变后的值。
static静态变量只在对应的作用域可见,(全局静态就是全局可见)。

  const int a = 12;
  static int b = 12;
  const int &c = a;//如果需要声明a的引用,也必须是const类型的,引用只相当于一个别名
  a = 23;//无法执行,const类型不能修改值
  c=23;//无法执行,const类型不能修改值
  b = 23;//可以执行,b会改变

静态变量不管是局部还是全局,生存周期都是整个程序运行时期。静态变量所有的改变都会生效,不会有函数值传递之类的情况。

static int a = 23;
void double_num()
{
	a=a*2;
}
int main()
{
	double_num();
	cout << a<<endl;//输出46
	a = a - 10;
	cout << a<<endl;//输出36
	
	system("pause");
    return 0;
}

2.常函数和静态函数
①. static修饰的函数,只在本cpp(或者其他格式)文件中使用,不能被其他文件调用。
如下:(偶然发现,即使在.h头文件中定义的是int plus_int(int a, int b);没有加static,只要在函数存放的cpp文件中修饰了static,依然有静态的效果)

//主cpp程序.
#include "stdafx.h"
#include <iostream>
#include<Windows.h>
using namespace std;

int main()
{
	int a = 10;
	int b = 11;
	cout << plus_int(a, b);//调用失败,因为该函数是static修饰的
	system("pause");
    return 0;
}
    //头文件下的其他cpp程序,存放函数
#include "stdafx.h"
static int plus_int(int a, int b)
{
	return a + b;
}

②.const修饰函数的参数
可以防止传入的参数的值在函数体内被改变。修饰指针参数时,代表在函数体内不能修改指针所指的内容。
如下:

int plus_one(const int a)//值传递,其实加不加const都一样,都不会改变原始值
{
	a +=1;//无法执行
	return a;
}
void string_change(const char *str)
{
   str[1] = 'a';//不可修改
} 

const指针可以接收非const和const指针,而非const指针只能接收非const指针。

void string_change(const char *str)
{
	cout << str<<endl;
}
int main()
{
	char text[25] = "today is a good day";
	const char text1[12] = "so stupid";
	string_change(text);//这两种调用都是可以的
	string_change(text1);//这两种调用都是可以的
	system("pause");
    return 0;
}

③.const修饰函数返回值
代表返回值得内容不能被修改。
如下:

const char *get_string()
{
	static char str[23]= "today is a good day";
	//添加static是为了输出不乱码,在字符串后面加/0不起作用,只好出此下策
	return str;
}
int main()
{
	cout <<get_string();//输出没有问题
	char * str2 = get_string();//会报错,const char*类型的值无法初始化char *类型的实体
	const char * str2 = get_string();//可以
	system("pause");
    return 0;
}

3.const修饰指针的不同位置时
①.修饰指针指向的内容,即值不能改变
如下在*的左边,即修饰值(可以记为修饰int):

const int a = 12;
int b = 1;
const int *p = &a;
p = &b;//这是可以的,指针指向的内容不可修改,即12不可修改,但是指针可以指向其他地方,那个地方是不是const无所谓
cout << *p << endl;

②.修饰指针(可以记为修饰p),即指针指向的地址不能改变
如下在*右边,

int a = 12;
int * const p = &a;
*p = 20;
cout << *p << endl;//会输出20
cout << a << endl;//同上
p = &b;//这个就会报错,左值不可修改

③.左右都有,即值和指针指向都不能变

const int a = 12;
const int * const p = &a;
### C++ 中 `const` `static` 关键字的用法与区别 #### 量特性 (`const`)C++中,`const`用于定义不可变的数据。一旦初始化后,这些数据就不能再被修改。 - **量变量** 定义一个量整数如下所示: ```cpp const int MAX_SIZE = 10; ``` - **量指针与指针量** 可以创建指向量对象的指针以及本身为量的指针: ```cpp char *p = "hello"; // p是指向字符数组的可变指针 const char *q = "world"; // q是指向字符数组的只读指针 char* const r = str; // r是一个指向char类型的量指针 ``` - **量引用** 创建对某个特定值的别名而不允许通过该别名更改原值: ```cpp void func(const int& ref) { // 不得修改ref的内容 } ``` - **量成员函数** 成员函数后面加上`const`表明此方法不会改变类的状态。 - **量函数参数返回值** 函数形参列表中的`const`限定符确保传入的对象不被改动;而返回类型前加上的`const`则防止接收方篡改返回的结果[^1]。 #### 存储持续性作用域 (`static`) 另一方面,`static`主要影响程序元素的作用范围及其生存期: - **局部静态变量** 当在一个函数体内声明了一个带有`static`修饰符的局部变量时,则意味着这个变量在整个应用程序执行期间都保持有效,并且仅第一次进入该函数体的时候才会被执行初始化操作。 ```cpp void counter() { static int count = 0; ++count; std::cout << "Count is now: " << count << '\n'; } ``` - **类的静态成员** 对于类而言,静态成员属于整个类而不是单个实例化出来的对象。因此所有的对象共享同一个静态成员副本。 ```cpp class MyClass { public: static int sharedValue; }; int MyClass::sharedValue = 42; // 初始化外部链接的静态成员变量 ``` - **全局/命名空间级别的静态变量** 如果希望某些变量仅仅局限于当前源文件内可见的话就可以采用这种方式来实现隐藏效果。 ```cpp namespace Ns { static int hiddenVar = 98765; } ``` 综上所述,虽然两者都可以用来限制访问权限,但是它们各自有着不同的侧重点——`const`强调的是保护数据免受意外变更的影响,而`static`更侧重于调整实体的存在形式(比如延长生命周斯或是缩小可视区域)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值