一起学习交流~

c/c++细节知识点 01const的作用

c++面试准备 laomuji 3个月前 (06-25) 230次浏览 已收录 0个评论

基本原理

const 修饰的变量实际上本质上和正常变量一样,只不过加以限制,无法直接修改
const是伪常量,利用强制转换等方式可以强行修改const修饰的变量

修饰变量

说明该变量不可以被改变

int main1_1() {
    int num = 123;
    const int a = num; // const的= 是值拷贝,实际上还是创建了一个新的变量
    cout << a << endl; 
    num = 456;
    cout << a << endl;
    //a = 456; // const 修饰的变量只允许读 不允许写
    cout << a << endl;
    return 0;
}

修饰指针

分为指向常量的指针(pointer to const)和自身是常量的指针(常量指针,const pointer)

int main1_2() {
    int num1 = 123;
    int num2 = 456;
    //指向常量的指针,指针的指向可以修改,但指向的值不能修改
    const int* a = &num1;//指向的类型是const int ,本身a是普通的指针
    cout << *a << endl;
    a = &num2;
    cout << *a << endl;
    //*a = num1;//const int 类型无法修改

    //自身是常量的指针
    //1.自身是常量,但指向的变量不是const
    int* const b = &num1;//可以当作 int* (const b),指向int*类型,自身是(const b)
    //b = &num2; //自身的指向不能修改
    *b = 8848;//指向的变量的值可以修改
    cout << *b << endl;
    //2.自身是常量,指向的类型是const
    const int* const c = &num1;//可以当作 const int * (const c),指向const int *类型,自身是(const c)
    //c = &num2;//不允许修改 指向
    //*c = 456;//不允许修改 指向的变量的值
    cout << *c << endl;
    return 0;
}

修饰引用

指向常量的引用(reference to const),用于形参类型,即避免了拷贝,又避免了函数对值的修改

int main1_3() {
    int num1 = 123;
    int num2 = 456;
    //分为两种,普通引用和常引用
    //首先引用是无法修改这个引用的指向的
    //普通引用 相当于指针,但是不需要使用*来操作
    //常引用 相当于指向的类型是const的指针
    const int& a = num1;
    //a = 456;//引用的类型是 const int  不能修改引用的num1的值
    //由于引用无法更改所以 a无法指向num2
    cout << &a << endl;//无法获取到引用的地址,虽然引用本质是指针,但不提供对该指针的修改
    cout << &num1 << endl;
    cout << &num2 << endl;
    return 0;
}

修饰类

const在类前出现,只能修饰在类后面定义的变量类型为const,其它情况无任何影响
如以下两种情况效果相同,除了c141_1这个变量有影响,在其它位置定义的变量无影响
两种方式定义的c141_1这个变量的类型都为 const class Class1_4_1

const class Class1_4_1 {public:int a;}c141_1;
class Class1_4_1 {public:int a;}const c141_1;

修饰成员函数,说明该成员函数内不能修改成员变量。
修饰类中的变量,可以在类中初始化或者构造函数的初始化列表中初始化

class Class1_4 {
private:
    const int num1 = 789;//在类中初始化
    const int num2;//通过构造函数初始化,且必须初始化,否则无法构造
    int val = 0;
public:
    //Class1_4_A() {num2 = 456;}//不能在构造函数体中初始化
    //可以通过构造函数的初始化列表进行初始化
    Class1_4() :num2(456) {};
    Class1_4(int x) :num2(x) { cout << x << endl; };
    void setVal(int val) {
        this->val = val;
    }
    int getVal1() {
        val += 1;
        return val;
    }
    //注意 const应该放在后面修饰,放在前面修饰的是返回值
    int getVal2() const{
        //val += 1;//const修饰的类成员变量不能修改类中的变量,但可以修改临时变量
        int b = val;
        b += 1;
        return b;
    }
};
int main1_4() {
    Class1_4 a;
    Class1_4 b(888);
    b.setVal(789);
    cout << b.getVal1() << endl;
    cout << b.getVal2() << endl;
    cout << b.getVal2() << endl;
    return 0;
}
喜欢 (1)
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论