LOADING

加载过慢请开启缓存 浏览器默认开启

c++-类

2024/8/27

oi wiki原文:链接

引入

  1. 结构体属于类的一种,因某些原因被c++保留
  2. 类是结构体的拓展,其区别在于增加了成员函数
// Example:
class Object {
 public:
  int weight;
  int value;
} e[array_length];

与使用 struct 大同小异。该例定义了一个名为 Object 的类。该类拥有两个成员元素,分别为 weight,value;并在 } 后使用该类型定义了一个数组 e。

访问说明符

  • public:该访问说明符之后的各个成员都可以被公开访问,简单来说就是无论 类内 还是 类外 都可以访问。
  • protected:该访问说明符之后的各个成员可以被 类内、派生类或者友元的成员访问,但类外 不能访问。
  • private:该访问说明符之后的各个成员 只能 被 类内 成员或者友元的成员访问,不能 被从类外或者派生类中访问。
对于 struct,它的所有成员都是默认 public。对于 class,它的所有成员都是默认 private。

关于友元以及派生类的基本概念

友元(friend):使用 friend 关键字修饰某个函数或者类。可以使得在 被修饰者 在不成为成员函数或者成员类的情况下,访问该类的私有(private)或者受保护(protected)成员。简单来说就是只要带有这个类的 friend 标记,就可以访问私有或受保护的成员元素。

派生类(derived class):C++ 允许使用一个类作为 基类,并通过基类 派生 出 派生类。其中派生类(根据特定规则)继承基类中的成员变量和成员函数。可以提高代码的复用率。

派生类似 “is” 的关系。如猫(派生类)”is” 哺乳动物(基类)。

对于上面 private 和 protected 的区别,可以看做派生类可以访问基类的 protected 的元素(public 同),但不能访问 private 元素。

什么意思呢?我阐述一下我自己的观点:

class digua2010 {
    private:
        int a = 1;
        bool b = 1;
    public:
     	void print(){
         	cout << a;
        }
};
digua2010 edge;
int main() {
    edge.print();
    return 0;
}

这里我在类内调用print函数,可以成功访问private类型的a并输出

class digua2010 {
    private:
        int a = 1;
        bool b = 1;
    public:
     	void print(){
         	cout << a;
        }
};
digua2010 edge;
int main() {
    cout << edge.a;
    return 0;
}

而这个程序就会报错“*[Error] ‘int digua2010::a’ is private within this context*”

为什么?因为a我们设置了private类型,该类型不支持从类外访问。所以我们从主函数直接访问edge.a就出错了。

由于csp不会真的去考友元以及派生类的代码,所以了解其定义就可以了。