类与对象
1.类往往是从两方面来考虑的:一是特征(C++常称为属性)、另一个是功能(C++中常称为行为),而具备类中定义的属性和行为的对象都是该类的对象,如电动车是车类的对象。
2.定义一个类,C++中分别用数据成员和函数成员来表现对象的属性和行为。
3.定义一个类强调”信息隐藏“,将实现细节和不允许外部随意访问的部分屏蔽起来。因此,在类定义中,需要用public和private将类成员区分开。(还有PROTECT)外界是不能访问程序的PRIVATE成员,只能访问PUBLIC 数据成员,对象间的信息传送也只能通过PUBLIc成员函数,从而保证对象的数据安全。
类定义的基本形式:
C++中使用关键字classs定义一个类,基本形式如下:
Class类名
{
Pubic:
公共成员函数
Private:
私有成员函数
私有的数据定义
};定义类括号末尾的分号不可省略。
类定义实例
class computer
{
Private:
Char band[20];
float price;
public:
void print();
void SetBrand(char*sz);
viod SetPrice(float pr);
};
代码解析:代码第一行定义的computer类,根据隐藏信息原则,数据成员一般不能由外部访问,只能通过PUBLIC成员函数访问,因此,把成员brand(字符串)和Price(浮点型)定义为private成员,而把print()\setbrand()\setprice()函数定义为Public成,员,这样,用户便可以调用print()函数输出brand 和price信息,调用SetBrand()函数和setprice函数修改brand和price的值。
注意;不可在类定义时对数据成员初始化。如:float price=0;将出现编译错误。
另外,不加声明的成员默认是private的。
Class和struct的唯一区别在于:struct的默认访问方式是public,而class为private.
C++类的实现
类的实现就是定义其成员函数的过程。类的实现有两种方式:一种是在类定义的同时完成成员函数的定义,另一种是在类定义的外部定义其成员函数。
在类定义时定义成员函数实例:
#includeostream>
#include<cstring>
using namespace std;
class computer
{
Private:
Char band[20];
float price;
public:
void print();
{
Cout<<”品牌”<<brand<<endl;
Cout<<”价格”<<price<<endl;
}
void SetBrand(char*sz);
{
Strcpy(brand,sz);//字符串复制
viod SetPrice(float pr);
};
viod SetPrice(float pr)
{
Price=pr;;
};
};
Int main()
{
Computer com1;
Com1.SetPrice(5000);
Com1.SetBrand(“Lenovo”);
Com1.print();
Return 0;
}
输出结果如下所示:
品牌:Lenovo
价格:5000
在类定义的外部定义成员函数
形式:
返回类型类名::成员函数名(参数列表)
{
函数体
}
其中,返回类型、成员函数名和参数列表必须与类定义时的函数原型一致,这样,代码可改写为:
Class computer
{
Private:
Char brand[20];
Float price;
Public:
Void print();
Void SetBrand(char*sz);
Void SetPrice(floatpr);
};
#include<iostream>
#inlcude<cstring>
Using namespace std;
Void computer::print()
{
Cout<<”品牌”<<brand<<endl;
Cout<<”价格”<<price<<endl;
}
Void computer::SetBrand(char*sz)
{
Strcpy(brand,sz);
}
Void computer::SerPrice(floatpr)
{
price=pr;
}
Int main()
{
Computer com1;
Com1.SetBrand(“Lenovo”);
Com.1SetPrice(8000);
Com1.print();
Return 0;
}
输出结果如下所示:
品牌:Lenovo
价格:8000
对象的创建与撤销:
通过自定义的公共成员函数SetBrand和SetPrice实现对对象函数。数据成员的初始化。实际上,C++为类提供了两种特殊的成员函数,一是构造函数,在对象创建时自动调用,用以完成对象变量等的初始化及其他操作(如为指针成员动态申请内存空间等);另一个是析构函数,在对象撤销时自动调用,用以执行一些清理任务,如释放成员函数中动态申请的内存等。
构造函数的作用:
当创建对象时,自动调用构造函数。构造的作用有:
1. 给对象一个标识符。
2. 为对象数据成员开辟内存空间。
3. 完成对象数据成员的初始化(函数体内的工作,由程序员完成)。
上述3点也说明了构造函数的执行顺序,在执行函数体之前,构造函数已经为对象的数据成员开辟了内存空间,这时,在函数体内对数据成员的初始化便顺理成章了。
如果用户没有显示地定义构造函数,编译器将为类生成“默认构造函数”,默认构造函数不能完成对象数据成员的初始化,只有给对象标识符,同时为对象数据成员开辟内存空间,上述代码中采用的是默认构造函数,所以,需要另外定义成员函数以改写数据成员brand和price 。默认的构造函数是无参的。
作为一种成员函数,构造函数是在类定义的同时进行定义还是在类定义的外部进行定义都可以。
编译器自动生成的默认构造函数是无参的,实际上,构造函数可以接受参数。
有参构造函数代码示例:
#include<iosdream>
Using namespace std;
Class point//point 类定义,在定义同时实现其成员函数
{
Private://私有成员,分析该代表x轴和y轴坐标
Int xPos;
Int yPos;
Public:
Point(int x,int y)//有参构造函数
{
Cout<<”对象创建时构造函数被自动调用”<<endl;
xPos=x;
yPos=y;
}
Void print()/输出信息
{
Cout<<”xPos:”<<xPos<<”,yPos<<”,yPos:”<<yPos<<endl;
}
};
#inlcude”point.h”
Int main()
{
Point pt1(3,4);//调用有参构造函数声明point类变量(类变量)pt1
Pt1.print();
Return 0;
}
输出结果如下:
对象创建时构造函数自动被调用
xPos:3,yPos:4
代码解析:代码显示定义了构造函数“point(int x,int y)”,这样,编译器便不会自动生成默认构造函数,这时,必须使用如”point pt1(3,4);”创建point类的对象pt1,并对其中的数据成员xPos和yPos进行初始化,如果还用point pt1的形式,编译器会报错。
重载构造函数
构造函数与普通函数一样,允许重载。创建一个Date类,如果Date类具有多个构造函数,创建对象时,将根据参数匹配调用其中一个。如:
Class Date
{public:
Date();
Date(int);
Date(int,int);
Date(int,int,int);
~Date();
};
Void f()
{
Date d;//调用Date();
Date d1(2000);//调用 Date(int);
Date d1(2000,1);// 调用 Date(int,int);
Date d1(2000,1,1);// 调用 Date(int,int,int);
{
初始化表达式
除了在构造函数体内初始化数据成员外,还可以通过成员初始化表达式来完成。成员初始化表达式可用于初始化类的任意数据成员(除了static)。
Point(int x,int y)
{
Cout<<”有参构造函数的调用:<<endl;
xPos=x;
yPos=y;
}
等价于
Point(int x,inty):xPos(x),yPos(y)
{
Cout<<”有参构造函数的调用”<<endl;
}
每个成员在成员初始化表中只能出现一次,初始化的顺序不是由名字在初始化表中的顺序来决定的,而是有成员在类中被声明的顺序决定的。
析构函数
析构函数在撤销对象时被自动调用,特点是:
1. 与类同名,之前加波浪号,以区别于构造函数。
2. 析构函数没有返回类型,也不能指定参数,因此,析构函数只能有一个,不能被重载。
3. 对象超出其作用域被销毁时,析构函数会被自动调用。与构造函数不同的是,程序员可根据需要显示调用析构函数,以撤销对象,释放对象所占据的内存空间。