使用对象
类与对象的关系:类型与变量的关系
对象定义
直接在程序中定义某个类的对象,各种定义方式与行为与各种数据类型相似。
//存储类别 类名 对象列表; DoubleArray arr1, arr2; static DoubleArray array[10]; Rational *rp; rp = new Rational; delete rp; rp1 = new Rational[20]; delete [] rp1;
对象的使用
对象的使用是使用它的成员:公有成员可以被任何函数使用,私有成员只能被自己的成员函数使用。
成员的引用:
/* 对象名.数据成员名 对象指针->数据成员名 对象名.成员函数名(实际参数表) 对象指针->成员函数名(实际参数表) */ arr1.storage = 0; rp->num = 1; arr1.insert(5, 3.7); rp->add(r1, r2);
this指针
每个成员函数都有一个隐藏的指向本类型的指针形参this,指向控制对象
如对函数:
void create(int n, int d) { num = n; den = d;}
经过编译后,实际函数为:
void create(Rational *this, int n, int d) { this->num = n; this->den = d;}
通常,在写成员函数时可以省略this,编译时会自动加上它们。
如果在成员函数中要把对象作为整体来访问时,可以显式地使用this指针。
填空题
为以下的类实现一个add函数:
class SampleClass { int a; public: SampleClass add() { /* 此处是你需要填的内容 这个函数实现了将变量a增加1的功能 最后返回增加1前的对象(不要求地址相同) */ SampleClass temp=*this; a++; return temp; } }
对象的构造与析构
变量可以在定义时赋初值,对象能赋初值吗?怎么赋?
将赋初值的过程写成一个函数,让计算机在定义对象时执行该函数,这个函数称为构造函数
同理,有时在对象消亡前也有些工作要做,可将该过程写成一个函数,让计算机在对象消亡时执行该函数,这个函数称为析构函数
构造函数和析构函数是特殊的成员函数
构造函数
构造函数说明了定义对象时,如何为对象赋初值,由系统在定义对象时自动调用。构造函数的名字必须与类名相同
如果没有给类定义构造函数,编译系统会自动生成一个缺省的构造函数。它只为对象分配存储空间,空间中的内容为随机数。
构造函数可以有任意类型的参数,也可以不带参数,但不能具有返回类型。构造函数可以重载。
class SampleClass { public: SampleClass(/*...*/){/*...*/} }
不带参数的构造函数称为默认的构造函数,一般每个类应该有一个缺省的构造函数。
对象定义的一般形式:类名 对象名(实际参数表);
实际参数表必须与某个构造函数的形式参数表相对应,除非这个类有一个构造函数是没有参数的,那么可以用:类名 对象名;
析构函数
析构函数在销毁对象时,完成一些善后工作(如,归还分配给指针的空间),由编译系统自动调用
析构函数与构造函数名字相同,但它前面加一个波浪号(~),析构函数没有参数、返回值,也不能重载。
若定义类时没有定义析构函数,编译系统会自动生成一个缺省的空析构函数
class SampleClass { int value; int *pointer; public: SampleClass(int a,int b):value(a) { pointer=new int(b); } ~SampleClass() { delete pointer; } } 可以利用析构函数与构造函数来验证对象的生命周期 //为下面的类构建一个析构函数,其中指针`arrays`指向了一个数组。 #include <bits/stdc++.h> using namespace std; class SampleClass { private: const int key; string *value; int *arrays; public: SampleClass(int key_, string val_, int n) : key(key_) { value = new string(val_); arrays = new int[n]; } ~SampleClass() { delete value; delete [] arrays; } void print(){ printf("%d\n", key); cout << *value << endl; } }; int main(){ SampleClass a(321, "hello world", 5); a.print(); }