C++类与对象【封装】

简介: C++类与对象【封装】



C++类与对象

🎄1 封装

🍉1.1 封装的意义

封装是C++面向对象三大特性之一

封装的意义:

  • 将属性和行为作为一个整体,表现生活中的事物
  • 将属性和行为加以权限控制

封装意义一:

在设计类的时候,属性和行为写在一起,表现事物

语法: class 类名{ 访问权限: 属性 / 行为 };

**示例1:**设计一个圆类,求圆的周长

示例代码:

//圆周率
const double PI = 3.14;
//1、封装的意义
//将属性和行为作为一个整体,用来表现生活中的事物
//封装一个圆类,求圆的周长
//class代表设计一个类,后面跟着的是类名
class Circle
{
public:  //访问权限  公共的权限
  //属性
  int m_r;//半径
  //行为
  //获取到圆的周长
  double calculateZC()
  {
    //2 * pi  * r
    //获取圆的周长
    return  2 * PI * m_r;
  }
};
int main() {
  //通过圆类,创建圆的对象
  // c1就是一个具体的圆
  Circle c1;
  c1.m_r = 10; //给圆对象的半径 进行赋值操作
  //2 * pi * 10 = = 62.8
  cout << "圆的周长为: " << c1.calculateZC() << endl;
  system("pause");
  return 0;
}

**示例2:**设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,可以显示学生的姓名和学号

示例2代码:

//学生类
class Student {
public:
  void setName(string name) {
    m_name = name;
  }
  void setID(int id) {
    m_id = id;
  }
  void showStudent() {
    cout << "name:" << m_name << " ID:" << m_id << endl;
  }
public:
  string m_name;
  int m_id;
};
int main() {
  Student stu;
  stu.setName("德玛西亚");
  stu.setID(250);
  stu.showStudent();
  system("pause");
  return 0;
}

封装意义二:

类在设计时,可以把属性和行为放在不同的权限下,加以控制

访问权限有三种:

  1. public 公共权限
  2. protected 保护权限
  3. private 私有权限

示例:

//三种权限
//公共权限  public     类内可以访问  类外可以访问
//保护权限  protected  类内可以访问  类外不可以访问
//私有权限  private    类内可以访问  类外不可以访问
//protected和private的区别主要体现在继承上
//例如:儿子可以访问父亲中protected的内容,但是不可以访问private的内容
class Person
{
  //姓名  公共权限
public:
  string m_Name;
  //汽车  保护权限
protected:
  string m_Car;
  //银行卡密码  私有权限
private:
  int m_Password;
public:
  void func()
  {
    m_Name = "张三";
    m_Car = "拖拉机";
    m_Password = 123456;
  }
};
int main() {
  Person p;
  p.m_Name = "李四";
  //p.m_Car = "奔驰";  //保护权限类外访问不到
  //p.m_Password = 123; //私有权限类外访问不到
  system("pause");
  return 0;
}
🍉1.2 struct和class区别

在C++中 struct和class唯一的区别就在于 默认的访问权限不同

区别:

  • struct 默认权限为公共
  • class 默认权限为私有
class C1
{
  int  m_A; //默认是私有权限
};
struct C2
{
  int m_A;  //默认是公共权限
};
int main() {
  C1 c1;
  c1.m_A = 10; //错误,访问权限是私有
  C2 c2;
  c2.m_A = 10; //正确,访问权限是公共
  system("pause");
  return 0;
}
🍉1.3 成员属性设置为私有

**优点1:**将所有成员属性设置为私有,可以自己控制读写权限

**优点2:**对于写权限,我们可以检测数据的有效性

示例:

class Person {
public:
  //姓名设置可读可写
  void setName(string name) {
    m_Name = name;
  }
  string getName()
  {
    return m_Name;
  }
  //获取年龄 
  int getAge() {
    return m_Age;
  }
  //设置年龄
  void setAge(int age) {
    if (age < 0 || age > 150) {
      cout << "你个老妖精!" << endl;
      return;
    }
    m_Age = age;
  }
  //情人设置为只写
  void setLover(string lover) {
    m_Lover = lover;
  }
private:
  string m_Name; //可读可写  姓名
  
  int m_Age; //只读  年龄
  string m_Lover; //只写  情人
};
int main() {
  Person p;
  //姓名设置
  p.setName("张三");
  cout << "姓名: " << p.getName() << endl;
  //年龄设置
  p.setAge(50);
  cout << "年龄: " << p.getAge() << endl;
  //情人设置
  p.setLover("苍井");
  //cout << "情人: " << p.m_Lover << endl;  //只写属性,不可以读取
  system("pause");
  return 0;
}

🕮2 总结

在代码的舞台上,C++翩翩起舞。

