第六章(1) 类与对象之类的定义 目录
C++面向对象的三大特性为:封装、继承、多态
万物皆为对象,对象有自己的属性和行为
1 封装
1.1 类的定义
封装是C++面向对象的三大特性之一
意义:
- 将属性和行为作为一个整体
- 将属性和行为加以权限控制
语法
class 类名 {
访问权限:属性/行为
};
示例1
#include<iostream>
using namespace std;
//设计一个圆类,可以求周长和面积
const double PI = 3.14;
class circle {
//权限
public:
//属性
double r;//半径
//行为
double perimeter(){
return 2 * r * PI;//计算周长
}
double area() {
return PI * r * r;//计算面积
}
};
int main() {
circle c1;//实例化
c1.r = 1;//通过.可以访问类的属性和行为
cout << "圆形的周长是" << c1.perimeter() << endl;
cout << "圆形的面积是"<<c1.area()<<endl;
return 0;
}
示例2
#include<iostream>
#include<string>
using namespace std;
//设计一个学生类,包含姓名和学号,可以修改和显示
class student {
public:
string name;
int id;
void show() {
cout << "学生" << name << "的学号是" << id<<endl;
}
};
int main() {
student s1;
s1.name = "张三";
s1.id = 202316;
s1.show();
return 0;
}
- 类中的属性和行为称为类的成员
- 属性叫做 成员变量 成员属性
- 行为叫做 成员函数 成员方法
1.2 访问权限
有三种
- 公共权限 public 成员类内可以访问,类外也可以访问
- 保护权限 protected 成员类内可以访问,类外不可以访问
- 私有权限 private 成员类内可以访问,类外不可以访问
#include<iostream>
#include<string>
using namespace std;
class person {
public:
string name;
protected:
string car;
private:
int id;
public:
void show() {
cout << name << " " << car << " " << id << endl;
//都可以访问
}
};
int main() {
person p1;
p1.name = "张三";
//以下会报错
//p1.car = "BMW";//不可访问
//p1.id = 202316;//不可访问
p1.show();
return 0;
}
1.3 struct 和 class的区别
唯一的区别:默认的访问权限不同
- struct 默认访问权限为公有
- class 默认访问权限为私有
1.4 成员属性设置为私有
- 优点1 可以自己控制读写权限
- 优点2 对于写权限,我们可以检测数据的有效性
#include<iostream>
#include<string>
using namespace std;
class person {
// 属性设置为私有
private:
string p_name;
//通过公有函数访问和设置
public:
void setname(string name) {//写操作
p_name = name;
}
void showname() {//读操作
cout << p_name << endl;
}
};
int main() {
person p1;
//以下会报错
//p1.name = "张三";
p1.setname("张三");
p1.showname();
return 0;
}
例题 设计立方体类
设置立方体类
求出表面积和体积,分别用全局函数和成员函数判断两个立方体是否相等
#include<iostream>
#include<string>
using namespace std;
class cube {
private:
int m_l;
int m_w;
int m_h;
public:
void setm_l(int l) { m_l = l;}
void setm_h(int h) { m_h = h;}
void setm_w(int w) { m_w = w;}
int getm_l() { return m_l;}
int getm_h() { return m_h;}
int getm_w() { return m_w;}
int area() { return 2 * m_l * m_h + 2 * m_l * m_w + 2 * m_h * m_w;}
int volume() { return m_l * m_h * m_w; }
bool judge_same(cube& c) {
if (c.getm_l() == m_l && c.getm_w() == m_w && c.getm_h() == m_h) {
return true;
}
else {
return false;
}
}
};
bool judgecubesame(cube& c1,cube& c2) {
if (c1.getm_l() == c2.getm_l() && c1.getm_w() == c2.getm_w() && c1.getm_h() == c2.getm_h()) {
return true;
}
else {
return false;
}
}
int main() {
cube c1;
c1.setm_l(4);
c1.setm_w(3);
c1.setm_h(5);
cout << c1.area() << endl;
cout << c1.volume() << endl;
cube c2;
c2.setm_l(4);
c2.setm_w(3);
c2.setm_h(5);
cout << judgecubesame(c1, c2) << endl;
cout << c1.judge_same(c2) << endl;
return 0;
}
例题 点和圆的关系
设计圆类和点类,计算点和圆的关系
#include<iostream>
#include<string>
using namespace std;
class point {
private:
int p_x;
int p_y;
public:
int getx() { return p_x; }
int gety() { return p_y; }
void setx(int x) { p_x = x; }
void sety(int y) { p_y = y; }
};
class circle {
private:
point c_p;
int c_r;
public:
point getc() { return c_p; }
int getr() { return c_r; }
void setp(point p) { c_p = p; }
void setr(int r) { c_r = r; }
};
void is_incircle(point p, circle c) {
int dis = (p.getx() - c.getc().getx()) * (p.getx() - c.getc().getx()) + (p.gety() - c.getc().gety()) * (p.gety() - c.getc().gety());
int sqr_r = c.getr() * c.getr();
if (dis == sqr_r) {
cout << "p在c上";
}
else if(dis > sqr_r){
cout << "p在c外";
}
else {
cout << "p在c内";
}
}
int main() {
point p;
p.setx(3);
p.sety(4);
point c;
c.setx(0);
c.sety(0);
circle c1;
c1.setp(c);
c1.setr(5);
is_incircle(p, c1);
return 0;
}
2 类的分文件编写
- 头文件中只保留属性和行为的声明
下面是point.h文件
#pragma once
#include<iostream>
#include<string>
using namespace std;
//只保留声明
class point {
private:
int p_x;
int p_y;
public:
int getx();
int gety();
void setx(int x);
void sety(int y);
};
- 源文件中包括头文件,保留函数的实现,注意加上作用域
下面是point.cpp文件
#include<iostream>
#include<string>
#include"point.h"
using namespace std;
//只保留函数的实现
//给函数加上作用域 类名::
int point::getx() { return p_x; }
int point::gety() { return p_y; }
void point::setx(int x) { p_x = x; }
void point::sety(int y) { p_y = y; }