C++面向对象的三大特性为 :封装、继承、多态。C++认为万事万物皆为对象,对象上有其属性和行为。例如人可以看作一个对象,属性有姓名、年龄、性别、身高、体重等。具有相同性质的对象,我们可以抽象称为类,人属于人类,车属于车类。
属性和行为
封装
:封装是C++面向对象的三大特性之一。
封装的意义
:将属性和行为作为一个整体 ,表现生活中的事物。将属性和行为加以权限控制。
案例设计
案例1 圆类
建立一个圆类,并求圆的周长。
#include<iostream>
using namespace std;
//圆周率
const double PI = 3.14;
//设计一个圆类,求圆的周长
//圆的周长 = 2*PI*r
//class代表设计一个类,类后面跟着类名称
class circle {
//权限
//公共权限
public:
//属性
//圆的半径
int r;
//行为
//获取圆的周长
double calculate() {
return 2 * PI * r;
}
};
int main() {
//通过圆类,创建具体的圆(对象)
//实例化就是通过一个类,创建一个对象的过程
circle c1;
//给圆对象的属性进行赋值
c1.r = 10;
cout << "圆c1的周长为:" << c1.calculate() << endl;
system("pause");
return 0;
}
案例2 学生类
设计一个学生类,属性有姓名和学号。可以给姓名和学号赋值,可以显示学生的姓名和学号。
#include <iostream>
#include<string>
using namespace std;
//设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,可以显示学生的姓名和学号
class Student {
//公共权限
public:
//类中的行为和属性统一称为成员
//属性 成员属性,成员变量
string sname;
int sid;
//行为 成员函数,成员方法
void show() {
cout << "学生的姓名为" << sname << endl;
cout << "学生的学号为" << sid << endl;
}
//通过行为来进行赋值操作
//给姓名赋值
void setName(string name) {
sname = name;
}
//给学号赋值
void setId(int id) {
sid = id;
}
};
int main() {
Student s1;
Student s2;
//s1.sid = 01;
//s1.sname = "张三";
s1.setName("张三");
s1.setId(1);
s1.show();
s2.sid = 2;
s2.sname = "李四";
s2.show();
system("pause");
return 0;
}
案例3 立方体类
创建一个立方体类,获取立方体的表面积和体积,然后比较两个立方体是否相等。
#include<iostream>
using namespace std;
//设计立方体类,求出立方体的表面积和体积
//分别用全局函数和成员函数判断两个立方体是否相等
//立方体表面积: 2(长*宽)+2(长*高)+2(宽*高) 立方体体积:长*宽*高
class Cube {
public:
//设置长
void setlong(int l) {
clong = l;
}
//获取长
int getlong() {
return clong;
}
//设置高
void sethigh(int h) {
chigh = h;
}
//获取高
int gethigh() {
return chigh;
}
//设置宽
void setwide(int w) {
cwide = w;
}
//获取宽
int getwide() {
return cwide;
}
//获取立方体表面积
int getScube() {
return 2 * clong * chigh + 2 * clong * cwide + 2 * chigh * cwide;
}
//获取立方体体积
int getVcube() {
return clong * cwide * chigh;
}
//利用成员函数判断两个立方体是否相等,成员函数只需要传入一个参数就可以
bool issamebyClass(Cube &c) {
if (clong == c.getlong() && chigh == c.gethigh() && cwide == c.getwide()) {
return true;
}
return false;
}
private:
int clong;
int chigh;
int cwide;
};
利用全局函数来判断两个立方体是否相等,全局函数需要传入两个参数
bool isSame(Cube &c1,Cube &c2) {
if (c1.gethigh() == c2.gethigh() && c1.getlong() == c2.getlong() && c1.getwide() == c2.getwide()) {
return true;
}
return false;
}
int main() {
//实例化立方体对象
Cube c1;
c1.sethigh(10);
c1.setlong(10);
c1.setwide(10);
cout << "立方体c1的表面积为:" << c1.getScube() << endl;
cout << "立方体c1的表面积为:" << c1.getVcube() << endl;
Cube c2;
c2.sethigh(10);
c2.setlong(10);
c2.setwide(10);
//利用全局函数判断
bool result1 = isSame(c1,c2);
if (result1) {
cout << "全局函数下两个立方体相等" << endl;
}
else {
cout << "全局函数下两个立方体不相等" << endl;
}
//利用成员函数判断
bool result2 = c1.issamebyClass(c2);
if (result2) {
cout << "成员函数下两个立方体相等" << endl;
}
else {
cout << "成员函数下两个立方体不相等" << endl;
}
system("pause");
return 0;
}
案例4 点类和圆类
构造两个类,圆类和点类。判断该点在圆的内部还是外侧。要求分文件编写。
point.h
点类头文件
#pragma once //防止头文件重复包含
#include<iostream>
using namespace std;
class Point {
public:
//设置x
void setp_x(int x);
//获取x
int getp_x();
//设置y
void setp_y(int y);
//获取y
int getp_y();
private:
//点x坐标
int p_x;
//点y坐标
int p_y;
};
point.cpp
点类实现
#include"point.h"
//shift+tab可以整体缩进
//设置x
void Point::setp_x(int x) { //会报错 要加上Point:: 来表示是在Point作用域下的一个函数
p_x = x;
}
//获取x
int Point::getp_x() {
return p_x;
}
//设置y
void Point::setp_y(int y) {
p_y = y;
}
//获取y
int Point::getp_y() {
return p_y;
}
circle.h
圆类头文件
#pragma once
#include<iostream>
#include"point.h"
using namespace std;
//圆类
class Circle {
public:
//设置半径
void setc_r(int r);
//获取半径
int getc_r();
//设置圆心 因为圆心是一个点,所以参数要传一个点进来
void setc_center(Point center);
//获取圆心
Point getc_center();
private:
//圆的半径
int c_r;
//圆心
Point c_center; //在案例中,可以让另一个类作为本类的成员
};
circle.cpp
圆类实现
#include"circle.h"
//设置半径
void Circle::setc_r(int r) {
c_r = r;
}
//获取半径
int Circle::getc_r() {
return c_r;
}
//设置圆心 因为圆心是一个点,所以参数要传一个点进来
void Circle::setc_center(Point center) {
c_center = center;
}
//获取圆心
Point Circle::getc_center() {
return c_center;
}
main.cpp
主函数实现
#include<iostream>
#include"circle.h"
#include"point.h"
using namespace std;
//设计一个圆类和一个点类,判断点和圆的关系
/*点到圆心距离 == 半径 点在圆上
点到圆心距离 > 半径 点在圆外
点到圆心距离 < 半径 点在圆内*/
//建立坐标系 圆心坐标(x1,y1) 点坐标(x2,y2) 两点之间距离 =根号下(x1-x2)^2+(y1-y2)^2
//为减少根号使用 将半径平方 然后进行比较
//判断点和圆之间的关系函数 参数要传进来一个圆,再传进来一个点
void Compare(Circle &c,Point &p) {
//计算两点之间距离的平方
int distance =
(c.getc_center().getp_x() - p.getp_x()) * (c.getc_center().getp_x() - p.getp_x()) +
(c.getc_center().getp_y() - p.getp_y()) * (c.getc_center().getp_y() - p.getp_y());
//计算半径的平方
int rdistance = c.getc_r() * c.getc_r();
//比较距离大小
if(distance == rdistance) {
cout << "这个点在圆上" << endl;
}
else if(distance > rdistance) {
cout << "这个点在圆外" << endl;
}
else {
cout << "这个点在圆内" << endl;
}
}
int main() {
//创建圆
Circle c1;
c1.setc_r(10);
Point center;
center.setp_x(10);
center.setp_y(10);
c1.setc_center(center);
//创建点
Point p1;
p1.setp_x(10);
p1.setp_y(0);
//判断关系
Compare(c1,p1);
system("pause");
return 0;
}
访问权限
类在设计时,可以把属性和行为放在不同权限下加以控制。访问权限有三种,public,private,protected。
#include<iostream>
using namespace std;
//三种访问权限
//公共权限 public 成员 类内可以访问,类外也可以访问
//保护权限 protected 成员 类内可以访问,类外不可以访问 父亲的车,儿子也可以开
//私有权限 private 成员 类内可以访问,类外不可以访问 父亲的银行卡密码,儿子不可以知道
class Person {
public:
string p_name;
protected:
string p_car;
private:
int p_password;
public:
void func() {
p_name = "张三";
p_car = "宝马";
p_password = 123456;
}
};
int main() {
//实例化一个对象
Person p1;
p1.p_name = "李四";
// p1.p_car = "奔驰"; //保护权限内容,类外访问不到
// p1.p_password = 123; //私有权限内容,类外访问不到
system("pause");
return 0;
}
class和struct区别
C++中class和struct的唯一区别在于默认的访问权限不同。struct默认权限为公共,class默认权限为私有。
#include<iostream>
using namespace std;
//class和struct的区别
class C1 {
int number; //默认权限是私有
};
struct C2 {
int number; //默认权限是公共
};
int main() {
//实例化对象
C1 c1;
C2 c2;
// c1.number = 10; //class默认权限私有,因此类外不可以进行访问
c2.number = 10; //struct默认权限公共,因此类外可以进行访问
system("pause");
return 0;
}
成员属性置为私有的优点
优点:可以自己控制读写权限。对于写权限,可以检测数据的有效性。
#include<iostream>
#include<string>
using namespace std;
//成员属性设置私有
//可以自己控制读写权限
//对于写入操作可以检测数据的有效性
class Person {
public:
//设置姓名
void setname(string name) {
p_name = name;
}
//获取姓名
string getname() {
return p_name;
}
/*获取年龄 只读
int getage() {
p_age = 18;
return p_age;
}*/
//设置年龄
void setage(int age) {
if (age < 0 || age>150) {
cout << "请输入正确年龄,否则默认设定年龄为0" << endl;
p_age = 0;
return;
}
p_age = age;
}
//获取年龄
int getage(){
return p_age;
}
//获取爱人 只写
void setlover(string lover) {
p_lover = lover;
}
private:
//可读可写
string p_name;
//只读
int p_age;
//只写
string p_lover;
};
int main() {
//实例化对象
Person p1;
p1.setname("张三");
cout << "姓名:" << p1.getname() << endl;
p1.setage(18);
cout << "年龄:" << p1.getage() << endl;
p1.setlover("美女"); //可写 外部不可读
// cout << "爱人:" << p1.p_lover << endl;
system("pause");
return 0;
}