C++学习--类(封装)

本文介绍了C++中的封装概念,通过实例演示了如何设计类如学生类和立方体类,讨论了封装的含义、访问权限(public,protected,private)、struct和class的区别以及成员属性的私有化及其优点。同时提到类内函数调用可以在声明之前,体现了面向对象编程的封装原则。
摘要由CSDN通过智能技术生成


C++面向对象的三大特性:封装、继承、多态。
万事万物皆可为对象,对象上有其属性和行为
具有相同性质的对象可以抽象为类

class 类名{}//最后有带分号

类中的属性和行为都叫成员:成员属性,成员变量,成员函数,成员方法。

封装

封装的意义:1.将属性和行为作为一个整体,表现生活的事物。2.将属性和行为加以权限控制

#include <iostream>
using namespace std;

//设计一个圆类,求圆的周长
//2*PI*半径

const double PI = 3.14;
class Cirle{
//访问权限
public:
    //属性
    int m_r;
    //方法
    double cal(){
        return 2*PI*m_r;//直接访问m_r
    }

};
int main(){
    //实例化:创建对象
    Cirle c1;
    //访问属性
    c1.m_r = 10;
    cout<<"周长"<<c1.cal()<<endl;
    return 0;
}

设计一个学生类,属性有姓名学号,且可以给姓名和学号赋值,可以显示姓名和学号。

class Student{
public:
//属性
    string m_name;//姓名
    int m_id;//学号
//行为
    //显示
    void showStudent(){
        cout<<"xingm:"<<m_name<<"xuehao:"<<m_id<<endl;
    }
    //赋值
    void setName(string name){
        m_name = name;
    }
    void setID(int id){
        m_id = id;
    }
};

权限

三种访问权限:

  • 公共权限:public 成员 类内可以访问,类外也可以访问
  • 保护权限:protected 成员 类内可以访问,类外不能访问(继承中用的多,儿子也可以访问父亲中保护内容)
  • 私有权限:private 成员 类内可以访问,类外不能访问(儿子不可以访问父亲中私有内容)

struct和class的区别

在C++中,struct和class唯一的区别就是默认的访问权限不同
struct 默认权限为公共 class 默认为私有。

#include <iostream>
using namespace std;

class C1 {
	int m_a; //默认权限 私有
};
struct C2 {
	int m_b; //默认公共
};

int main() {
	C1 c1;
	//c1.m_a = 100;//报错,,默认私有

	C2 c2;
	c2.m_b = 100;
	return 0;
}

成员属性设置为私有(通过公有的成员方法,对属性进行访问)

优点:

  • 将所有成员属性设置为私有,可以自己控制读写权限
  • 对于写权限,我们可以检测数据的有效性
class Person {
public:
	//通过公有的成员方法,对属性进行访问,修改(类内可访问)
	void setName(string name) {
		m_Name = name;
	}
	string getName() {
		return m_Name;
	}
private:
	string m_Name;//可读可写

	int m_Age=18;//(默认值)可读

	string m_Idol;//偶像 只写
};

int main() {
	Person p1;
	//p1.m_Name = "zhangsan";//私有,不可访问
	p1.setName("zhangsan") ;
	cout << p1.getName() << endl;
	return 0;
}

案例1:设计立方体类(Cube)

求出立方体的面积和体积
分别用全局函数和成员函数判断两个立方体是否相等。

#include <iostream>
using namespace std;

class Cube {

	//属性:长,宽,高
	//方法:求面积和体积
public:
	double getHeight() {
		return m_H;
	}
	void setHeight(double H) {
		m_H = H;
	}
	void setLenght(double L) {
		m_L = L;
	}
	void setWeight(double W) {
		m_W = W;
	}
	//求面积
	double getArea() {
		
		return 2*( m_H * m_L +m_H*m_W +m_L*m_W);
	}
	double getVolume() {

		return  m_H * m_L * m_W;
	}
	//利用成员函数判断是否相等
	bool isSame(Cube& c2) {//另一个立方体作为参数
		if (m_H == c2.m_H) return true;//省略长和高
	}

private:
	double m_H;//高
	double m_L;//长
	double m_W;//宽
};

int main() {

	Cube c1,c2;
	double area, volume;
	bool ret;
	c1.setHeight(3.0);
	c1.setLenght(3.0);
	c1.setWeight(3.0);
	area = c1.getArea();
	volume = c1.getVolume();
	cout << "面积:" << area << "  体积:" << volume << endl;
	ret = c1.isSame(c2);
	return 0;
}

学习问题:

  1. C++的类中,类内,函数调用可以在声明的变量之前?
    这是因为在 C++ 中,类的成员变量和成员函数在编译时**被视为在同一个作用域内,**因此成员函数可以直接访问类内部的所有成员变量,无论其声明顺序如何。这种设计使得成员函数能够轻松地访问类的数据,并且也符合面向对象编程的封装性原则,即类的成员函数应该能够直接访问类的内部状态。因此,在 C++ 中,类内部的成员函数可以调用没有在函数之前声明的成员变量。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值