发布时间:2023-11-13 12:00
c++ 面向对象的三大特征:封装、继承、多态
对象:有属性和行为
封装:
设计一个圆类,求周长
访问权限
题目要求:根据点到圆心的距离判断点和圆的关系属于哪个(在圆内、外、上、在圆心)
将点设计为一个类
核心:一个类中可以用另一个类定义一个该类成员
一个类只用一个c 和 h ,在.h 中只写声明,在.c中只写实现。属性在 .h中
对象的初始化和清理
构造函数语法:类名 (){}
析构函数语法:~ 类名(){}
两种分类方式
三种调用方式:
浅拷贝:简单的复制拷贝操作(编译器的拷贝 )
深拷贝:在堆区重新申请空间,进行拷贝操作
总结:如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题
如下图:p2拷贝p1 来的,体重的指针见下2图,拷贝时p2 p1 中的体重指针是堆区的同一个位置,p2 析构先执行释放掉内存后,p1的析构执行时会出现堆区内存重复释放的问题,所以就崩了
如何解决浅拷贝带来的这个问题
由上节的内容可以知道,每一个非静态成员函数只会诞生一份函数示例,也就是说多个同类型的对象会公用一块代码,那么问题是这一块代码如何区分哪个对象调用自己的呢?
c++通过提供特殊的对象指针,this指针,解决上述问题,this指针指向被调用的成员函数所属的对象
this指针是隐含在每一个非静态成员函数内的一种指针,不需要定义,直接使用即可
this指针的用途
链式编程思想
class Building;
class goodGay
{
public:
goodGay();
void visit();
private:
Building *building;
};
class Building
{
//告诉编译器 goodGay类是Building类的好朋友,可以访问到Building类中私有内容
friend class goodGay;
public:
Building();
public:
string m_SittingRoom; //客厅
private:
string m_BedRoom;//卧室
};
Building::Building()
{
this->m_SittingRoom = "客厅";
this->m_BedRoom = "卧室";
}
goodGay::goodGay()
{
building = new Building;
}
void goodGay::visit()
{
cout << "好基友正在访问" << building->m_SittingRoom << endl;
cout << "好基友正在访问" << building->m_BedRoom << endl;
}
void test01()
{
goodGay gg;
gg.visit();
}
int main(){
test01();
system("pause");
return 0;
}
class Building;
class goodGay
{
public:
goodGay();
void visit(); //只让visit函数作为Building的好朋友,可以发访问Building中私有内容
void visit2();
private:
Building *building;
};
class Building
{
//告诉编译器 goodGay类中的visit成员函数 是Building好朋友,可以访问私有内容
friend void goodGay::visit();
public:
Building();
public:
string m_SittingRoom; //客厅
private:
string m_BedRoom;//卧室
};
Building::Building()
{
this->m_SittingRoom = "客厅";
this->m_BedRoom = "卧室";
}
goodGay::goodGay()
{
building = new Building;
}
void goodGay::visit()
{
cout << "好基友正在访问" << building->m_SittingRoom << endl;
cout << "好基友正在访问" << building->m_BedRoom << endl;
}
void goodGay::visit2()
{
cout << "好基友正在访问" << building->m_SittingRoom << endl;
//cout << "好基友正在访问" << building->m_BedRoom << endl;
}
void test01()
{
goodGay gg;
gg.visit();
}
int main(){
test01();
system("pause");
return 0;
}