分类
Level5

一、类的概念:
类是一种用户自定义的数据类型,用于在程序代码中表示某种概念。
类由一组成员组成,通常为数据成员和成员函数。类可以实例化,称为“对象”(object),可以通过.访问对象的成员。类也可被认为是包含其成员的名字空间。
特别注意:以struct声明的结构体中的成员默认是public形式,以class声明的类中的成员默认为private形式,因此上述代码中的private修饰符可以省略。

二. 的定义和使用
对于面向对象的C++语言学习,类和对象的理解是整个语言学习中核心的基础(在信息学算法竞赛中,这部分不是重点)。通俗的理解,类其实就是一个模型,是一种变量类型,对象就是这个类型定义出来的具体的变量,就像int a这句话,int 对应类型,a 就对应对象。但int是内置类型,不是我们自定义的数据类型。
类是对象的抽象概括,对象是类的具体实例

#include <iostream>
using namespace std;
const int N = 1000010;
class Person{  //自定义类型Person
    private:  //私有成员变量
        int age=888;
        double money;
        string books[100];
    public:  //公有成员变量
        string name;
        int height;
    Person(){ //无参构造函数,若未显式定义,会自动生成 
    }
    Person(string a,int b,double m){
        name=a;
        age=b; 
        money=m;
    }
    Person(string s) : name(s) {}
    void say(){  //类的成员函数,也就是类中的函数
        cout<<"I'm "<<name<<","<<"I'm "<<age<<","<<"I have "<<money<<endl;
    }
    int getAge(){
        return age;
    } 
    int setAge(int x){
        age=x;
    }
    void addMoney(double x){
        money+=x;
    }
    //一个类有且只有一个析构函数。若未显式定义,会自动生成
    ~Person(){
        cout<<"~delete Person:"<<name<<endl;
    }
};
 
int main(){
    Person c1;    
    c1.name = "Li";  // 正确!访问公有变量
    //c.age = 18;    // 错误!访问私有变量
    c1.setAge(18);   // 正确!
    c1.addMoney(100);
    c1.say();
     
    Person c2("zhansan");    
    c2.say();
    Person c3("wang",101,45.98);    
    c3.say();
    Person *c4=new Person("zhao",56,123.456);    
    c4->say();
    //delete(c3);//错误,普通对象声明周期结束会自动销毁 
    delete(c4); //需要显式销毁指针对象
     
    return 0;
}

类中的变量、函数被称为类的成员变量、成员函数。private后面的内容是私有成员变量在类的外部不能直接访问;public后面的内容是公有成员变量,在类的外部可以直接访问。结构体和类的作用是一样的。不同点在于类默认是private,结构体默认是public

三:C++三大特征:封装 继承 多态
封装 是将数据与方法进行结合,隐藏对象的部分属性和实现细节,对外开放一些接口,通过这些接口约束,类外可以合理的访问类内的属性。
继承 是面向对象程序设计代码可以复用的重要手段,它允许程序在保持原有类特性的基础上进行扩展,增加功能,产生的新类称为派生类。
多态 即多种形态,具体来说就是去完成某个行为,当不同的对象去完成相同的动作会产生不同的形态。

class Rectangle{ //定义一个矩形类,类名是Rectangle
    private: //私有变量,对象无法直接访问,保护数据的作用
        int width,height; 
    public://调用公开的成员函数,可以起到修改成员数据的作用
        void set_values(const int &_width,const int &_height){
            width=_width;
            height=_height;
        }
        int area() const{
            return width*height;
        }
        Rectangle operator + (const Rectangle &rhs) const{
            return Rectangle(width+rhs.width,height+rhs.height);
        }
        Rectangle operator += (const Rectangle &rhs) const{
            return width+=rhs.width,height+=rhs.height,*this;
        }
}rect; //定义rect变量是一个Rectangle类的对象

四、成员函数和运算符重载
类的成员函数是定义在类的内部的函数,用于实现类的某项操作,具有访问类内所有成员的权限。定义为public的成员函数可被外界调用,定义为private的成员函数仅可被类的其他成员函数调用。

class Rectangle{ //定义一个矩形类,类名是Rectangle
    private: //私有变量,对象无法直接访问,保护数据的作用
        int width,height; 
    public://调用公开的成员函数,可以起到修改成员数据的作用
        void set_values(int int);
}rect; //定义rect变量是一个Rectangle类的对象
void Rectangle::set_values(int x,int x){
    width=x;
    height=y; 
}

可以对常见的运算符或操作进行重载,如下表:

#include<iostream> 
#include<cstring>
#include<algorithm> 
using namespace std;
//以高精度加法类为例,对运算符进行重载
const int N=1000;
class Number{
    int value[N],length;
    public:
        void clear(){
            length=0;
            memset(value,0,sizeof(value));
        }
    void input(){
        static char buf[N];
        scanf("%s",buf);  
        for(int i=0;buf[i];++i) value[length++]=buf[i]-'0';
        reverse(value,value+length);
    }
    void output(){
        for(int i=length-1;~i;--i) putchar(value[i]+'0');
        puts("");
    }
    Number operator + (const Number &rhs) const{//重载加法
        Number result;result.clear();
        result.length=std::max(length,rhs.length);
        for(int i=0;i<result.length;++i){
            result.value[i]+=value[i]+rhs.value[i];
            if(result.value[i]>9){ //进位
                 result.value[i]-=10;
                 result.value[i+1]++;
            }
        }
        if(result.value[result.length]) result.length++;
        return result;
    }
}A,B,C;
int main(){
	A.input(); //输入大整数A
	B.input(); //输入大整数B
	C=A+B;
	C.output(); //输出大整数C
	
	return 0;
}