C++梁哥笔记day5 | 我的日常分享

C++梁哥笔记day5

类和对象

一、封装

  1. 把变量(属性)和函数(操作)合成一个整体,封装在一个类中
  2. 对变量和函数进行访问控制,访问权限的设置(公有的、私有的、保护的)
  3. 在类的内部(作用域范围内),没有访问权限之分,所有成员都可以相互访问
  4. 在类的外部,访问权限才有意义:public、protected、private
  5. 在类的外部,只有public修饰的成员才能被访问,在没有涉及继承与派生时,private和protected是同等级的,外部不允许访问。
访问属性 属性 对象内部 对象外部
public 公有 可访问 可访问
protected 保护 可访问 不可访问
private 私有 不可访问 不可访问

权限是对外不对内的

二、类的初始

1
2
3
4
5
6
7
8
9
class 类名{//抽象的概念 系统不会为其分配空间

private://私有的 类的外部 不可直接访问
protected://保护的 类的外部 不可直接访问
public://公有的 类的外部 可以直接访问
数据
方法
//在类的内部没有权限之分 都可以相互访问
};

系统不会为类分配空间但是他占有空间,当实例化或定义一个对象的时候系统才会为其分配空间

  • class与struct的区别:class默认访问权限为private,struct默认访问权限为public。

将成员变量设置为private

  1. 可以赋予客户端访问数据的一致性。如果成员变量不是public,客户端唯一能够访问对象的方法就是通过成员函数。如果类中所有public权限的成员都是函数,客户在访问类成员时只会默认访问函数,不需要考虑访问的成员需不需要添加(),这就省下了许多搔首弄耳的时间。
  2. 可细微划分访问控制。使用成员函数可使得我们对变量的控制处理更加精细。如果我们让所有的成员变量为public,每个人都可以读写它。如果我们设置为private,我们可以实现不准访问、只读访问、读写访问,甚至你可以写出只写访问。

练习
请设计一个Person类,Person类具有name和age属性,提供初始化函数Init(),并对name和age的读写函数set()、get(),但必须确保age的赋值在有效范围0~100,超出有效范围,拒绝赋值,并提供方法输出姓名和年龄。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class Person{
private:
char m_name[32];
int m_age;
public:
void Init(char *name,int age){
if(name != NULL)
strcpy(m_name,name);
if(age <100 && age>0){
m_age = age;
}else{
cout<<"输入数据无效"<<endl;
}
}
void setName(char *name){
if(name != NULL)
strcpy(m_name,name);
}
char *getName(){
return m_name;
}
void setAge(int age){
if(age <100 && age>0){
m_age = age;
}else{
cout<<"输入数据无效"<<endl;
}
}
int getAge(){
return m_age;
}
void showPerson(){
cout<<"name:"<<m_name<<" age:"<<m_age<<endl;
}
};
int main(int argc, char *argv[])
{
Person p1;
p1.Init("lucy",20);
p1.showPerson();
cout<<p1.getAge()<<endl;
p1.setAge(30);
p1.setName("bob");
p1.showPerson();
cout<<p1.getName()<<endl;
return 0;
}

运行结果:
图片