类与对象
定义:类是包含数据类型与函数的结构体,类中的变量别称为对象。
struct a{
string productNo;
double price;
unsigned unitsold; //数据成员声明
void print(){cout<<productNo<<":"<<price<<" "<<unitsold<<" "<<endl;
}; //结构体结束一定要用;
成员函数类外定义
C++中每个类定义都引入了一个类作用域,类内声明的数据成员和成员函数都具有类作用域。
成员函数在类外定义时函数名字前面加类名字和作用域符"::",表示这个函数是在其所属的类作用域内,是这个类的成员函数。
struct a{
string product;
double price=0.0;
unsigned unitsold=0;
double total();
};
//函数的类外定义
double a::total{
return price*unitsold;
}
访问控制与封装
如果不对类设置权限,那么任何人不仅可以调用成员函数,还可以访问数据成员,如果数据成员不小心被破坏,那么就会破坏程序,带来很多麻烦。
C++通过限定成员的访问权限来实现信息隐藏关键字有三种,分别是public,private,protected。
语法去下:
struct 类名
{
public:
公有数据;
privte:
私有成员;
protected:
被保护成员:
};
将数据和操作捆绑在一起,并加上访问控制,这在面向对象中称为封装。外部程序通过类接口中提供的操作访问对象中的数据,这称为向对象发送消息。面向对象编程的主要工作就是创建一组对象并给它们发送消息。C++引用class来定义类。默认为private。
如果有多个对象调用成员函数,为了容易知道是对哪个对象的数据进行操作,每个成员函数中都有一个隐含的参数称为this指针。X类的this指针的类型是X*。this指针常用于区分与局部变量重名的数据成员;返回当前对象;获取当前对象的地址。
类的数据成员一般限定为private,为了能够访问数据成员,又不破坏对象的封装性,可以将数据成员限定为private,并提供public函数对其访问,这种成员函数叫做访问器(get)和修改器(set)。
class a{
public:
double area();
//访问器和修改器
double getwinth(){return winth;}
void setwinth(double nwewinth){
if(newwid>0)
width=newwid;
}
构造函数与析构函数
构造函数是一种特殊的成员函数,能够在创建对象时被自动调用,负责对象的初始化。构造函数的名字和类名相同,它没有返回类型。注:一个类的构造函数至少有两个,一个是没有实参的构造函数,一个是有实参的构造函数。在进行初始化时,成员初始化的顺序与它们在类定义中出现的顺序一致,最好令构造函数初始化列表中的顺序与成员声明的顺序一致。
class X{
int a;
int b;
public:
X(int val):a(val),b(val){}
};
//下面的形式可能会产生未定义的行为
X(int val):b(val),a(val){}
如果一个类中定义多个构造函数时,可以定义委托构造函数,。委托构造函数有一个成员初始化列表和一个函数体。成员初始化列表只有唯一一项,即类名本身。类名后面跟园括号括起来的参数列表。
析构函数
C++中,由析构函数负责在对象产生存期结束时返回相关资源和自动释放资源。当对象离开作用域时,或者用delete释放在堆上创建的对象时,析构函数都会被自动调用。
析构函数的名字是类名字前加波浪线。析构函数没有返回类型,也没有任何参数。析构函数不能重载,只能为一个类定义唯一一个析构函数。
class A{
public:
//...
~A();
private:
...
};
//类外定义
A::~A(){
withdraw(getbalance());
delete p;
}
static 成员
static数据成员不是属于某个特定对象的,因而不能在构造函数中初始化。
static数据成员在类定义之外初始化。在定义时要使用类名字限定静态成员名,但不需要重复出现 static关键字。
static成员只能定义一次,所以定义一般不放在头文件中,而是放在包含成员函数定义的源文件中。