纵观代码的山川大地,无边的可能在眼前延展, C++,是智慧的风,吹动着科技的帆船。

用韵律的二进制,谱写着自由的交响曲, C++,是数字艺术的荣光,闪烁在信息的星空。

愿C++永远如诗,激励创造者的灵感。

渴望挑战C++的学习路径和掌握进阶技术?不妨点击下方链接,一同探讨更多C++的奇迹吧。我们推出了引领趋势的💻C++专栏:《C++从基础到进阶》 ,旨在深度探索C++的实际应用和创新。🌐🔍

相关文章
|
2天前
|
C++
【C++】日期类Date(详解)②
- `-=`通过复用`+=`实现,`Date operator-(int day)`则通过创建副本并调用`-=`。 - 前置`++`和后置`++`同样使用重载,类似地,前置`--`和后置`--`也复用了`+=`和`-=1`。 - 比较运算符重载如`&gt;`, `==`, `&lt;`, `&lt;=`, `!=`,通常只需实现两个,其他可通过复合逻辑得出。 - `Date`减`Date`返回天数,通过迭代较小日期直到与较大日期相等,记录步数和符号。 ``` 这是236个字符的摘要,符合240字符以内的要求,涵盖了日期类中运算符重载的主要实现。
|
2天前
|
存储 编译器 C++
【C++】类和对象④(再谈构造函数:初始化列表,隐式类型转换,缺省值
C++中的隐式类型转换在变量赋值和函数调用中常见,如`double`转`int`。取引用时,须用`const`以防修改临时变量,如`const int& b = a;`。类可以有隐式单参构造,使`A aa2 = 1;`合法,但`explicit`关键字可阻止这种转换。C++11起,成员变量可设默认值,如`int _b1 = 1;`。博客探讨构造函数、初始化列表及编译器优化,关注更多C++特性。
|
2天前
|
编译器 C++
【C++】类和对象④(类的默认成员函数:取地址及const取地址重载 )
本文探讨了C++中类的成员函数,特别是取地址及const取地址操作符重载,通常无需重载,但展示了如何自定义以适应特定需求。接着讨论了构造函数的重要性,尤其是使用初始化列表来高效地初始化类的成员,包括对象成员、引用和const成员。初始化列表确保在对象创建时正确赋值,并遵循特定的执行顺序。
|
2天前
|
C语言 C++
【C++】日期类Date(详解)③
该文介绍了C++中直接相减法计算两个日期之间差值的方法,包括确定max和min、按年计算天数、日期矫正及计算差值。同时,文章讲解了const成员函数,用于不修改类成员的函数,并给出了`GetMonthDay`和`CheckDate`的const版本。此外,讨论了流插入和流提取的重载,需在类外部定义以符合内置类型输入输出习惯,并介绍了友元机制,允许非成员函数访问类的私有成员。全文旨在深化对运算符重载、const成员和流操作的理解。
|
2天前
|
定位技术 C语言 C++
C++】日期类Date(详解)①
这篇教程讲解了如何使用C++实现一个日期类`Date`,涵盖操作符重载、拷贝构造、赋值运算符及友元函数。类包含年、月、日私有成员,提供合法性检查、获取某月天数、日期加减运算、比较运算符等功能。示例代码包括`GetMonthDay`、`CheckDate`、构造函数、拷贝构造函数、赋值运算符和相关运算符重载的实现。
|
2天前
|
编译器 C++
【C++】类和对象③(类的默认成员函数:赋值运算符重载)
在C++中,运算符重载允许为用户定义的类型扩展运算符功能,但不能创建新运算符如`operator@`。重载的运算符必须至少有一个类类型参数,且不能改变内置类型运算符的含义。`.*::sizeof?`不可重载。赋值运算符`=`通常作为成员函数重载,确保封装性,如`Date`类的`operator==`。赋值运算符应返回引用并检查自我赋值。当未显式重载时,编译器提供默认实现,但这可能不足以处理资源管理。拷贝构造和赋值运算符在对象复制中有不同用途,需根据类需求定制实现。正确实现它们对避免数据错误和内存问题至关重要。接下来将探讨更多操作符重载和默认成员函数。
|
5天前
|
存储 编译器 C语言
【C++航海王:追寻罗杰的编程之路】类与对象你学会了吗?(上)
【C++航海王:追寻罗杰的编程之路】类与对象你学会了吗?(上)
10 2
|
4天前
|
C++
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
7 0
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
|
5天前
|
存储 编译器 C++
【C++ 初阶路】--- 类和对象(下)
【C++ 初阶路】--- 类和对象(下)
7 1
|
5天前
|
存储 编译器 C语言
【C++初阶路】--- 类和对象(中)
【C++初阶路】--- 类和对象(中)
10 1