【C++】const限定符

一般来说,const限定符的使用取决于我们是否想把一个变量限定为只读变量,即这个变量一旦初始化后,它就只能作为右值,而不能出现在等号的左边。

事实上,const的知识点有很多:

1、const int a = 10;

将变量定义为只读变量,它的值无法修改,而且它不能声明,必须被初始化。因此在类成员中有const变量时,构造函数必须使用列表初始化(相同的还有引用)

当形参由const修饰时,表示形参的值不可改变

2、const int* a = &m和int *const a = &m;

(和第一点其实一样)

即指针常量和常量指针的区别

  ·指针常量 = 指向一个常量(其实因该是只读变量)的指针, 这个指针指向一个const修饰的变量,该指针可以改变(即做加减,自增,自减,或是指向其他地址),然而,该指针所指向的只读变量的值不能改变

  ·常量指针,即该指针的值(就是地址)是只读的,不可改变。它只能指向某个变量,不可改变(常量指针更像是一个变量的引用)

3、const修饰全局函数

即表示该函数的返回值不可改变

4、const修饰成员函数

表示该函数不可修改成员变量的值

若我们想在const成员函数中对某些成员变量进行修改,我们可以使用mutable关键字来修饰想要修改的成员变量

const限定的自定义类型的对象不能调用该对象所属类中的非const成员函数

ps:对于执行相同功能的const成员函数和非const成员函数(我不知道算不算重载),我们应当本着代码不重复的原则,尽量实现一次功能,并使用它两次,这意味着我们要令其中一个函数调用另一个函数。显然,我们不应该const限定的成员函数调用非const函数。

因此,我们应该:

将this指针强制转换成const型,然后调用const限定的成员函数,然后去除const限定。

class A {
public:
    int a;
    A(int input) :a(input) {};
    const int& get() const{
        cout << "const" << endl;
        return a;
    }
    int& get() {
        cout << "非const" << endl;
    
return const_cast<int&>( static_cast<const A*>(this)->get() ); } };

main函数中代码如下:

int main()
{
    const A temp1(1);
    temp1.get();
    cout << endl;
    A temp2(1);
    temp2.get();

    system("pause");
    return 0;
}

输出的结果为:

显然,对于const对象,它直接调用了const成员函数;而对于非const对象,它发生了两次调用,分别是非const成员函数,并在这个函数内部调用了const成员函数

猜你喜欢

转载自www.cnblogs.com/hhssqq9999/p/9107802.html