【C++】封装

167 阅读2分钟

1. 封装

1.1 实例

#include <iostream>
using namespace std;
const double PI = 3.14;
class Student
{
public:
  // 行为
  void setName(string name)
  {
    this->name = name;
  }
  string getName()
  {
    return name;
  }
  void print();
private:
  // 属性
  string name;
};
void Student::print()
{
  cout << "name: " << name << endl;
}
int main()
{
  Student s1;
  // 1. 通过对象名和成员运算符访问对象中的成员
  s1.setName("John");
  // 2. 通过指向对象的指针访问对象的成员
  Student *p = &s1;
  p->setName("Mary");
  // 3. 通过对象的引用访问对象中的成员
  Student &r = s1;
  r.setName("Lucy");
  cout << s1.getName() << endl;
  return 0;
}

1.2 权限

  1. public 公共权限(类内可以访问)
  2. protected 保护权限(类内可以访问,类外不可以访问)
  3. private 私有权限(类内可以访问,类外不可以访问)

1.3 struct 和 class 的区别

  • struct 默认权限为公共
  • class 默认权限为私有

1.4 成员函数的存储方式:

  • 实例化对象时需要分配内存空间,数据和函数都需要存储空间
  • 同一个类的不同对象的数据是不一样的,因此要为每个对象的数据成员分配内存单元
  • 同一个类的不同对象的函数是一样的,因此将同类的所有对象的函数放在一个公共的区域

1.5 对象成员的访问:

Student s1;
// 1. 通过对象名和成员运算符访问对象中的成员
s1.setName("John");
// 2. 通过指向对象的指针访问对象的成员
Student *p = &s1;
p->setName("Mary");
// 3. 通过对象的引用访问对象中的成员
Student &r = s1;
r.setName("Lucy");

2. 构造函数和析构函数

2.1 构造函数

  • 创建对象时对对象的数据成员初始化
  • 构造函数是类的一个特殊的成员函数,构造函数名与类名相同,且没有返回值
  • 构造函数不需要用户调用,由系统在创建对象时自动调用
  • 构造函数内容一般是初始化数据语句,但也可以是其他的语句
  • 创建对象时肯定会执行一个构造函数
// 构造函数
class Person
{
public:
    Person(int age)
    {
        this->age = age;
    }

private:
    int age;
};
// 另一种构造函数的形式
class Box
{
public:
    Box(int height, int length, int width):
    (height),(length),(width){}
    
private:
    int height;
    int length;
    int width;
};
// 同理
class Boxes
{
public:
    Boxes(int height, int length, int width):
    h(height), l(length), w(width) {}
    
private:
    int h;
    int l;
    int w;
};
  • 如果没有手动写构造函数,那么系统会自动生成一个无参的、函数体为空的默认构造函数。

2.2 析构函数

  • 析构函数在对象生命周期结束时自动调用。
  • 析构函数没有返回值和参数。
  • 如果没有手动写析构函数,那么系统会自动生成一个默认析构函数。
~Person() {}

3. 访问对象成员