C++核心(面向对象)
类和对象
C++面向对象的三大特性:封装、继承、多态。万物皆为对象,对象有其属性和行为。
- 对象:人;属性:身高和体重;行为:走、跳、跑
- 具有相同性质的对象可以抽象为类,如人类
封装
1.封装的意义
- 将属性和行为作为整体,表现生活中的事物
- 将属性和行为加以权限控制
意义一:设计类的时候,将属性和行为写在一起,表现事物;class 类名 {访问权限:属性和行为}。
#include <iostream>
#include <string>
using namespace std;
class Student //类,类中包含的属性和行为可以称为成员,成员变量包括属性和行为
{
public: //访问权限
//属性,又称成员属性
string name;
int num;
//行为,又称成员函数
void cal() //输出
{
cout<<name<<" "<<num<<endl;
}
void na(string name_na) //给姓名赋值
{
name = name_na;
}
void nu(int num_nu) //给学号赋值
{
num = num_nu;
}
};
int main()
{
Student s1; //通过学生类来创建具体的对象,实例化
s1.na("Li");
s1.nu(123456);
s1.cal();
return 0;
}
意义二:把属性和行为放在不同的权限下,加以控制。
- public 公共权限 成员可以被类内访问,也可被类外访问
- protected 保护权限 成员可以被类内访问,不可被类外访问
- private 私有权限 成员可以被类内访问,不可被类外访问
#include <iostream>
#include <string>
using namespace std;
class Man
{
public:
string name; //公有类型
protected:
string car; //保护类型
private:
int password; //私有类型
public:
void func()
{
name = "Li";
car = "benchi";
password = 123456;
}
};
int main()
{
Man m1;
m1.func(); //公有的行为可以通过类内访问公有、保护和私有类型
cout<<m1.name<<endl; //公有类型可以类外访问
return 0;
}
2.struct和class的区别
- struct默认权限为公有
- class默认权限为私有
#include <iostream>
#include <string>
using namespace std;
struct Teacher{
string sex = "nan";
};
class Student
{
string name = "Li";
};
int main()
{
Student s1;
Teacher t1;
//cout<<s1.name<<endl; //报错,类默认为私有,类外无法访问
cout<<t1.sex<<endl; //结构体默认是共有,类外可以访问
return 0;
}
3.成员属性设置为私有
优点:
- 将成员属性设置为私有,可以自己控制读写权限
- 对于写权限,我们可以控制数据有效性
#include <iostream>
#include <string>
using namespace std;
class Person
{
public:
void writename(string na_name)
{
name = na_name;
}
void getname()
{
cout<<name<<endl;
}
void getage()
{
cout<<age<<endl;
}
void writesex(string na_sex)
{
sex = na_sex;
}
private: //将属性设置为私有,通过行为来控制其读写权限
string name; //可读可写
int age; //只读
string sex; //只写
};
int main()
{
Person p1;
p1.writename("Li");
p1.getname();
p1.writesex("nan");
return 0;
}
4.综合案例
要求:设计一个立方体类,求出立方体的表面积和体积,并利用全局函数和成员函数分别判断两个立方体是否相等。
#include <iostream>
#include <string>
using namespace std;
class Cube
{
public:
//成员函数
void setl(int l) //设置立方体的长
{
c_l = l;
}
int getl() //获取立方体的长
{
return c_l;
}
void setw(int w) //设置立方体的宽
{
c_w = w;
}
int getw() //获取立方体的宽
{
return c_w;
}
void seth(int h) //设置立方体的高
{
c_h = h;
}
int geth() //获取立方体的高
{
return c_h;
}
int cals() //计算立方体的表面积
{
return c_l*c_w*2 + c_l*c_h*2 + c_w*c_h*2;
}
int calv() //计算立方体的体积
{
return c_l * c_w * c_h;
}
bool issame(Cube &c1) //成员函数
{
if(c_l==c1.getl() && c_w==c1.getw() && c_h==c1.geth())
{
return true;
}
else
{
return false;
}
}
private:
//成员属性
int c_l; //长
int c_w; //宽
int c_h; //高
};
bool issame(Cube &c, Cube &c1) //全局函数
{
if(c.getl()==c1.getl() && c.getw()==c1.getw() && c.geth()==c1.geth())
{
return true;
}
else
{
return false;
}
}
int main()
{
Cube c, c1;
c.setl(10);
c.setw(10);
c.seth(10);
cout<<"length:"<<c.getl()<<" "<<"width:"<<c.getw()<<" "<<"height:"<<c.geth()<<endl;
cout<<"superficial area:"<<c.cals()<<" "<<"volume:"<<c.calv()<<endl;
c1.setl(10);
c1.setw(10);
c1.seth(20);
bool res1, res2;
//全局函数判断两个立方体是否相等
res1 = issame(c, c1); //全局函数需要传两个参数
cout<<"res1 = "<<res1<<endl;
//成员函数判断两个立方体是否相等
res2 = c.issame(c1); //成员函数只需传一个参数
cout<<"res2 = "<<res2<<endl;
return 0;
}