C++核心编程和桌面应用开发 第六天(this指针 友元)
目录
1.this指针
1.1C++中空类的大小
1.2类中成员的存储方式
1.3this指针
1.3.1常函数
1.3.2常对象
2.友元
2.1全局函数做友元
2.2类做友元
2.3成员函数做友元
1.this指针
1.1C++中空类的大小
1.2 类中成员的存储方式
1.3this指针
this指针指向被调用的成员函数所属的对象,本质是一个指针常量,指针的指向不可修改,指针指向的值可以修改。
注意:静态成员函数内部没有this指针, 静态成员函数不能操作非静态成员变量。
class Person
{
public:Person(int age){this->age = age;}Person& myPerson(Person& p){this->age=this->age+p.age;//返回自身对象return *this;}int age;
};
空指针可以调用类内的成员函数,但是若类内用到this指针则不能
1.3.1常函数
函数的形参列表后加const关键词,修饰this指针,指针指向的值和指针的指向都不可以修改。
关键字mutable会让成员变量在常函数中也可以修改
1.3.2常对象
对象前加const关键字修饰对象
const Person p1;
- 常对象无法修改成员属性;常函数无法修改成员属性
- 常对象可调用常函数,无法调用普通成员函数。
关键字mutable会让常对象也可以修改自身属性
2.友元
友元是一种特权函数或类,这个特权函数或类可以访问私有成员
2.1全局函数做友元
class Room
{
//全局函数声明为友元函数,即可访问私有变量
friend void goodFriend(Room& room);public:Room(){m_SittingRoom = 'a';m_BedRoom = 'b';}char m_SittingRoom;private:char m_BedRoom;
};void goodFriend(Room& room)
{room.m_SittingRoom;room.m_BedRoom;
}void badFriend(Room& room)
{room.m_SittingRoom;
}
2.2类做友元
class GoodFriend
{
public:GoodFriend();void visit();Room* room;
};class Room
{
//GoodFriend类可以访问Room类中的私有成员
friend class GoodFriend;public:Room();char m_SittingRoom;
private:char m_BedRoom;
};GoodFriend::GoodFriend()
{room = new Room;
}void GoodFriend::visit()
{room->m_SittingRoom;room->m_BedRoom;
}Room::Room()
{m_SittingRoom = 'a';m_BedRoom = 'b';
}
2.3成员函数做友元
class GoodFriend
{
public:GoodFriend();void visit1();void visit2();Room* room;
};class Room
{
//将成员函数在类内声明为友元
friend void GoodFriend::visit1();
public:Room();char m_SittingRoom;
private:char m_BedRoom;
};GoodFriend::GoodFriend()
{room = new Room;
}void GoodFriend::visit1()
{room->m_SittingRoom;room->m_BedRoom;
}void GoodFriend::visit2()
{room->m_SittingRoom;
}Room::Room()
{m_SittingRoom = 'a';m_BedRoom = 'b';
}