一、类的概念:
类是一种用户自定义的数据类型,用于在程序代码中表示某种概念。
类由一组成员组成,通常为数据成员和成员函数。类可以实例化,称为“对象”(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;
}