C++中 const 和 static 的总结

本文详细介绍了C++中const和static关键字的功能与应用场景,包括定义常量、修饰常变量、成员方法及成员变量等,并对比了两者之间的区别。

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

一、C++中的const是为了干什么
const 的特点和应用场景:
c++中的const 可以定义常量,修饰常变量、类的成员方法、类的成员变量
(1)const用来定义常量,那么这个常量就不能作为左值被修改,而且必须初使化。
const修饰的常量如果是一个明确的值,那么常量在编译期间会被常量的初始值替换
(2)const可以修饰常变量,常变量不能作为左值被修改,其它性质和普通变量一样
(3)const可以修饰类的成员方法,被const修饰的成员方法叫 “常成员方法”,在常成员方法中只能
访问其他成员,不能修改其他成员;普通对象和常对象都可以调用常方法,但是常对象
只能调用常方法。
(4)const也可以修饰成员变量,使之成为常成员变量,它的初始化必须写在构造函数的初始化
列表中,否则编译就要报错。

const 和 static 的区别
(1)static修饰全局变量使全局变量从global符号变成local符号,因此只能当前文件可见,不参与链接过程;
(2)static修饰普通成员变量,使普通成员变量从栈内存变成在.data或.bss存储了,生命周期变长了。
(3)static可以修饰成员变量,成为静态成员变量,必须在类外初始化,同类型所有对象共享静态成员变量;
(4)static还可以修饰成员方法,成为静态成员方法,不依赖对象调用,用类作用域调用就可以了,
因此在成员方法中,const和static是不能共同来修饰一个方法的。

static关键字至少有下列n个作用:
(1)函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;
(2)在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
(3)在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;
(4)在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。
const关键字至少有下列n个作用:
(1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;
(2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;
(3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
(4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;
(5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。例如:
const classA operator*(const classA& a1,const classA& a2);
operator*的返回结果必须是一个const对象。如果不是,这样的变态代码也不会编译出错:
classA a, b, c;
(a * b) = c; // 对a*b的结果赋值
操作(a * b) = c显然不符合编程者的初衷,也没有任何意义。

### 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、付费专栏及课程。

余额充值