直接粘上代码段与注释,一目了然,//f 表示该语句有错无法运行,//t正确
#include <iostream>
#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 <iostream>
#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.指向常对象的指针与指向对象的常指针(与变量类似)