一、类的定义。
具有相同性质和功能的东西构成的集合称为类。类是抽象的,当属性赋给具体值,方法有具体内容时,才能成为对象,对象是类中可操作的具体化数据。
类定义的一般形式:
class<类名>
{
public:
公有段数据成员和成员函数;(类内类外均可见)
protected:
保护段数据成员和成员函数;(只在类内和该类的派生类中可见)
private:
私有段数据成员和成员函数;(只能在类内可见)
};
注意:结尾的分号一定要写。关键字struck也可以定义类,但不特别指出时,所有的成员都是公有的。当把私有段写在最前面时,private可以省略。
当成员函数在类外定义时,函数头形式为:返回类型类名::函数名(参数表)。简单的成员函数可以在类内定义,此时编译器当做内联函数处理。
成员函数有两个作用:一是操作数据成员,包括访问和修改数据成员;二是用于协同不同的对象操作,传递消息。成员函数通过参数与其他对象协同操作。类的成员函数可以调用类的成员函数。
类的数据成员除了基本类型外,还可以是数组,结构,类等自定义的数据类型。
二、访问对象成员。
使用对象包括访问对象的数据成员和调用成员函数。类中的成员函数可以使用自身不同性质的数据成员和调用成员函数。对象成员的访问形式与访问结构形式相同,运算符‘.’和‘->’用于访问对象成员。
例:用指针访问对象成员
#include<iostream>
using namespace std;
class Tclass
{public:
int x,y;
voidprint(){cout<<x<<","<<y<<endl;}
};
int add(Tclass*ptf){return (ptf->x+ptf->y);}
int main()
{
Tclass test,*pt=&test;//说明一个对象test和对象指针pt
pt->x=100;//用对象指针访问数据成员
pt->y=200;
pt->print();//用对象指针调用成员函数
test.print();
test.x=150;
test.y=450;
cout<<"x+y"<<add(&test)<<endl;//把对象地址传给指针参数
}
this指针:C++提供的隐含指针参数,当一个对象调用类的成员函数时,对象的地址被传给this指针。它是一个隐含指针,不能显式说明,但可以在成员函数中显式使用。上面的Tclass的成员函数print可以写成:
voidTclass::print(){cout<<this->x<<","<<this->y<<endl;};
this指针的显式使用主要在运算符重载、自引用等场合。它是一个常指针,一旦被初始化之后,获取了对象的地址,指针值就不能再被修改和赋值,以保证不会指向其他对象。
三、构造函数和析构函数
构造函数是用于创建对象的特殊成员函数。当创建对象时,系统自动调用构造函数。构造函数的作用是:为对象分配空间;对数据成员赋初值;请求其他资源。构造函数名与类名相同。构造函数可以有任意类型的参数,但不能有返回类型。
与其对应的是析构函数,析构函数没有参数,也没有返回类型。其作用是在程序结束时自动调用删除对象以释放对象所占用的空间。
它们的原型:类名::类名(参数表);
类名::~类名();
注意:构造函数和析构函数不应该被定义在私有部分。
带参数的构造函数可以在建立一个对象时,用指定的数据初始化对象的数据成员。
构造函数仅用于创建对象和数据的初始化,对象的构造次序和析构次序是相反的。如果对象是由new运算符动态创建的,delete运算会自动调用析构函数。由new运算符动态创建的对象如果不用delete释放,那么即使建立对象的函数执行结束,系统也不会调用析构函数,会导致内存泄漏。
重载构造函数是指一个类中具有多个构造函数,创建对象时会根据需要匹配其中的构造函数调用。例如:
class date
{
public:
date();
date(int);
date(int,int);
date(int,int,int);
~date();
……;
voidf()
{
date d;
date d1(2000);
date d2(2000,1);
dated3(2000,1,1);
}
复制构造函数
要求有一个类类型的引用参数:类名::类名(const类名&引用名,…);调用时机:当说明语句建立对象时,可以调用复制构造函数进行初始化,另外,当函数具有类类型传值参数或者函数返回类类型值时,都需要调用复制构造函数,完成局部对象的初始化的工作。
浅复制和深复制
浅复制:复制构造函数避免了不同对象共享内存的错误,这是深复制;对应于系统做的简单数据复制,为浅复制。
类的其他成员
常成员。在C++定义中,常成员用const约束,常数据成员是指数据成员在实例化被初始化后约束为只读;常成员函数是指成员函数的this指针被约束为指向常量的常指针,在函数体内不能修改数据成员的值。
常对象。即在定义对象的说明语句以const作前缀。这个对象的全部数据成员在作用域中约束为只读。
静态成员。当类成员冠以static声明时,称为静态成员。“静态”是指它的作用域局部于类。一个类可以创建多个对象,静态成员为此提供了一种同类对象的共享机制。
静态成员函数。当一个成员函数冠以static声明时,为静态成员函数。静态成员函数提供了一个不依赖于类数据结构的共同操作,它没有this指针。因为静态成员函数只能访问类的静态数据成员,所以设计静态成员函数与静态数据成员可协同操作。