在了解了类的相关知识后,我们就可以开始学习将成员属性进行私有化,用来使得数据只读或者只写。而设置成员属性私有化的好处有两点
1.在实际开发过程中,我们会将成员属性设置为私有,可以自己控制读写权限
2.对于写可以检测数据的有效性
接下来举个例子,来了解Public与private的使用。
class Person
{
public:
//设置姓名()
void setName(string name)
{
m_name = name;//向外提供一个公共的成员函数,使得私有数据得以修改
}
//获取姓名()
string getName()
{
return m_name;//向外提供一个公共的成员函数,使得私有数据输出
}
//由于年龄只读,所以在public中只用来获取,如果没有开启书写的权限,那么就只能获取数据
int getAge()//但是年龄从来没有进行赋值
{
/*m_age = 0;*///在输出之前需要进行赋值操作
return m_age;
}
void setAge(int age)
{
if (age < 0 || age > 150)
{
m_age = 0;
cout << "待!妖精!" << endl;
return;//提前终止,使得错误的值没有赋值的可能性
}
m_age = age;
}
void setLover(string lover)//由public提供写入lover的权限,但是目前没有读取的权限,需要额外添加
{
m_lover = lover;
}
private:
//姓名 使得姓名可读可写
string m_name;
//年龄 只读
int m_age;
//情人 只写的权限
string m_lover;
};
int main()
{
Person p;
p.setName("张三");
/*p.setAge(10);*/
cout << "姓名为: " << p.getName() << endl;
cout << "年龄为: " << p.getAge() << endl;
p.setLover("苍井");//public中,只给了其书写数据的权限
//通过public以及private来对数据进行读写
//private设置好参数,而public就是为其提供一个渠道,来对私有数据进行读写
}
在上述代码段中,姓名、年龄、情人都属于私有数据类型。在类外是无法进行读取的!
所以想要对私有数据类型进行读取,就需要在类内进行实现。
代码段中, 函数setName是用来获取外界(main函数)中传递过来的数据(用string name 来接收字符串数据),然后在类内的函数中对私有数据进行修改。这样就可以使得私有数据在类内得到修改,修改后的结果只是得到修改,但是没有办法进行访问,所以public需要提供访问数据的渠道,于是string getName中,返回的就是上一步给的姓名数据。然后在main函数中,通过点操作符访问函数,然后就可以对数据进行访问(即返回了姓名数据)。
所以,总的来说,public是提供了一个渠道,来对私有数据类型进行修改以及访问。然后代码段中的一些其他数据,读者自行查看,总的来说就是对私有数据进行可读可写的修改。
然后举一个具体的例子,设计一个立方体的案例,设计要求如下:
1. 设计立方体类(Cube)
2. 求出立方体的面积与体积
3. 分别用全局函数与成员函数判断两个立方体是否相等
class Cube
{
public:
int m_L;
int m_W;
int m_H;
void set(int a, int b, int c)
{
L = a; W = b; H = c;
}
int getL()
{
return L;
}
int getW()
{
return W;
}
int getH()
{
return H;
}
int isSame(Cube& x)
{
if (m_L == x.getL() && m_W == x.getW() && m_H == x.getH())
{
return 1;
}
else
{
return 0;
}
}
private:
int L;
int W;
int H;
};
using namespace std;
int main()
{
Cube a;
a.m_L = 10;
a.m_W = 10;
a.m_H = 10;
Cube b;
b.set(10,10,10);
int ret = a.isSame(b);//这里访问用点操作符,然后b是需要将成员函数b的参数传递进去的;
//注意,接收时的数据类型必须要对应上!!
//(因为b的数据类型为私有,所以需要传递访问,a数据是公有的)传递b后得到对比数据
if (ret)
{
cout << "Same" << endl;
}
else
{
cout << "unlike" << endl;
}
cout << endl;
}
对代码段进行相关说明:数据有两个部分,立方体1放在公共数据中,另一部分就是立方体2放在私有数据中;公告数据直接就可以从main函数中进行修改,而私有数据就可以在类中提供一个访问并修改的渠道。
代码段中,有一段:
int isSame(Cube& x)
{
if (m_L == x.getL() && m_W == x.getW() && m_H == x.getH())
{
return 1;
}
else
{
return 0;
}
}
这一段是在类内,通过成员函数来对两个立方体来进行对比,以得到两组数据是否完全相等。
这里接收数据用的是引用,即一种指针,指针指向不变,但是指针指向的内容可以修改。指针指向了类,通过类中的访问私有数据类型的渠道,来访问立方体2的数据;(因为是在类内,所以公共类型数据可以直接调用。)
在这里使用引用的好处就是,不需要创建额外的临时空间,从而大大节省了数据空间。