知识点锦集(五)

七.const的作用

  • 说明

    • 常类型也称为const类型,是指使用类型修饰符const说明的类型。
    • const是C和C++中常用的关键字,在C语言中,它主要用于定义变量为常类型以及修饰函数参数与返回值(变量、函数参数、返回值)。而在C++中还可以修饰函数的定义,定义类的成员函数
    • 常量必须初始化。
    • 编译器一般不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率很高。
  • #define和const的区别

    • #define不进行类型检查,只是简单的宏替换。
    • const常量有数据类型,进行安全性检查。
    • const定义常量从汇编的角度看,只是给出了对应的内存地址,而#define给出的是立即数,因此const常量在程序运行过程中只有一份复制品(const常量内存只分配一次),而#define定义的常量在内存中有若干个复制品。
  • 常指针

    • const int *A;//const修饰指向的对象,A可变,A指向的对象不可变。
    • int const *A;//const修饰指向的对象,A可变,A指向的对象不可变。
    • int *const A;//const修饰指针A,A不可变,A指向的对象可变。
    • const int *const A;//指针A和A指向的对象都不可变。
#include<iostream>

using namespace std;

int main(int argc, char* argv[]) {
    int data = 10;
    int data2 = 30;
    int *p = &data2;
    //************第一种情况************
    const int *A = &data;
    cout << *A << endl; //10
    //*A = 20; //错误:A指向的对象不可变
    A = p; //A可变
    cout << *A << endl; //30
    //************第二种情况************
    int *const B = &data;
    cout << *B << endl; //10
    *B = 20; //B指向的对象可变
    cout << *B << endl; //20
    //B = p; //错误:B不可变
    //************第三种情况************
    const int *const C = &data;
    cout << *C << endl; //10
    //*C = 20; //错误:C指向的对象不可变
    //C=P;  //错误:C不可变
    getchar();
    return 0;
}
  • 修饰类的成员函数

    • 不改变类的数据成员(只读函数)。
    • 当给类的数据成员加上mutable后,修饰为const的成员函数就可以修改它了。
#include<iostream>
#include<string>

using namespace std;

class A {
public:
    A(int val=0):val(val){}
    int get() const {
        --val;   //出错:不能改变类的数据成员
        return val;
    }
private:
    int val;
};

int main(int argc, char* argv[]) {
    A a(10);
    cout << a.get() << endl;
    getchar();
    return 0;
}
#include<iostream>
#include<string>

using namespace std;

class A {
public:
    A(int val=0):val(val){}
    int get() const {
        --val;   //正确
        return val;
    }
private:
    mutable int val; //注意mutable
};

int main(int argc, char* argv[]) {
    A a(10);
    cout << a.get() << endl;
    getchar();
    return 0;
}
  • 常引用

    • 常引用也称为const引用。引入常引用是为了避免在使用变量的引用时,在毫不知情的情况下改变了变量的值,引起程序错误。
    • 常引用的主要用途
      • 用做普通变量的只读属性的别名,表示同一个地址空间
      • 用于函数的形参既利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变
    • 引用初始化
      • 当初始化值是一个左值(可以取得地址)时,可直接引用;
      • 当初始化值为右值(常量),则只能对一个常引用赋值。赋值过程:先将值隐式转换为类型T,然后将这个转换结果存放在一个临时对象中,最后用这个临时对象来初始化这个引用常量。
      • 不能给非常量引用赋右值
#include<iostream>
using namespace std;

void calc(const int& a) {
    //a += 10; //错误:不能改变常量的值
    cout << a << endl;
}

int main(int argc, char* argv[]) {
    //********************作为普通变量的别名**************************
    int a = 10;
    cout << a << endl; //a=10
    const int& b = a;
    cout << b << endl; //b=10
    a = 20;  
    cout << a << endl; //a=20
    cout << b << endl; //b=20。b相当于是a的别名,表示同一个地址空间,改变a的值就相当于改变b的值

    //作为函数形参
    calc(a);
    cout << a << endl;  //a=10

    //*********************引用初始化**************************
    int& c = a;
    cout << c << endl;  //c=20
    //int& d = 20; //错误:不能给非常量引用赋右值。
    const int& d = 20;
    cout << d << endl; //d=20。正确:常量引用可以赋右值
    //过程相当于:
    //int temp = int(20);
    //const int& d = temp;
    getchar();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值