C++中const的用法

在C++中,const关键字是一个非常重要的类型修饰符,它用于表示某个变量、对象或函数的返回值是常量,即其值在初始化后不能被修改。const的用法广泛,包括在变量声明、函数参数、函数返回值以及成员函数定义中。下面是一些const的基本用法:

修饰变量

当const用于修饰变量时,表示该变量的值在初始化后不能被修改。

//常量,二者等价
int const a = 1;
const int a = 1; 

//数组,二者等价
int const arr [5] = {1,2,3,4,5};
const int arr [5] = {1,2,3,4,5};

修饰指针

  • 既不是const指针,也不是const内容
int val = 10;
int* ptr = val;  
  • 修饰指针指向的内容:
int val = 10;
const int* ptr = &val; // ptr指向的内容不能通过ptr修改,但ptr可以指向其他地址
  • 修饰指针本身(指针常量):
int val = 10;
int* const ptr = &val; // ptr不能指向其他地址,但ptr指向的内容可以通过ptr修改
  • 同时修饰指针和指针指向的内容:
int val = 10;
const int* const ptr = &val; // ptr不能指向其他地址,ptr指向的内容也不能修改

1、如果const位于星号 * 的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
2、如果const位于星号 * 的右侧,const就是修饰指针本身,即指针本身是常量。
3、通俗理解:左定值,右定向,const修饰不变量

修饰函数参数

在函数定义中,const可以修饰参数,表示在函数体内不会修改该参数的值。这既可以增强代码的可读性,也可以让函数能够接收常量引用或指针,从而避免不必要的拷贝。

注意:如果函数作为输出用,不论是什么数据类型,也不论采用指针传递还是引用传递,都不能加const 修饰,否则参数会失去输出功能。

void display(const int& num) { // 使用引用传递,且不会修改num的值
    // ...
}

void process(const char* str) { // 不会修改str指向的字符串内容
    // ...
}

修饰函数返回值

  • 如果是值传递,没有必要将返回值用const修饰
//对于函数来说,它的返回值为一个int类型的值,是一个临时的值没有必要用const修饰。
const int func();
  • 如果返回值为指针,加上const修饰后,同样的内容是不可以修改的。

这个时候接收的变量也必须是const修饰:

const char* func();
char* str = func();// 报错
const char* str = func(); //正确

修饰成员函数

class MyClass {
public:
    void func(int x) const;
};
  • const 修饰的成员函数为了保护成员变量,要求const 函数不能修改成员变量,否则编译会报错。
  • 函数体内不能修改成员变量的值,增加程序的健壮性或鲁棒性。只有成员函数才可以在后面加const,普通函数后加const无意义。
class MyClass {
public:
    int getValue() const { // 表明这个函数不会修改任何成员变量
        return value;
    }

private:
    int value;
};

最后举例

class Complex {
private:
    double real;
    double imag;

public:
    Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}

    // 获取实部和虚部的函数,后面加 const
    double getReal() const {
        return real;
    }

    double getImag() const {
        return imag;
    }

    // 设置实部和虚部的函数,不加 const
    void setReal(double r) {
        real = r;
    }

    void setImag(double i) {
        imag = i;
    }

    // 加法运算符重载函数,后面加 const
    Complex operator+(const Complex& other) const {
        return Complex(real + other.real, imag + other.imag);
    }
};

int main() {
    const Complex c1(1.0, 2.0);
    const Complex c2(3.0, 4.0);

    // 可以调用 const 成员函数
    Complex c3 = c1 + c2;
    std::cout << "c1 + c2 = (" << c3.getReal() << ", " << c3.getImag() << ")" << std::endl;

    // 尝试调用非 const 成员函数会导致编译错误
    // c1.setReal(5.0); // 编译错误

    return 0;
}

在这个示例中,

  • getRealgetImagoperator+ 都被声明为 const 成员函数,因此它们可以在 const 对象上调用。
  • setRealsetImag 不是 const 成员函数,因此不能在 const 对象上调用。
  • 所以Complex c3 = c1 + c2;不会报错,c1.setReal(5.0);报错了。
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI1.0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值