1.什么是面向对象编程?
面向对象编程是一种编程方法,专注于将数据和函数建模为对象。 相比之下,程序性规划重点关注程序执行,逐条语句。 在某种程度上,面向对象的编程更抽象,而过程编程更接近原始机器指令
2.为什么要学习面向对象的编程?
面向对象的编程对现代计算至关重要。 面向对象编程不仅仅专注于完成任务,还允许您构建反映“现实世界”的模型和关系。
1.应用程序开发:面向对象编程是今天大多数应用程序是如何。 它是必不可少的游戏编程和做你可能在手机或平板电脑上使用的那种应用程序。
- 2.向下设计:面向对象的编程是一种以高效和直观的方式设计程序的好方法。 对象给你一个高层次的概念开始,所以你可以先设计和代码。
3.代码重用性:面向对象的编程也是封装数据和保持组件在功能上彼此分离的好方法。 如果为一个程序创建链接列表类,那么只要链接列表类是自包含的,就可以轻松地在另一个程序中重用此代码,这意味着它不依赖外部代码来完成它的工作。
3.类
类的定义:⑴类是对具有相同属性和行为的一组对象的抽象与统一描述。是用户自定义的数据类型。
⑵类的定义包括行为和属性两个部分。
⑶属性以数据表示,行为通过函数实现。
格式:class 类名
{
public:公有数据成员和成员函数;
private: 私有数据成员和成员函数;
protected:保护数据成员和成员函数;
};//类的定于必须以分号结束!
使用类时的注意事项:
⑴类的成员可以是其他类的对象,但不能以类自身的对象作为本类的成员,而类自身的指针和引用可以作为类的成员。
⑵类定义必须以分号“;”结束。
⑶类与结构体的区别:没有明确指定类成员的访问权限时,C++结构体的成员是公有的,而类的成员是私有的。
⑷c++类定义的格式:(数据成员私有化,成员函数公有化)
访问控制:
类的访问属性有:Public、Protected、Private
各种访问方式的功能如下:
访问控制 含义 属性
public 公有成员 类的外部接口
protected 保护成员 仅允许本类成员函数及派生类成员函数访问
private 私有成员 仅允许本类成员函数访问
成员函数:
类的成员函数是实现类的行为属性的成员。
一般将成员函数声明为函数原型,在类外具体实现成员函数。
成员函数的定语:
返回值类型 类名::成员函数名(参数表) //::作用域区分符,用于标识属于什么类的成员。
{
函数体
}
对象:
对象是类的实例或实体。
类与对象的关系,如同C++基本数据类型和该类型的变量之间的关系。
对象的定义格式如下:
类名 对象名1,对象名2,…,对象名n;
定义对象应注意:必须在定义了类之后,才可以定义类的对象。
例:
class Point
{
public:
void InitPoint(float PointA_x, float PointA_y);
void Move(float New_x, float New_y);
float GetPointx();
float GetPointy();
private:
float P1_x,P1_y;
};
int main()
{
Point p1,p2;
}
4.构造函数
定义:构造函数是用于创建对象的特殊成员函数。当创建对象时,系统自动调用构造函数。
作用:为对象分配空间;对数据成员赋初值;请求其他资源。
没有用户定义的构造函数时,系统提供缺省版本的构造函数
构造函数名与类名相同:类名
构造函数可以重载
构造函数可以有任意类型的参数,但没有返回类型
默认构造函数形式:类名::类名(){} //为一个空函数
#include <iostream.h>
class Date {
public:
Date(); // 无参构造函数
Date(int y,int m,int d);
void showDate();
private:
nt year, month, day;
};
Date::Date() // 构造函数的实现
{
year=0; month=0; day=0;
}
Date::Date(int y,int m,int d)
{
year=y; month=m; day=d;
}
inline void Date::showDate()
{
cout<<year<<"."<<month<<"."<<day<<endl;
}
构造函数创建对象的两种方法:
⑴利用构造函数直接创建对象.其一般形式为:
类名 对象名[(实参表)];
这里的“类名”与构造函数名相同,“实参表”是为构造函数提供的实际参数。
int main()
{
Date *date1;
date1=new Date(1998,4,28); //以上两条语句可合写成:Date *date1=new Date(1998,4,28);
cout<<"Date1 output1:"<<endl;
date1->showDate();
delete date1;
return 0;
}
构造函数初始化成员有两种方法:
⑴使用构造函数的函数体进行初始化
⑵使用构造函数的初始化列表进行初始化
格式:
funname(参数列表):初始化列表
{ 函数体,可以是空函数体 }
初始化列表的形式:
成员名1(形参名1),成员名2(形参名2),成员名n(形参名n)
例:⑴使用构造函数的函数体进行初始化
class Date
{
int d, m, y;
public:
Date(int dd, int mm, int yy)
{
d=dd;
m=mm;
y=yy;
}
Date(int dd, int mm)
{
d=dd;
m=mm;
}
}
例:⑵使用构造函数的初始化列表进行初始化
class Date
{
int d, m, y;
public:
Date(int dd, int mm, int yy):d(dd),m(mm),y(yy)
{ }
Date(int dd, int mm): d(dd),m(mm)
{ }
}
注意:
必须使用参数初始化列表对数据成员进行初始化的几种情况:
1.数据成员为常量
2.数据成员为引用类型
3.数据成员为没有无参构造函数的类的对象
复制构造函数
定义:复制构造函数用一个已有同类对象创建新对象进行数据初始化。
提示:C++为类提供默认版本的复制构造函数,程序员可以定义用户版本的复制构造函数。
语法形式:类名 :: 类名(const 类名 & 引用名 , …);
特点:
⑴复制构造函数名与类名相同,并且也没有返回值类型。
⑵复制构造函数可写在类中,也可以写在类外。
⑶复制构造函数要求有一个类类型的引用参数。
⑷如果没有显式定义复制构造函数,系统自动生成一个默认形式的复制构造函数。
编译系统自动调用的三种情况:
⑴声明语句中用类的一个已知对象初始化该类的另一个对象时。
⑵当对象作为一个函数实参传递给函数的形参时,需要将实参对象去初始化形参对象时,需要调用复制构造函数。
⑶当对象是函数的返回值时,由于需要生成一个临时对象作为函数返回结果,系统需要将临时对象的值初始化另一个对象,需要调用复制构造函数。
浅复制:
在用一个对象初始化另一个对象时,只复制了数据成员,而没有复制资源,使两个对象同时指向了同一资源的复制方式称为浅复制。
即:对于复杂类型的数据成员只复制了存储地址而没有复制存储内容
默认复制构造函数所进行的是简单数据复制,即浅复制
深复制:
通过一个对象初始化另一个对象时,不仅复制了数据成员,也复制了资源的复制方式称为深复制。
自定义复制构造函数所进行的复制是浅复制。
析构函数
定义:析构函数是用于取消对象的成员函数。当一个对象作用域结束时,系统自动调用析构函数
作用:析构函数的作用是进行对象消亡时的清理工作 比如:释放成员(指针)所占有的存储空间,析构函数可以完成上述工作。
没有用户定义析构函数时,系统提供缺省版本的析构函数
析构函数名为: ~ 类名
析构函数没有返回值,不能有参数,也不能重载
定义格式:
类名::~类名()
{
函数语句
}
特点:
⑴析构函数与构造函数名字相同,但它前面必须加一个波浪号(~);
⑵析构函数没有参数,也没有返回值,而且不能重载。因此在一个类中只能有一个析构函数;
⑶当撤消对象时,编译系统会自动地调用析构函数。
注:若没有显式定义析构函数,则系统自动生成一个默认形式的析构函数。
系统自动生成的默认构造函数形式如下:
类名::~类名(){}
一般情况下,可以不定义析构函数,但如果类的数据成员中包含指针变量是从堆上进行存储空间分配的话,需要在析构函数中进行存储空间的回收。