类(封装)
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;
}
学习问题:
- C++的类中,类内,函数调用可以在声明的变量之前?
这是因为在 C++ 中,类的成员变量和成员函数在编译时**被视为在同一个作用域内,**因此成员函数可以直接访问类内部的所有成员变量,无论其声明顺序如何。这种设计使得成员函数能够轻松地访问类的数据,并且也符合面向对象编程的封装性原则,即类的成员函数应该能够直接访问类的内部状态。因此,在 C++ 中,类内部的成员函数可以调用没有在函数之前声明的成员变量。