C/C++中const的问题

直接粘上代码段与注释,一目了然,//f 表示该语句有错无法运行,//t正确
#include 
#include "stdio.h"

int main() {

    int a=101;
    int b = 102;
    const int c = 100;
    int *p;

    const int* p1 = &a; //指向const int型的指针
    int* const p2 = &a; //指向int型的cnost指针(好理解)
    int  const *p3 = &a;//指向const int型的指针(int const = const int,编译器设定,没有为什么)
    const int *p4 = &a; //指向const int型的指针

    *p1 = 100; //f   (矛盾1:)因为是指向const int型的指针,所以他指向的数据是不能改变,那矛盾来了。
    a=100;     //t   这里的a为什么能改变呢?是因为a本身不是const int ,而指向const int型的指针是允许指向int型(编译器设定的,没有理由)
                //   这就导致了*p1不能赋值,而a可以。
    *p2 = 100; //t
    *p3 = 100; //f
    *p4 = 100; //f
    
    
    p1 = &b;//t
    p2 = &b;//f
    p3 = &b;//t
    p4 = &b;//t

    p = p1;//f        const int 型的指针不能赋值给int型指针
    p = &c;//f        const int 型变量的地址不能赋值给int型指针
    p = (int *)&c;//t 强制转换 
    
    printf("\n%d",*p1);
    printf("\n%d",*p2);
    printf("\n%d",*p3);
    printf("\n%d",*p4);
    return 0;
}




#include 
#include "stdio.h"

//const对象的若干
//经过以前的总结可以得出一个结论:const的修饰作用是不允许改变。
//从编译器的角度来说这个不允许改变的内容可以是变量,指针,对象(类),指针所指对象等等


//Q:const对象中,对象的所有成员变量都是const型。
//c/c++编译器中普通指针是无法指向const类型的变量的(这是规定)
//
//A:因此这里就有一个问题:成员函数如何调用成员变量?
//已知正常情况下成员函数是通过隐形指针调用成员变量,而隐形指针不是const型指针,这样就出现了矛盾。
//于是重新定义了语法
//函数定义 void XXX() const ; 就保证了函数可以访问const变量(当然构造函数与析构函数是除外的)


//Q: 如果对于一个const对象,其部分成员变量需要更改怎么办?
//A: c++提供了mutable关键字,可以允许const类型的成员函数对该变量进行修改


class const_test
{
private:
    int a ;
    mutable int b ;
public:
    void show() const{
        printf("%d",a);
        printf("\n");
        printf("%d",b);
        printf("\nend\n");

    }

    void show_nc() {
        printf("%d",a);
    }

    void set_b() const{
        b = 50;
    }

    const_test(int d_a, int d_b):a(d_a),b(d_b){};
    ~const_test(){};


};



int main() {
    const_test const t1(100,100);
    t1.show();
//    t1.show_nc();
    t1.set_b();
    t1.show();

    
//    对象的引用方法与变量的引用方法一致
    const_test t2(100,100);
    const_test &t3 = t2;
    t2.show();
    t2.set_b();
    t3.show();

}

//总结
//1。常对象的所有成员变量都是const型
//2.常成员函数的定义
//3.指向常对象的指针与指向对象的常指针(与变量类似)




你可能感兴趣的:(c/c++,c++,c)