链接:https://pan.baidu.com/s/1Am83Ut449WCbuTiodwJWgg?pwd=1688
提取码:1688
上午:类和对象
下午:类和对象高级应用
教学内容:
1、构造函数\析构函数\拷贝构造函数
构造函数:
每一个对象的创建都必须初始化,如果在没有写初始化函数(即构造函数),系统会默认写构造函数,但有些时候必须自己写构造函数。(比如,在定义初始化时候要申请空间或者牵涉指针)
构造函数的特点:
构造函数具有一些特殊的性质
? 构造函数的名字必须与类名相同
? 定义对象时被系统自动调用
? 可以有任意类型的参数,但不能有返回值
? 被定义为公有的,但其它时间无法被调用
例如:
//*****************************************
class Complex{
private:
double real;
double imag;
public:
Complex(double a=10, double b=10)//构造函数,与类同名,无返回值,同时可以缺省使用
{
real = a;
imag = b;
cout<<"In Constructor t!"<<endl;
}
...
};
//**************************
析构函数:
每一个对象在结束的时候,系统必须收回空间,收回空间由析构函数来完成,如果在类中没有析构函数,系统默认自己写析构函数。有些时候必须自己写析构函数(比如,在定义初始化时候要申请空间或者牵涉指针)
析构函数有以下一些特点:
? 析构函数与构造函数名字相同,但它前面必须加一个波浪号(~)
? 析构函数没有参数,也没有返回值,而且不能重载,因此在一个类中只能有一个析构函数
? 当撤消对象时,编译系统会自动地调用析构函数
例如:
//******************************************
class Complex{
private:
double real;
double imag;
public:
Complex(double r = 0.0,double i = 0.0) //构造函数,有缺省设置
{
cout<<"construction…"<<endl;
real = r;
imag = i;
}
~Complex() //析构函数,没有返回值,没有参数,前面加~,对象在接收时自动调用
{
cout<<"destruction…"<<endl;
}
...
}
//****************************
拷贝构造函数:
在程序中,如果对象赋值,在类中如果没有拷贝构造函数,编译器会自动编写拷贝构造函数,但是如果在有指针或有申请空间的类中,直接拷贝会出现,二个对象指向同一个空间的问题,可能会出现双释放空间,从而产生段错误。
自定义拷贝构造函数
classname(const classname &ob) //classname类名称
{
//拷贝构造函数的函数体
}
例如:
//********************************
class StringData
{
private: char *str;
publie:
StringData(char *s) //构造函数
{
str = new char[strlen(s)+1];
strcpy(str,s);
}
~StringData() //析构函数
{
delete str;
}
//…
};
int main()
{
StringData x(“abc”); //重新创建一个对象
StringData y(x); //StringData y = x;
//拷贝一个对象,所有东西都拷贝了,此时对象y的str指针指向x对象new的空间?