C++学习笔记“类和对象”;封装的意义,struct和class区别,成员属性设置为私有;练习案例

作者 : admin 本文共6430个字,预计阅读时间需要17分钟 发布时间: 2024-06-1 共3人阅读

个人学习笔记

目录

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;
}

本站无任何商业行为
个人在线分享 » C++学习笔记“类和对象”;封装的意义,struct和class区别,成员属性设置为私有;练习案例
E-->