c++

【C++基础进阶】const、static、volatile

Posted by 卢小胖 on 2021-09-26
Estimated Reading Time 3 Minutes
Words 841 In Total
Viewed Times

Const

const代表不可更改,和kotlin中const类似。

一般用法:

const int i = 0;

//error
i = 2;

普通变量申明在顶层中,可以被其他文件访问。const只可以被本文件中的函数访问,可以使用extern来访问其他文件中的const变量。

指针与const:

指针与const配合使用有几种不同的情况

  1. const在前,修饰数据类型
const int *ptr;
//error
*prt = 10;

//success
int val = 10;
*ptr = &val;

不可以直接操作*ptr,但是可以将非const类型对象地址赋值给const类型数据指针。

  1. 和上面一样
int const *ptr;
  1. const修饰指针,指针地址一旦赋值就不可改变,成为常指针
int * const ptr2;
// error
ptr2 = &j;

const指针必须一次性初始化完成:
// success
int* const ptr2 = &j;
  1. const数据类型对的const指针:
const int* const ptr3 = &i;

函数与const

我们通常在函数参数中加入const,用来保证函数不会修改参数值。

  1. const修饰返回值
const int fun(){

}

const int* fun(){

}

返回const指针:
int* const fun(){

}

  1. const修饰参数:
void fun2(const int i){
cout<<i<<endl;
// error
//i = 123;
}

修饰指针:
void fun3(char* const str){

}

关于函数参数使用引用还是指针:

非基础数类型(自定义结构体)作为参数的时候,函数内部会创建临时的数据对象,会经过构造-复制-析构过程,非常消耗性能,所以传递引用,避免性能消耗,同时使用const避免修改源数据

void fun(const A &a){

}

Static

静态变量在程序生命周期中只分配一次,其分配在单独的空间中。如果一个类中有静态变量,其经过了多次创建,多个对象会共享一个静态变量。

静态对象贯穿程序的生命周期。

在类中有静态变量,可以不用初始化该类,直接使用::使用:

class Apple 
{
public:
static void printMsg()
{
cout<<"Welcome to Apple!";
}
};

int main()
{
Apple::printMsg();
}

static配合const:

static const int ijk = 123;

static初始化时机:

类中的static变量必须在类外面初始化,不能直接初始化:

class Box
{
private:
//在外面初始化:
static int money;
//直接初始化:error
static int jk = 123;
public:

// 静态函数,可以直接初始化
static int getCount(){
return 123;
}
};

int Box::money = 123;

Volatile

在java中volatile修饰变量,表示该变量只存在一个引用,被所有线程共享,线程栈内存中不存储该变量的副本。

cpp中的作用与之类似,在多线程共享同一变量的时候,使用volatile修饰方式编译器优化把变量内存装入cpu寄存器,每一次读写都是该变量的真正内存地址。

常见问题:

  1. volatile和const可以用时修饰吗?

可以

  1. volatile和static可以同时修饰吗?

可以

  1. volatile和const、static可以用时修饰吗?

可以

#include <stdio.h> 
#include <iostream>
using namespace std;

int main(void)
{
const volatile int local = 10;
<!--强制类型转换-->
int *ptr = (int*) &local;

printf("Initial value of local : %d \n", local);

*ptr = 100;
printf("Modified value of local: %d \n", local);

static volatile int i = 123;
const static volatile int j = 123;
cout<<i<<endl;
cout<<j<<endl;

return 0;
}

指针也可以被volatile修饰,但是并不常见。