C++ 基础语法 7(C++对象模型和this指针、空指针访问成员函数、const修饰函数即变量)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

//const修饰成员函数

#include<iostream>
using namespace std;
#include<string>
#include<time.h>

//C++对象模型和this指针

//C++当中,类内 的 成员变量 和 成员函数 分开存储 !!!!! 只有 非静态成员变量 才属于类的对象上!

//class Person
//{
//public:
// int m_A;//非静态 成员变量 -----是属于类对象上的!!!!!
//
// static int m_B;//静态成员变量 -----不属于类的对象上!!!!!
//
// void func() {}//非静态 成员函数 -----与非 静态变量是分开存储的 !!!!! 也是不属于类的对象上的!!!!!
//
//};
//int Person::m_B = 10;
//
//void test01()
//{
// Person p;//当Person里面什么都没有时 所创建的对象被称为 -空对象!!!!!!!!!!
// cout << "size of p (空对象所占用内存空间是)= " << sizeof(p) << endl; //1个字节 :
// //因为C++编译器会给每个空对象也分配一个字节空间,是为了区分空对象占内存的位置
// //每个空对象都应该有一个 独一无二的内存!!!!!
//}
//void test02()
//{
// Person p2;//Person里面存在变量了 不是 空对象了!
// cout << "size of p2 (空对象所占用内存空间是)= " << sizeof(p2) << endl;//4个字节
// //就是Person里面 int m_A所占用的字节数!!!!! static 静态变量m_B不占有类的字节数!
// //非静态 成员函数 与非静态 变量是分开存储的 !!!!!
//}
//int main()
//{
// //test01();
// test02();
// system("pause");
// return 0;
//}


//this指针:指向被调用的成员函数的所属对象!!!!!-this指针隐含在每一个 非静态的成员函数 内的一种指针;不需要 定义,直接使用即可
//用途:当形参和成员变量同名时,可以用this指针来区分;(解决名称冲突!)
//在类的非静态成员函数当中 !返回对象本身 !,可使用“return *this”

//class Person
//{
//public:
// Person(int age)
// {
// this->age = age;//this->age表示的是 成员属性 的age !!!!!this指针指向的是 被调用 的 成员函数 的 所属的对象!!!!!
// }
// Person& PersonAddAge(Person &p)
// {
// this->age += p.age;//自身的年龄 +p。ag(传入的年龄)
//
// return *this;//this是指向p2的指针,而*this就是指向p2的本体!!!!! 所以函数类型应该用 !引用 !的方式返回!!!!!
// }
//
// int age;//成员属性的名称 和 成员形参 要有规范!
//};
////1、用来解决名称冲突!
//void test01()
//{
// Person p1(18);
// cout << "p1的年龄是: " << p1.age << endl;
//}
////2、返回对象本身用 *this
//void test02()
//{
// Person p1(10);
//
// Person p2(20);
//
// //如果要求p1 p2 的和
// p2.PersonAddAge(p1);
// cout << "p1 和 p2的年龄之和是 :" << p2.age << endl;
//
// //如果想再加几个年龄重复相加
////这种方法是叫: 链式编程思想!!!!!!!!!!
//
// p2.PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1);// 错误!因为函数调用完成之后的返回的类型void 应该改成返回的是 p2
// cout << "p1 和 p2的 重复 年龄之和是 :" << p2.age << endl;
//
//}
//int main()
//{
// //test01();
// test02();
// system("pause");
// return 0;
//}


//空指针访问成员函数

//class Perosn
//{
//public:
// void showClassName()//成员函数
// {
// cout << "this is Person class" << endl;
// }
// void showPersonAge()
// {
// if (this == NULL) //判断是否为空指针!!!!!
// {
// return;
// }
// cout << "age = " << m_Age << endl;//m_Age是一属性 编译器在前面都默认加上了 “this->” 表示这是的前对象的属性
// }
// int m_Age;
//};
//void test01()
//{
// Perosn *p = NULL;//空指针
// p->showClassName();//指针调用成员函数
//
// p->showPersonAge();//因为是空指针 所以在m_Age当中 是没有 确切的对象的属性age !!!!! 所以错误
//}
//int main()
//{
// test01();
// system("pause");
// return 0;
//}


//const修饰成员函数

//常函数
//当成员函数后面加上const修饰之后称这个函数为 -----常函数
//常函数 内 不能 更改成员属性
//成员属性声明时加关键字 mutable 后,在常函数当中依然可以修改!!!!!

//常对象
//声明对象前加const 称为该对象的常对象
//常对象只能调用常函数

class Person

{

public:

//this指针的本质 是指针常量! 指针的 指向 是不能修改的!!!!! 但是 this 指针的指向的值是可以修改的 !!!!!-----在不加const的情况下

void showPerson() const //加上const 后内部就不能修改 属性 的值!!!!!(其本质是修饰 this 指针)!

{

//函数内部其实是 this->m_A=10;

m_B = 200;//加上特殊关键字 mutable 之后才能修改!!!!!

}

int m_A;

mutable int m_B;

};

void test01()

{

const Person p;//在定义对象前面加上const ,变为 常对象!!!!!-这个对象的属性也是不允许修改的!!!!!

p.showPerson();//常对象只能调用常函数!!!!!不能调用普通的成员函数!因为普通的成员函数可以修改属性!!!!!

}

int main()

{

system("pause");

return 0;

}


阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: c++

“C++ 基础语法 7(C++对象模型和this指针、空指针访问成员函数、const修饰函数即变量)” 的相关文章