/*
date:20211102
对象的特性
成员变量和成员函数分开存储
c++会为每个空对象也分配一个字节空间,是为了区分空对象占内存的位置
this指针
本质上是 指针常量 ,指针的指向是不可以修改的
per * const this;
this指向被调用的成员函数所属的对象
解决对象冲突
返回对象本身 *this
空指针访问成员函数
不能访问成员属性,属性前默认有个this指针
const修饰成员函数
常函数
常函数不能修改成员属性(除非成员属性前修饰 mutable)
在后面修饰 const ,不可以修改指针指向的 值,也不可以修改指针的 指向
常对象
常对象只能调用常函数
------------------------------------------------------
友元
关键字 friend
全局函数做友元
类做友元
成员函数做友元
*/
#include<iostream>
#include<string>
using namespace std;
class per {
public:
//this指向被调用的成员函数所属的对象
per() {
}
per(int age) {
this->age = age;
}
//思考加引用& 和不加引用的区别
per &ageAdd(per& p) {
this->age += p.age;
return *this;
}
void showAge() {
if (this == NULL)//防止空指针
return;
cout << "age : " << age << endl;
}
//this 本质上是 指针常量 ,指针的 指向 是不可以修改的 per * const this;
// const per * this; 不能修改指针指向的 值
void fun() const//在后面修饰 const ,不可以修改指针指向的 值,也不可以修改指针的 指向
{
//age = 10;//无法修改
//this = NULL;//不可以修改指针的指向
age2 = 10;
}
int age;
mutable int age2;
};
void test() {
per p(18);
cout << p.age << endl;
}
void test02() {
per p1(10);
per p2(10);
p2.ageAdd(p1);
cout << "p2 :" << p2.age << endl;
//链式编程思想
p2.ageAdd(p1).ageAdd(p1).ageAdd(p1);
cout << "p2 :" << p2.age << endl;
}
void test03() {
//常对象只能调用常函数
const per p;
p.age;
p.fun();
}
//友元-----------------------------------------------
class build {
//全局函数做友元
friend void gf(build& bui);
public:
build() {
a = "客厅";
b = "卧室";
}
string a;
private:
string b;
};
//全局函数 做友元
void gf(build& bui) {
cout << "good friend 正在访问 : " << bui.a << endl;
cout << "good friend 正在访问 : " << bui.b << endl;
}
void test04() {
build b;
gf(b);
}
int main() {
//test();
//test02();
test04();
system("pause");
return 0;
}