类是一种将抽象转换为用户定义类型的c++工具,它将数据表示和操纵数据的方法组合成一个简洁的包
c++是对具有相同属性和行为的一组对象的抽象与统一描述。是用户自定义的数据类型
格式:类的最后一定加“;”
各成员函数的实现;
class 类名
{
public:
公有数据成员和成员函数;
protected:
保护数据成员和成员函数; 类成员可以是数据类型,也可以是函数;
private:
私有数据成员和成员函数;
};
由于隐藏数据是opp主要目标之一,数据项通常放在私有部分,组成类接口的成员函数放在公有部分;
不必要在类声明中使用关键字privat,因为这是类对象的默认访问控制;
public与private之间唯一的区别是,结构的默认访问类型是public,而类为prite;
实现类成员函数:
返回值类型 类名::成员函数名(参数表)
{
函数体
}
访问类成员
对象成员的访问包括:
●圆点访问形式:对象名.公有成员
●指针访问形式
对象指针变量名->公有成员
参数个数相同 参数类型不同
定义成员函数时,使用作用域解析运算符(::)来标示函数所属的类;
类方法可以访问类的private组件;
例如:void stock::update(double price)
类方法的完整名称中包括类名。
其定义位于类声明中的函数都将自动成为内联函数;
类的构造函数和析构函数
为对象分配空间;对数据成员赋初值;请求其他资源
c++提供了一个特殊的成员函数--类构造函数,专门用于构造新对象,将值赋给他们的数据成员
构造函数没有返回值,实际上构造函数没有声明类型;
构造函数的参数标识的不是类成员,而是赋给类成员的值,因此,参数名不能与类成员相同;
当一个对象作用域结束时,系统自动调用析构函数
析构函数的作用是进行对象消亡时的清理工作
c++提供了两种使用构造函数来初始化对象的方式:
第一种方式:显示地调用析构函数 例如:stock food=stock(“world cabbage”,250,1.25);
第二种方式:隐式地调用析构函数 例如:stock garment(”furry mason“,50,2.5);
默认构造函数:
默认构造函数是在未提供显式初始值时,用来创建对象的构造函数。
格式:
格式:
funname(参数列表):初始化列表
{ 函数体,可以是空函数体 }
初始化列表的形式:
成员名1(形参名1),成员名2(形参名2),成员名n(形参名n)
对象生存期结束时,需要做清理工作,比如:释放成员(指针)所占有的存储空间
析构函数可以完成上述工作。
析构函数自动调用(隐式调用)
析构函数没有返回值,不能有参数,也不能重载
类名::~类名()
{
函数语句
}
定义格式如下(类外实现):
this 指针
一般来说,所有类方法都将this指针设置为调用它的对象的地址;
当参数与成员变量名相同时,如this->x = x,不能写成x = x。
复制构造函数:
复制构造函数用一个已有同类对象创建新对象进行数据初始化
C++为类提供默认版本的复制构造函数
程序员可以定义用户版本的复制构造函数
语法形式
类名::类名(const 类名 & 引用名 , …);
浅复制:
在用一个对象初始化另一个对象时,只复制了数据成员,而没有复制资源,使两个对象同时指向了同一资源的复制方式称为浅复制。
即:对于复杂类型的数据成员只复制了存储地址而没有复制存储内容
默认复制构造函数所进行的是简单数据复制,即浅复制
深复制:
通过一个对象初始化另一个对象时,不仅复制了数据成员,也复制了资源的复制方式称为深复制。
自定义复制构造函数所进行的复制是浅复制。
在类的尘缘函数后面加const关键字,则该成员函数成为常量成员函数
类型说明符函数名(参数表) const;
在数据成员前面加上const,成为常数据成员
静态成员函数
除静态数据成员以外,一个类还可以有静态成员函数。
静态函数仅可以访问静态成员,
或是静态成员函数或是静态数据成员。
静态成员函数和静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员。因此,对静态成员的引用不需要用对象名。
静态成员函数没有this指针,只能对静态数据操作
定义静态成员函数的格式如下:
static返回类型静态成员函数名(参数表);
与静态数据成员类似,调用公有静态成员函数的一般格式有如下几种:
类名::静态成员函数名(实参表)
对象. 静态成员函数名(实参表)
对象指针->静态成员函数名(实参表)
友元函数
构造函数 ( 形参表 ) : 对象成员1(形参表 ) , … , 对象成员n (形参表 ) ;
定义类#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
class student //类名称
{
string name;
int no;
int score[3]; //数据成员
float average;
int order;
public:
student(int id,string na,int x,int y,int z):name(na),no(id)
{
score[0]=x;
score[1]=y;
score[2]=z;
order=1,average=(score[0]+score[1]+score[2])/3;
}
student()
{
score[0]=score[1]=score[2]=0;
order=1,average=0;
}
int getNo(){return no;}
float getAverage(){return average;}
void setAverage(int avg){average=avg;} //成员函数
void setOrder(int x){order=x;}
int getOrder(){return order;}
string getName(){return name;}
void setName(string name){this->name=name;}
void display();
}; //必须加分号
小结:
指定类的设计的第一步是提供类声明。类声明李斯结构声明,可以包括数据成员和函数成员。声明有私有部分,在其中声明的成员只能通过成员函数进行访问;声明还具有公有部分,在其中声明的成员可被使用类对象的程序直接访问。通常,数据程岩被放在私有部分中,成员函数被放在公有部分中;
公有部分的内容构成了设计的抽象部分--公有接口,将数据封装到私有部分中可以保护数据的完整性,这杯称为数据隐藏。因此,c++通过类使得实现抽象,数据隐藏,和封装等opp特性很容易;
c++试图让用户定义的类型尽可能与标准类型类似,因此可以声明对象;
如果希望成员函数对多个对象进项操作,可以将额外的对象作为参数传递给它。如果方法需要显示地引用调用它的对象,则可以使用this指针。由于this指针被设置为调用对象的地址,因此*this是该对象的别名。