目录
广义上来理解const关键字的作用是使被修饰的对象具有常属性。
static关键字则是使被修饰的对象具有静态属性。
具体分为如下几种:
const 关键字
1、const修饰指针
//修饰*p
int const *p;
//修饰p
int *const p;
//修饰*p 和 p
int const * const p'
我们需要先理解 p 和 *p 的含义,就 int *p 而言 *p 是 p 所指向的 int 类型变量的值, p 是一个指针,它指向的是内存上(本文中所指向的区域为栈区)一块区域,* 为解引用操作符,可以用于获取指针指向的对象的值
例如
int x = 5;
int *p = &x;
printf("%d ", p); // 输出为 5 , 因为 *p 是指向 x 的值
*p = 10; // 修改 x 的值为 10
printf("%d ", p); // 输出为 10
这里 p 是一个指向 x 的指针。通过 *p 可以访问和修改 x 的值
回到上面 int const *p ,它本质上是在修饰 *p ,所以 *p 无法被修改
再看 int *const p ,它本质上是在修饰 p指针,所以 p 指针的指向无法被修改
int const *const p ,此时 p 和 *p 都被const所修饰,所以 p 和 *p 都无法被更改
2、const修饰返回值、修饰函数的参数、修饰函数
const int getValue()
{
return someValue;
}
这种声明方式表示 geiValue() 是一个普通的成员函数,它返回一个 const int 类型的值。这个const关键字应用在返回值类型之前,表示函数返回的是整数是一个常量,调用者不能修改这个返回值
class Myclass {
public:
int getValue() const {
return someValue;
}
private:
int value;
};
这种声明方式表示 getValue()是一个成员函数,并且他被声明为常量成为函数。这个const关键字应用在参数列表后,表示函数不会修改任何成员变量的状态。这样的声明允许常量对象调用该函数,因为常量对象的成员函数必须是const的,以确保他们不会被修改对象的状态
void print(const int *ptr)
{
// 不修饰 ptr 指向的值
printf("%d ", *ptr);
}
当const用于修饰函数的参数时,它表明函数在执行过程中不会修改该参数的值。这样做有助于提高代码的可读性和安全性,因为调用者可以放心传递const修饰的参数,不用担心函数会修改参数的值
const int getValue() 表示返回的整数是常量
int getValue()const 表示函数本身是一个常量成员函数,不会修改对象的状态
static关键字
1、static修饰局部变量
int fun(int ptr)
{
static int ptr = 10;
return ptr;
}
ptr这个整形参数只会被初始化一次,当fun函数调度结束时不会被释放,当整个程序(main函数)执行完成后,会跟随程序一起自动释放
2、static修饰全局变量和函数
static int p = 10;
static void fun()
{
}
static修饰全局变量p使得变量p只能在当前文件中可见,外部无法访问到变量p,
static修饰函数时同理,他限制了函数的作用域为当前文件,使得该函数对其他文件是不可见。
这种方式可以防止在其他文件中不小心重名或者调用到该函数。
限制函数的连接属性:static修饰函数具有内部链接属性,这意味着编辑器将函数的名称与特定的文件相关联,而不是与整个程序。因此,其他文件不能通过该函数名直接访问到这个函数
隐藏函数:将函数声明为static,可以有效隐藏它,使得它只能在当前编译单元中使用。有效避免了命名冲突和全局命名空间污染
总而言之,将函数声明为static主要是为了限制其作用域和链接属性,从而提高代码的封装性和安全性