C++学习笔记“类和对象”;封装的意义,struct和class区别,成员属性设置为私有;练习案例
目录
4 类和对象
4.1 封装
4.1.1 封装的意义
4.1.2 struct和class区别
4.1.3 成员属性设置为私有
练习案例1:设计立方体类
练习案例2:点和图的关系
4 类和对象
C++面向对象的三大特性为:封装、继承、多态
C++认为万事万物都皆为对象,对象上有其属性和行为
例如:
人可以作为对象,属性有姓名、年龄、身高、体重..,行为有走、跑、跳、吃饭、唱歌..
车也可以作为对象,属性有轮胎、方向盘、车灯…行为有载人、放音乐、放空调….
具有相同性质的对象,我们可以抽象称为类,人属于人类,车属于车类
4.1 封装
4.1.1 封装的意义
封装是C++面向对象三大特性之一
封装的意义:
将属性和行为作为一个整体,表现生活中的事物
将属性和行为加以权限控制
封装意义一:
在设计类的时候,属性和行为写在一起,表现事物
语法:class 类名 { 访问权限:属性 / 行为 };
示例1:设计一个圆类,求圆的周长
示例代码:
#include
using namespace std;
const double PI = 3.1415926;
//设计一个圆类,求圆的周长和面积
//圆的周长=2πr,面积=πr^2
//class 代表这是一个类,Circle 代表类名
class Circle {
//访问权限修饰符,public代表公开,可以被任何地方访问
public:
//属性,圆的半径
double radius;
//行为,求圆的周长
double perimeter() {
return 2 * PI * radius;
}
//行为,求圆的面积
double area() {
return PI * radius * radius;
}
};
int main() {
//通过圆类,创建具体的圆(对象)
//实例化:通过一个类名,创建一个具体的对象的过程叫做实例化
Circle c1, c2;
//给圆类属性赋值
c1.radius = 10;//半径为10
c2.radius = 20;//半径为20
//调用圆类的方法,求周长和面积
cout << "c1的周长:" << c1.perimeter() << endl;
cout << "c1的面积:" << c1.area() << endl;
cout << "c2的周长:" << c2.perimeter() << endl;
cout << "c2的面积:" << c2.area() << endl;
return 0;
}
示例2:设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,可以显示学生的姓名和学号
#include
using namespace std;
#include
//设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,可以显示学生的姓名和学号
class Student {
public:
//类中的属性和行为,我们统一称为成员
//属性,成员属性,成员变量
//行为,成员方法,成员函数
//属性
string name;//姓名
int id;//学号
//行为,显示学生的姓名和学号
void display() {
cout << "姓名:" << name << endl;
cout << "学号:" << id << endl;
}
void setName(string n) {
name = n;
}
void setId(int i) {
id = i;
}
};
int main(){
Student s2;
//s2.name = "李四";
s2.setName ("李四");
//s2.id = 654321;
s2.setId(654321);
s2.display();
return 0;
}
封装意义二:
类在设计时,可以把属性和行为放在不同的权限下,加以控制访问权限有三种:
- 1. public公共权限
- 2.protected 保护权限
- 3. private私有权限
代码示例:
#include
using namespace std;
// 访问权限
//公共访问权限:public,默认访问权限;其他类都可以访问
//私有访问权限:private,只有本类可以访问;其他类不能访问
//保护访问权限:protected,本类和子类可以访问;其他类不能访问
class Person {
public:
//公共访问权限
string name;//姓名
private:
//私有访问权限
int password;//密码
protected:
//保护访问权限
string car;//汽车
public:
void printInfo() {
name = "张三";
password = 123456;
car = "宝马";
cout << "姓名:" << name << endl;
cout << "密码:" << password << endl;
cout << "汽车:" << car << endl;
}
};
int main() {
Person p;//创建对象
p.printInfo();//调用公共方法
p.name = "李四";
//p.car = "奔驰";//不能访问保护成员,因为保护成员只能本类和子类访问
//p.password = 654321;//不能访问私有成员,因为私有成员只能本类访问
return 0;
}
4.1.2 struct和class区别
在C++中 struct和class唯一的区别就在于 默认的访问权限不同区别:
- struct 默认权限为公共
- class 默认权限为私有
代码
#include
using namespace std;
class C1 {
int A;//默认权限为私有 private
};
struct S1 {
int A;//默认权限为公共 public
};
int main() {
//struct和class的区别
//1.默认访问权限不同:struct默认public,class默认private
C1 c1;
c1.A = 10; //error: 'C1' has no member named 'A';因为C1的默认权限为private,所以不能直接访问A成员变量
S1 s1;
s1.A = 10; //ok;因为S1的默认权限为public,所以可以直接访问A成员变量
return 0;
}
4.1.3 成员属性设置为私有
优点1:将所有成员属性设置为私有,可以自己控制读写权限
优点2:对于写权限,我们可以检测数据的有效性
代码示例:
#define _CRT_SECURE_NO_WARNINGS
#include
using namespace std;
#include
//成员属性设置为私有
//1、可以自己控制读写权限
//2、对于写,可以检测数据有效性
//人;类定义
class Person {
public:
// 在此处设置名称
void setName(string name) {//可读可写
this->name = name;//若数据有效,则设置姓名
}
// 设置年龄,若年龄不合法则输出错误信息
void setAge(int age) {//可读可写
if (age 150) {
cout << "年龄不合法" <age = age;//若年龄合法,则设置年龄
}
// 设置偶像
void setIdol(string idol) {//只写
this->idol = idol;//设置偶像
}
// 获取名称
string getName() {
return name;
}
// 获取年龄
int getAge() {
return age;
}
// 获取偶像
string getIdol() {
return idol;
}
private:
string name;//姓名;可读可写
int age = 20;//年龄;可读可写
string idol;//偶像;只写
};
int main() {
Person p;//创建对象
p.setName("张三");//设置姓名
p.setAge(25);//设置年龄
p.setIdol("周杰伦");//设置偶像
cout << "姓名:" << p.getName() << endl;
cout << "年龄:" << p.getAge() << endl;
cout << "偶像:" << p.getIdol() << endl;
return 0;
}
练习案例1:设计立方体类
设计立方体类(Cube)
求出立方体的面积和体积
分别用全局函数和成员函数判断两个立方体是否相等
代码示例:
#include
using namespace std;
// 立方体类设计
//1、创建类Cube,包含三个数据成员:长、宽、高
//2、设计属性
//3、设计方法,获取长、宽、高、体积、表面积、体积和表面积的比值
//4、分别利用全局函数和成员函数,判断两个立方体是否相等
class Cube {
public:
//设置长
void setLength(int len) {
length = len;
//this->length = len;//this指的是当前对象,即Cube类
}
//获取长
int getLength() {
return length;
}
//设置宽
void setWidth(int wid) {
width = wid;
//this->length = wid;//this指的是当前对象,即Cube类
}
//获取宽
int getWidth() {
return width;
}
//设置高
void setHeight(int hei) {
height = hei;
//this->length = hei;//this指的是当前对象,即Cube类
}
//获取高
int getHeight() {
return height;
}
//获取体积
int getVolume() {
return length * width * height;
}
//获取面积
int getSurfaceArea() {
return 2 * (length * width + length * height + width * height);
}
//利用成员函数判断两个立方体是否相等
bool MemberFunction(Cube &cube) {
if (getLength() == cube.getLength() && getWidth() == cube.getWidth() && getHeight() == cube.getHeight()) {
return true;
} else {
return false;
}
}
private:
int length; // 长
int width; // 宽
int height; // 高
};
//全局函数判断两个立方体是否相等
bool GlobalFunction(Cube &cube1, Cube &cube2) {
if (cube1.getLength() == cube2.getLength() && cube1.getWidth() == cube2.getWidth() && cube1.getHeight() == cube2.getHeight()) {
return true;
} else {
return false;
}
}
int main() {
//创建两个立方体
Cube cube1, cube2;
//设置立方体1的长宽高
cube1.setLength(10);
cube1.setWidth(10);
cube1.setHeight(10);
//设置立方体2的长宽高
cube2.setLength(10);
cube2.setWidth(10);
cube2.setHeight(10);
//获取立方体1的长宽高
cout << "立方体1的长:" << cube1.getLength() << endl;//
cout << "立方体1的宽:" << cube1.getWidth() << endl;//
cout << "立方体1的高:" << cube1.getHeight() << endl;//
//获取立方体1的体积和面积
cout << "立方体1的体积:" << cube1.getVolume() << endl;//
cout << "立方体1的面积:" << cube1.getSurfaceArea() << endl;//
//获取立方体2的长宽高
cout << "立方体2的长:" << cube2.getLength() << endl;//
cout << "立方体2的宽:" << cube2.getWidth() << endl;//
cout << "立方体2的高:" << cube2.getHeight() << endl;//
cout << "立方体2的体积:" << cube2.getVolume() << endl;//
cout << "立方体2的面积:" << cube2.getSurfaceArea() << endl;//
//利用全局函数判断两个立方体是否相等
bool result = GlobalFunction(cube1, cube2);
if (result) {
cout << "两个立方体相等" << endl;
} else {
cout << "两个立方体不相等" << endl;
}
//利用成员函数判断两个立方体是否相等
result = cube1.MemberFunction(cube2);
if (result) {
cout << "两个立方体相等" << endl;
}
else {
cout << "两个立方体不相等" << endl;
}
//system("pause");
return 0;
}
练习案例2:点和图的关系
设计一个圆形类(Circle),和一个点类(Point),计算点和圆的关系。
代码示例
#include
#include
using namespace std;
//点和圆的关系
//定义点类
class Point{
private:
double x, y;
public:
//设置x坐标
void setX(double _x) {
x = _x;
}
//设置y坐标
void setY(double _y) {
y = _y;
}
//获取x坐标
double getX() {
return x;
}
//获取y坐标
double getY() {
return y;
}
};
//定义圆类
class Circle{
private:
double r;//半径
//在类外定义Point类,因为类外可以访问类内的私有成员
//在类中定义Point类的对象,可以访问类内的私有成员
Point center;//圆心
public:
//设置半径
void setR(double _r) {
r = _r;
}
//获取半径
double getR() {
return r;
}
//设置圆心
/*void setCenter(double _x, double _y) {
center.setX(_x);
center.setY(_y);
}*/
void setCenter(Point _center) {
center = _center;
//this->Point_center = center;
}
//获取圆心
Point getCenter() {
return center;
}
};
//判断点和圆的关系
void isPointInsideCircle(Point p, Circle c){
//计算两点之间的距离,平方
double distance = (p.getX() - c.getCenter().getX()) * (p.getX() - c.getCenter().getX()) + (p.getY() - c.getCenter().getY()) * (p.getY() - c.getCenter().getY());
//计算半径的平方
double rSquare = c.getR() * c.getR();
//判断两点是否在圆内
if (distance == rSquare) {
cout << "点在圆上" < rSquare) {
cout << "点在圆外" << endl;
}
else {
cout << "点在圆内" << endl;
}
}
int main(){
//创建圆
Circle c;//圆心坐标为(10,0),半径为10
c.setR(10);//设置半径
Point center;//圆心坐标为(10,0)
center.setX(10);//设置圆心x坐标
center.setY(0);//设置圆心y坐标
c.setCenter(center);//设置圆心坐标
//创建点
Point p;
p.setX(10);//设置点x坐标
p.setY(10);//设置点y坐标10
//判断点和圆的关系
isPointInsideCircle(p, c);
return 0;
}