目录
前言
这里主要是记录下面向对象相关的一些笔记心得。
一、面向对象的概念
1.结构化程序设计
面向对象的概念出现之前,主要的设计方法是面向过程的设计方法,这种设计方法也叫结构化设计。结构化设计强调数据类型和数据结构,注重程序的易读性、可靠性和可维护性。
我们常说的程序=数据结构+算法就体现了这种设计理念。
主要的思想就是自顶向下、逐步求精及模块化。在实际的开发过程中通常会把一个非常复杂的程序分解成很多个小单元,然后使用函数来解决这些小单元中的问题。在这种设计思路下,我们需要考虑的就是程序的分解,函数之间的调用,函数的设计。程序设计的过程就是函数编写的过程。
2.面向对象思想程序设计
在结构化设计的时候,强调的是”独立功能,单入口单出口“,当程序非常大的时候,不同的开发人员可能会定义很多功能相似的函数,包括分解程序的时候,也会定义很多全局变量等等,不同的开发人员可能会花大量的时间去熟悉函数之间的调用规则,命名规范等等,这无疑浪费了大量的时间和成本,后期的维护、排查、调试都讲变得困难,这个时候我们可能就有了函数复用、降低模块之间的耦合度的需求,这个时候,面向对象的设计应运而生。
面向对象的主要特点就是把一些有共性的事物抽象成对象的概念。相同的对象有两个特性,一种是状态,另外一种是行为。在面向对象的概念中,对象的状态叫做属性,对象的行为叫做对对象的操作,在开发的过程中,对对象的操作一般是通过函数来实现的。
提到面向对象就不得不说它的三个特点:继承、多态、封装。
当然在有的书中,把抽象也当成了面向对象的一个特点。抽象就是讲同一类事物的共同特点概括出来。抽象的意义就在于把有相同属性的事物归纳、划分为某个类,例如学生类、员工类、动物类、教师类等等。
当我们完成抽象之后,会将数据和对数据操作的函数放在一起作为一个类的定义。这个类的定义的过程叫做封装。在类的定义中,描述属性的数据叫做成员变量或者数据成员,函数成为成员函数。通过封装,我们可以把属性和成员函数联系起来,构成一个独立的单元。
通过封装我们可以将对象的一部分属性或者实现细节隐藏起来,只给出如何使用的信息。
当有新的类出现之后,我们可以通过继承,以设计好的类为基础,复用原来的类的代码,同时扩充和复用原来的类的目的。原来的类叫做父类,继承父类的类叫做子类。
多态是值不同的对象都具有名称相同的行为,但是具体行为的实现方式却又所不同。比如说我们定义了比较两个数大小的函数,这个函数的参数既可以是整型,也可以是float,double或者字符串。
3.类的相关概念
面向对象设计的程序中,对象的属性叫做成员变量,对象的行为叫做成员函数。
类定义的一般格式如下:
class 类名{
访问范围限制符:
成员变量1;
成员变量2;
成员函数声明1
成员函数声明2
访问范围限制符:
成员变量3;
成员变量4;
成员函数声明3
成员函数声明4
...
}
1.描述类的属性
例如我们有个商品类,他的属性包括商品名称(name)、商品数量(count)、商品单价(price)、商品总价(total_price)等。类的定义如下:
class Product {
string productName;
int productCount;
double productPrice;
double productTotalPrice;
};
我们在定义类名的时候,必须要遵守相关的规范:字母、数字、下划线的组合,大小写敏感,不能以数字开头,不能使用系统关键字,类名不能重复。
这里注意的事,我们在定义类的时候,系统不会为类分配存储空间。
2.类的访问限制符
类有三种访问限制符,public(公共的)、private(私有的)、protected(受保护的)。
当类的成员变量是私有的,在类的外面是不能访问的。当类的成员变量是public,在类的外面是可以访问的。当类的成员变量是protected的时候,该类的成员变量只能被本类或者其子类访问。默认情况下,类的成员变量修饰符是private(私有的)。
例如在上面Product类的定义中,我们没有写访问限制符,那么Product类中的成员变量都是私有的。当然我们也可以手动加上私有的访问限制符private,两者效果相同。代码如下:
class Product {
private:
string productName;
int productCount;
double productPrice;
double productTotalPrice;
};
3.类的设置函数和获取函数
如果类的成员变量是私有的,当外部需要访问这个类的私有变量的时候,我们常在类的内部定义一对函数去访问私有变量,当这个类用来设置成员变量的值的时候,这个类被称作设置函数。当这个函数用来获取成员变量的值的时候,这个函数被称为获取函数。
以下面的代码为例,我们可以通过setProductName函数设置商品类的name属性,可以通过getProductName属性获取商品类的name属性。
class Product {
private:
string productName;
int productCount;
double productPrice;
double productTotalPrice;
public:
void setProductName(string productName){
this->productName = productName;
}
string getProductName(){
return this->productName;
}
};
3.类定义实例
例如我们定义个日期类IFLYDate,这个类中有year,month,day这几个属性。
同时我们定义了一些外部访问的一些方法。
class IFLYDate {
private:
int year,month,day;
public:
IFLYDate();
IFLYDate(int,int,int);
void setDate(int,int,int);
void getDate(IFLYDate);
IFLYDate getDate();
void setYear(int);
void setMonth(int);
void setDay(int);
int getYear();
int getMonth();
int getDay();
void printDate() const; //打印信息
};
在上述的代码中,::是类作用域运算符,后面的成员函数属于类名标识的这个类。具体类的实现格式如下:
返回值类型 类名::成员函数名(参数列表){
成员函数的函数体
}
在上面的例子中,我们可以用下面的代码实现在类中定义的函数。
IFLYDate::IFLYDate(){
year = 1970;
month = 1;
day = 1;
}
IFLYDate::IFLYDate(int y,int m,int d){
year = y;
month = m;
day = d;
}
void IFLYDate::setYear(int year){
year = year;
}
void IFLYDate::setMonth(int month){
month = month;
}
void IFLYDate::setDay(int day){
day = day;
}
int IFLYDate::getYear(){
return year;
}
int IFLYDate::getMonth(){
return month;
}
int IFLYDate::getDay(){
return day;
}
void IFLYDate::printDate()const{
cout<<year<<"/"<<month<<"/"<<day;
}
4.类的创建
类的访问方式有以下两种方式:
1.第一种类的访问方式
类名 对象名(参数);//第一种方式
类名 对象名(); //第二种方式
类名 对象名 = 类名(参数);//第三种方式
如果我们想访问上面定义的IFLYDate类,代码如下:
IFLYDate date;
IFLYDate(2024, 2, 21);
IFLYDate newDate = IFLYDate(2024, 2, 21);
2.指针的访问方式
类名 *对象指针名 = new 类名;//第一种方式
类名 *对象指针名 = new 类名();//第二种方式
类名 *对象指针名 = new 类名(参数);//第三种方式
如果我们想访问上面定义的IFLYDate类,代码如下:
IFLYDate * date = new IFLYDate;
IFLYDate * newDate = new IFLYDate();
IFLYDate * oneDate = new IFLYDate(2024, 2, 21);
这里需要注意的是,使用new创建的对象,必须用delete来撤销。
5.访问对象的成员
1.使用对象访问成员变量与调用成员函数
通过对象访问成员变量与调用成员函数的一般格式如下:
对象名.成员变量名
对象名.成员函数名(参数)
还以上面定义的MyDate类为例,我们可以通过夏敏的代码访问对象的成员和函数。
IFLYDate date = IFLYDate();
int year = date.getYear();
int month = date.getMonth();
int day = date.getDay();
cout<<"year:"<<year<<"\tmonth:"<<month<<"\tday:"<<day<<"\n";
date.printDate();
2.使用指针访问成员变量与调用成员函数
除了通过第一种方式访问对象的成员变量和调用成员函数之外,我们还可以通过指针的方式访问对象的成员变量和调用成员函数。使用指针的方式访问时,我们可以使用下面的代码,达到相同的效果。使用指针的是时候,我们使用”->“来实现。
IFLYDate * date = new IFLYDate();
int year = date->getYear();
int month = date->getMonth();
int day = date->getDay();
cout<<"year:"<<year<<"\tmonth:"<<month<<"\tday:"<<day<<"\n";
date->printDate();
3.使用引用访问成员变量和调用成员函数
我们还以在程序中直接定义引用并进行初始化。 1221231
IFLYDate date = IFLYDate();
IFLYDate &myDate = date;
int year = myDate.getYear();
int month = myDate.getMonth();
int day = myDate.getDay();
cout<<"year:"<<year<<"\tmonth:"<<month<<"\tday:"<<day<<"\n";
myDate.printDate();
二、总结
对象的两个特性:状态和行为。状态指的是对象本身的信息,也称为属性;行为是对对象的操作。C++中使用对象名、属性和操作三要素来描述对象。用数据表示对象的属性,用函数来实现操作。描述属性的数据称为成员变量,函数成为成员函数。对象=属性+成员函数。
面向对象的三个特征:继承、多态、封装。
对象的访问限制符:private、public、protected。