const与static易错点

发布时间 2024-01-08 21:32:37作者: 白柒

static

1.static 局部变量 将一个变量声明为函数的局部变量,那么这个局部变量在函数执行完成之后不会被释放,而是继续保留在内存中
2.static 全局变量 表示一个变量在当前文件的全局内可访问
3.static 函数 表示一个函数只能在当前文件中被访问
4.static 类成员变量 表示这个成员为全类所共有
5.static 类成员函数 表示这个函数为全类所共有,而且只能访问静态成员变量

作用

(1)函数体内static变量的作用范围为该函数体,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;
(2)在模块内的static全局变量和函数可以被模块内的函数访问,但不能被模块外其它函数访问;
(3)在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
(4)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。

const

1.const 常量:定义时就初始化,以后不能更改。
2.const 形参:func(const int a){};该形参在函数里不能改变
3.const修饰类成员函数:该函数对成员变量只能进行只读操作

作用

(1)阻止一个变量被改变
(2)声明常量指针和指针常量
(3)const修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
(4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;
(5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为”左值”。

以上来自https://www.cnblogs.com/wml-it/p/14777414.html

易错点

const int *p指针常量,而int *const p常量指针。

  • const int *p:指向常量的指针。
#include <iostream>
using namespace std;

int main()
{
	//const int i = 123;
	int i = 123;
	const int *ptr = &i; // 指向一个具体类型的常量
	cout << *ptr << endl;	
	//*ptr = 321; // 不可通过ptr来修改i的值
	cout << i << endl;		
	i = 321; // 若i本身被const限定,则不能修改
	cout << *ptr << endl;	
	return 0;
}
  • int *const p:本身是常量的指针
    p本身是const常量(const就近修饰p),不能修改p的内容,但是能通过p来修改它所指向的内容。有点绕是不是?
    这里重新说明一下指针p。p:指针指向的地址 *p:p所指向地址的内容。
    举个栗子,把指针p比作藏宝图:
    p本身是const常量,不能修改p的内容:藏宝图上面具体说明了宝藏藏在什么地方,这个位置不能修改对吧。
    通过p来修改它所指向的内容:但是你不知道宝藏究竟是什么对吧(谁能确保你用藏宝图挖出来的一定是高必而不是高神迹呢[doge])。盗墓贼把真的宝贝(高必)盗走了,把替代品(高神迹)放上去也是可以的吧。(也就是p指向的地址不可以改变,但地址里存放的东西可以改变)
#include <iostream>
using namespace std;

int main()
{
	int i = 123;
	int *const p = &i; // 指针(藏宝图)必须要初始化(有地址)	
	cout << *p << endl;
	cout << i << endl;
	cout << "-----------------" << endl;
	*p = 321; // 修改指针指向地址的内容
	cout << *p << endl;
	cout << i << endl;
	return 0;
}

以上内容来自https://blog.csdn.net/weixin_45045906/article/details/122628644

const和static

#include <iostream>
using namespace std;
// 表示常量的几种方式
// 1. 宏
// #define VALUE 100

// 2. const
// const int value = 100;

// 3. 下面等价:指针指向的内容不能透过这个指针来修改它
// const int * p_int;
// int const * p_int;

// 4. 指针指向的内容可以被修改,但指针指向的地址不能变 
// int * const p_int;

// 常常通过这种方式保证指针指向的内容不变
// void func(const int &);
// void func(const int *);

// 5. 类里面的const member
class Student{
    private:
        const int BMI = 24;
        int born = 0;
        // 静态成员和函数是不绑定某一个实例上的
        // 无论有多少个对象,即使是0个,都会有静态成员
        static size_t student_total; //  只声明
        // inline static size_t student_total = 0; 
// 更方便的写法,C++17标准,可以防止报链接错误

    public:
        Student(){
            // BMI = 25 ; const成员变量不能修改,会报错
            student_total ++;
            cout<<"+++"<< student_total<<endl;
        }
        ~Student(){
            student_total --;
            cout<<"---"<< student_total<<endl;
        }
        static size_t getTotal(){
            // born = 0; 私有变量born可能没有生成,不能在静态函数里操作,会编译报错
            return student_total;}
        int getBorn() const{ // const 放到这里为了不和返回值混淆
            // born ++;// const 员函数不能修改成员变量,会报错
            return born;
        }
};
// 在这里定义
size_t Student::student_total = 0;// 如果这里忘记写,可能会报链接错误
int main(){
    Student *class1 = new Student[3];
    size_t total = Student::getTotal();
    cout<<total<<endl;
    delete [] class1;

    total = Student::getTotal();
    cout<<total<<endl;

    return 0;
}