//************ this 指针
//多个成员调用同一个成员函数,如何区分是谁在调用这个成员函数
//谁调用这个成员函数,成员函数里面的this指针就指向谁
//1.解决名称冲突
//2.返回对象本身用 *this
class Person
{
public :
//1.名称冲突 成员变量和传入变量的命名一致,导致运行错误
//Person(int age)
//{
// age = age;
//}
//int age;
//上述问题的解决方案,this指向 调用该成员函数的对象
Person(int age){
this->age = age;}
//void PersonAddAge(Person& p)
//{
// this->age += p.age;
//}
Person& PersonAddAge(Person& p){
this->age += p.age;return *this;}
int age;};
void test(){
Person p1(18);
cout <<"p1.age = "<< p1.age << endl;}
void test02(){
Person p1(10);
cout <<"p1.age = "<< p1.age << endl;
Person p2(10);
p1.PersonAddAge(p2);
//下面会报错,因为p1.PersonAddAge(p2);返回的是一个void类型,如果要进行下面的才做,就需要返回成员函数本身
p1.PersonAddAge(p2).PersonAddAge(p2).PersonAddAge(p2);
cout <<"p1.age = "<< p1.age << endl;}
int main(){
test();
test02();return0;}
//************ 空指针调用成员函数
class Person
{
public:
void showName(){
cout <<" this is showName"<< endl;}
void showAge(){if(this == NULL){return;}
cout <<" this is showAge"<< m_age << endl; //m_age == this -> m_age,this如果是空的,是无法访问里面的成员的
}
int m_age;};
void test(){
Person* p = NULL; //定义了一个空指针
p->showName();
p->showAge(); //这里是会报错的,
}
int main(){
test();return0;}
//************ const 修饰成员函数 常函数 const修饰对象,常对象
//常函数
//1.成员函数后面加cosnt 称为常函数
//2.常函数内不可以修改成员属性
//3.成员属性声明加关键字mutable之后,常函数中仍然可以修改
//常对象,声明对象前加const 称该对象为常对象
//常对象只能调用常函数
class Person
{
public:
//每一个成员函数内部都有一个this指针
//this 指针的本质,是指针常量,该指针的指向是不可以修改的,但是指针的指向的值是可以修改的
//void showPerson() const之后,指针指向的值也将无法修改
void showPerson() const
{
/* this->m_age =100;*/
m_b =100;
cout <<" this is showName"<< endl;}
//常对象只能调用常函数
void func(){}
int m_age;
mutable int m_b; //即使在常函数中也可以修改他的值
};
void test(){
Person p;
p.showPerson();}
//常对象
void test02(){
const Person p;
p.m_a =100; //报错,由于const对对象p的修饰,将无法修改
p.m_b =100; //这个依然可以修改
//常对象只能调用常函数,func是普通的函数,普通函数里面是可以修改成员的属性,但是常函数里面是不可以修改成员函数的属性的
//两者是矛盾的
p.func();}
int main(){
test();return0;}