const、底层和顶层

85 阅读3分钟
#include <iostream>
#include <fstream>

using namespace std;

/*******************************************************

                C++ const与指针
               
        1. 当const在*的前面时,允许修改指针p的位置,而不允许修改*p的值
        2. 当const在*的后面时,指针p不能变,*p可以变
        3. 当const在*的前后都有时,指针p不能变,*p也不可以变
        4. 顶层const表示const定义的变量本身是个常量, 底层const表示定义变量所指对象是一个常量
        https://www.jianshu.com/p/fbbcf11100f6
        http://wangwlj.com/2018/01/06/CPP_06/
        
                C++ const与成员函数
        https://www.cnblogs.com/wintergrass/archive/2011/04/15/2015020.html
        https://blog.csdn.net/audience_fzn/article/details/80455236
        const放在返回值类型前面修饰返回值为常量,放在函数后面修饰该函数为常量函数。
        在类中将成员函数修饰为const,const修饰this指针指向的对象,这也就保证调用这个const成员函数的对象在内部不会被改变
        表明在该函数体内,不能修改对象的数据成员而且不能调用非const函数。
        为什么不能调用非const函数?因为非const函数可能修改数据成员,const成员函数是不能修改数据成员的,
        所以在const成员函数内只能调用const函数
        众所周知,在相同参数及相同名字的情况下,const是可以构成函数重载的,但const成员函数不能更改任何非静态成员变量;

        类中二函数都存在的情况下:

        const对象默认调用const成员函数,非const对象默认调用非const成员函数;

        若非const对象想调用const成员函数,则需显式转化,如(const Student&)obj.getAge();

        若const对象想调用非const成员函数,同理const_cast<Student&>(constObj).getAge();(注意:constObj要加括号)

        类中只有一函数存在的情况下:

        非const对象可以调用const成员函数或非const成员函数;

        const对象只能调用const成员函数,直接调用非const函数时编译器会报错;
        
        1)const成员函数可以访问非const对象的非const数据成员、const数据成员,也可以访问const对象内的所有数据成员;

        2)非const成员函数可以访问非const对象的非const数据成员、const数据成员,但不可以访问const对象的任意数据成员;

        3)作为一种良好的编程风格,在声明一个成员函数时,若该成员函数并不对数据成员进行修改操作,应尽可能将该成员函数声明为const 成员函数。

*******************************************************/

int main()
{
    double num = 8;
    const double *p = &num;  //当const在*的前面时,允许修改指针p的位置,而不允许修改*p(即num)的值,等价于double const *p = &num

    cout << p << endl;
    p++;
    cout << p << endl;
    //*p = 5;
    //cout << *p << num << endl;

    double num2 = 10;
    double* const p2 = &num2; //当const在*的后面时,指针p不能变,*p可以变

    cout << p2 << endl;
    //p2++;
    //cout << p2 << endl;

    *p2 = 3;
    cout << *p2 << num2 << endl;

    double num3 = 5;
    const double* const p3 = &num3; //当const在*的前后都有时,指针p不能变,*p也不可以变

    cout << p3 << endl;
    //  p2++;
    //cout << p2 << endl;

    //*p3 = 3;
    //cout << *p3 << num3 << endl;

    return 0;
}