C++面向对象的三大特性为:封装、继承、多态。
C++认为万事万物皆为对象,对象上有其属性和行为
例如:
人可以作为对象,属性有姓名、年龄、身高、体重…行为有唱、跳、跑…
车也可以作为对象,属性有轮胎、方向盘、大灯…行为有载人、放音乐、开空调…
具有相同性质的对象,我们可以抽象称为类,人属于人类,车属于车类…
封装是C++面向对象的三大特征之一
封装的意义:
将属性和行为作为一个整体,表现生活中的事物
将属性和行为加以权限控制
在设计类的时候,属性和行为写在一起,表现事物
class 类名{访问权限: 属性 / 行为};
示例:
示例1:创建一个圆类,求圆的周长
#include<iostream>
using namespace std;
double pi = 3.14;
//class 代表设计一个类,类后面紧跟着的就是类名称
class Circle
{
//访问权限
//公共权限
public:
//属性
//半径
int c_r;
//行为
//获取圆的周长
double calculateZC()
{
return 2 * pi * c_r;
}
};
int main(void)
{
//通过圆类创建具体的圆(对象)
//实例化——通过一个类创建一个对象的过程
Circle c1;
//给圆对象的属性进行赋值
c1.c_r = 10;
cout << "圆的周长为" << c1.calculateZC() << endl;
return 0;
}
示例2:创建一个学生类
#include<iostream>
#include<string>
using namespace std;
class Student
{
public:
string s_Name;
int s_Id;
void showStudent()
{
cout << "姓名: " << s_Name << "ID:" << s_Id << endl;
}
//赋值
void inputName(string name)
{
s_Name = name;
}
};
int main(void)
{
Student s1;
//s1.s_Name = "张三";
s1.inputName("赵六");
s1.s_Id = 123456;
s1.showStudent();
return 0;
}
类中的属性和行为,我们统称为成员
属性-成员属性-成员变量
行为-成员函数-成员方法
类在设计时,可以把属性和行为放在不同的权限下,加以控制
访问权限有三种
public——公共权限——成员类内可以访问,类外可以访问
protected–保护权限——成员类内可以访问,类外不可以访问
private——私有权限——成员类内可以访问,类外不可以访问
#include<iostream>
#include<string>
using namespace std;
class Person
{
public:
string p_name;
protected:
string p_car;
private:
int p_password;
public:
void funcshow()
{
p_name = "张三";
p_car = "拖拉机";
p_password = 123456;
}
};
int main(void)
{
Person p1;
p1.p_name = "王五";
//p1.p_car = "GTR";protected类外无法访问
//p1.p_password = 123;private类外无法访问
return 0;
}
struct和class 在C++中struct和class的唯一区别就是默认的访问权限不同。
区别:
struct默认权限为公共public class默认权限为私有private 成员属性设置为私有
优点1:将所有成员属性设置为私有,可以自己控制读写权限。
优点2:对于写权限,我们可以检测数据的有效性。
示例:
#include<iostream>
#include<string>
using namespace std;
class Person
{
public:
//设置姓名
void setName(string name)
{
p_name = name;
}
//获取姓名
string getName()
{
return p_name;
}
//获取年龄
int getAge()
{
return p_age;
}
//设置年龄
void setAge(int age)
{
p_age = age;
if (age < 0 || age >150)
{
p_age = 0;
cout << "什么鬼" << endl;
return;
}
}
//设置伙伴
void setLover(string lname)
{
lover = lname;
}
private:
//姓名 可读可写
string p_name;
//年龄 可读可写加个范围
int p_age;
//伙伴 只写
string lover;
};
int main(void)
{
Person p1;
p1.setName("张三");
cout << "姓名:" << p1.getName() << endl;
p1.setAge(18);
cout << "年龄:" << p1.getAge() << endl;
p1.setLover("赵四");
return 0;
}
求立方体的面积和体积
分别用全局函数和成员函数判断两个立方体是否相等
#include<iostream>
using namespace std;
class Cube
{
public:
void setl(int l)
{
C_L = l;
}
int getl()
{
return C_L;
}
void setw(int w)
{
C_W = w;
}
int getw()
{
return C_W;
}
void seth(int h)
{
C_H= h;
}
int geth()
{
return C_H;
}
//表面积
int calculateS()
{
return 2 * C_L * C_W + 2 * C_L * C_H + 2 * C_W * C_H;
}
//体积
int calculateV()
{
return C_L * C_W * C_H;
}
//成员函数判断是否相等
bool issamebyClass(Cube &c)
{
if (C_H== c.geth() && C_L == c.getl() && C_W == c.getw())
{
return true;
}
return false;
}
private:
int C_L;
int C_W;
int C_H;
};
//利用全局函数判断相等
bool issame(Cube &c1, Cube &c2)
{
if (c1.geth() == c2.geth() && c1.getl() == c2.getl() && c1.getw() == c2.getw())
{
return true;
}
return false;
}
int main(void)
{
Cube c1;
c1.seth(10);
c1.setl(10);
c1.setw(10);
cout << c1.calculateS() << endl;
cout << c1.calculateV() << endl;
Cube c2;
c2.seth(10);
c2.setl(10);
c2.setw(10);
//判断是否相等
bool ret = issame(c1, c2);
if (ret)
{
cout << "c1和c2相等" << endl;
}
else
{
cout << "c1和c2不相等" << endl;
}
//成员函数判断
bool ret2 = c1.issamebyClass(c2);
if (ret2)
{
cout << "利用成员函数,c1和c2相等" << endl;
}
else
{
cout << "利用成员函数,c1和c2不相等" << endl;
}
system("pause");
return 0;
}