#include<iostream>
using namespace std;
//常量指针:指向常量的指针 const int* p = &a; 更加关注 不可以通过指针 改变 指针所指向的变量或对象的值;
//指针常量:指针是一个常量 int* const p = &a; 更加关注 指针指向唯一性
class A {
public: //记得加上作用域,不然默认为私有
A() {}
~A() {}
void A()
{
a = 5;
}
void isCommon(); //等价于:void isCommon(A* const this); 指针常量
void isConst() const; //常量成员函数; 等价于:void isCommon(const A* const this); 常量指针
private:
int a;
};
void A::isCommon() {}
void A::isConst() const
{
//this->a = 6; //(×) //常量指针所指向的对象是不可以被改变的; 换句话说:在常量成员函数内,成员数据是不可以作为左值被赋值的;
//(*this).a = 5; //(×)
int b = this->a;
return;
}
//const的作用:修改隐式参数this指针的类型 --> 常量指针 --> 不可通过指针改变指针所指对象的值 --> 函数体内的成员变量的读写模式变为只可读不可写;
/*
* 一:常量成员函数的作用:
* ①改变函数体内成员数据的读写模式,从 可读可写 变成 只读;
* ②成员函数加上const可以更便捷的告诉开发者该函数是个只读函数,若你的函数体设计不对成员数据进行赋值,那么建议将函数声明为常量成员函数;
*/
// 二:常量成员函数的调用规则
void test00()
{
A a;
a.isCommon(); //非常量指针指向非常量对象 (√)
a.isConst(); //常量指针指向非常量对象 (√)
const A aa;
//aa.isCommon(); //非常量指针指向常量对象 (×)
aa.isConst(); //常量指针指向常量对象 (√)
/*
* C++ Primer原话:默认情况下,this的类型是指向类类型非常量版本的常量指针。
* 指针类型必须与其所指对象类型一致;但有两个例外:①允许令一个常量指针指向非常量对象;②
*/
}
//三、常量成员函数注意点:
// 声明和定义时都需要在参数列表后加const;
//**************************************************************************************************************************
//常函数
class Person
{
public:
//this指针的本质 是指针常量 指针的指向是不可以修改的
// const Person * const this;
//在成员函数后面加const,修饰的是this指向,让指针指向的值也不可以修改
void showPerson() const
{
this->m_B = 100;
//this->m_A = 100;
//this = NULL; //this指针不可以修改指针的指向的
}
void func()
{
m_A = 100;
}
int m_A;
mutable int m_B; //特殊变量,即使在常函数中,也可以修改这个值,加关键字mutable
};
void test01()
{
Person p;
p.showPerson();
}
//常对象
void test02()
{
const Person p; //在对象前加const,变为常对象
//p.m_A = 100;
p.m_B = 100; //m_B是特殊值,在常对象下也可以修改
//常对象只能调用常函数
p.showPerson();
//p.func(); //常对象 不可以调用普通成员函数,因为普通成员函数可以修改属性
}
int main()
{
system("pause");
return 0;
}
C++ 常量成员函数的碎碎知识点
最新推荐文章于 2023-05-14 23:37:49 发布