文章目录
前言
本文章主要学习c++类与对象的基本概念。根据视频学习
MOOC第八章内容
一、类的定义与使用
1、抽象(分析问题首先抽象成类)
抽象是为了对具体问题进行概括,提炼出这一类对象的公共性质并加以描述的过程:
抽象有数据抽象和行为抽象
数据抽象:描述某类对象的属性和状态
行为抽象:描述某类对象的行为或具有的功能
抽象由封装实现,在C++中,由类实现封装
2、类的定义与声明
类的定义:
class ClassName
{
数据成员;(表达数据抽象)
函数成员;(表达行为抽象)
}
3、类的访问控制符
类内:在类声明之内。
类外:在类声明之外。
为什么使用访问控制符:封装目的是使信息隐蔽,所以不是所有信息都对外可见。
访问控制符有:
public:
公有成员;(类与外部的接口,类内和类外函数都可以访问)
private:
私有成员;(只允许类内函数访问)
protect:
保护成员;(跟私有成员一样)
4、类的实现与使用
易错点:类对象属于类外,所以不可以访问私有数据成员和函数,只能访问公有成员。
类的实现:
class ClocK
{
private:
int Hour, Minute, Second;
public:
void SetTime(int h, int m, int s) {
Hour = h; Minute = m; Second = s;
}
void ShowTime(){
cout << "Current Time:" ;
cout << Hour << ":" << Minute << ":" << Second<<endl;
}
};
类的使用:
类是一种数据成员,类的变量称作类的实例,或对象
定义对象的方式:类名 对象名;
访问类成员的方法:
通过对象访问类成员:
- 对象名.公有成员函数名(参数列表)
- 对象名.公有数据成员
通过指针访问类成员:
- 对象的指针->公有成员函数名(参数列表)
- 对象的指针->公有数据成员
int main()
{
ClocK clock_1, clock_2;
clock_1.SetTime(9, 5, 25);
clock_2.SetTime(15, 25, 32);
clock_1.ShowTime();
clock_2.ShowTime();
return 0;
}
5、指针
- 对象指针
例如:Clock *p - this指针
c++为每个非静态成员函数提供了一个this指针
this指针指向正在被成员函数操作的那个对象 - 对象的引用
对象应用就是对某类对象定义的一个引用,实质是给被引用对象起一个别名
定义:对象名 & 对象引用名=被引用对象;
使用:对象引用名.数据成员名
或: 对象引用名.成员函数名(形参表)
ClocK C1(5, 14, 12);
Clock& Cr = C1;
Cr.ShowTime();
二、对象的初始化和结束处理
1、构造函数
解决数据成员自动初始化问题
例如:时钟类的构造函数
- 赋值语句方式
ClocK(int h, int m, int s) {
Hour = h; Minute = m; Second = s;
}
- 表达式方式
ClocK(int h, int m, int s):Hour(h),Minute(m),Second(s){}
重载构造函数与缺省构造函数
2、析构函数
专门用于处理对象销毁——析构函数
#include<iostream>
using namespace std;
class CString
{
private:
int len;
char* buf;
public:
CString(int n);
~CString();
void copy(char* src);
};
CString::CString(int n)
{
len = n;
buf = new char[n];
}
void CString::copy(char* src)
{
strcpy(buf, src);
}
CString::~CString()
{
delete []buf;
}
void func()
{
CString obj(64);
obj.copy("helloword");
}
int main()
{
func();
return 0;
}
该类中创建析构函数是为了清理类对象所指的字符空间。
3、拷贝构造函数
目的:构造一模一样的类对象
定义:将自己同类对象的引用作为参数进行构造函数的初始化时,该构造函数为拷贝构造函数。
特点:
- 是构造函数,系统会自动调用
- 将一个已经创建好的对象作为参数,根据需要将该对象中的数据成员逐一对应的赋值给新对象。
按例:
#include<iostream>
using namespace std;
class Point
{
private:
float x, y;
public:
Point(float a, float b)
{
x = a; y = b;
}
//拷贝构造函数的构建
Point(Point& obj)
{
x = obj.x;
y = obj.y;
}
void Print() { cout << x << endl; }
};
int main()
{
Point obj1(5, 15);//调用普通构造函数
Point obj2(obj1);//调用拷贝构造函数
Point obj3 = obj1;//调用拷贝构造函数
obj1.Print();
obj2.Print();
obj3.Print();
return 0;
}
三、类的相关概念
1、类类型做函数参数
类类型做函数参数的三种方式:
- 对象本身做函数参数:一般调用缺省的拷贝构造函数。(会有大量的类对象的定义,效率低)
- 对象的引用做函数参数:只有一次空间分配,效率高,推荐使用。
- 对象指针作为参数
2、对象数组
数组的初始化:调用构造函数进行初始化
3、静态成员
关键字:static
分类:
-
静态数据成员:在类内进行定义,在类外进行初始化
特点是属于类,不属于类对象,只有一个空间。在类外访问需使用类作用域符::。类对象不存在时,也可以访问。 -
静态成员函数:也属于类,没有this指针。
4、常对象与常成员
关键字:const
- 常对象:不能被修改且不能访问非常成员函数
- 常数据成员:只能通过初始化列表来获得初值,静态常成员函数只能在类外进行初始化
- 常成员函数:在形参列表后加const关键字,不能更改数据成员,可以被非常对象使用
5、友元
关键词:friend
- 友元函数:可以访问该类对象的私有成员,可以在类内任何地方声明,但不属于类,因此没有this指针
- 友元类:友元类可访问该类的所有成员
- 将成员函数声明为另一个类的友元:在函数类型后加上 类名:: ,前面使用friend关键字
- 性质:不具备传递性和对称性
6、类的组合
定义:一个类对象作为另一个类的成员,成员对象为子对象,用初始化列表方式初始子对象