你真的懂const和static的用法和含义了吗?

目录

const 关键字

1、const修饰指针

 2、const修饰返回值、修饰函数的参数、修饰函数

static关键字

1、static修饰局部变量

2、static修饰全局变量和函数


广义上来理解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主要是为了限制其作用域和链接属性,从而提高代码的封装性和安全性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值