1.思维导图
2. 整理类中特殊成员函数:构造函数,析构函数,拷贝构造函数,拷贝赋值函数的使用和实现
特殊成员函数的使用和实现:
① 构造函数
功能:当使用类实例化对象时,给类对象初始化空间以及初始化使用
格式:函数名与类同名
没有返回值
可以有参和无参(可以重载)
格式:类名(形参列表){函数体内容}
一般为公有权限
调用时机:使用类进行实例化对象时,系统自动调用,无需手动调用
栈区:实例化类对象时,自动调用构造函数
堆区:定义类指针时,不调用构造函数,在使用new申请空间时才调用构造函数
必须使用初始化列表的情况:
A. 当构造函数的形参名和成员变量名同名时,可以用初始化列表解决,在函数体内,用this指针解决冲突
B. 当有常成员变量时,对该变量的初始化工作,必须放在初始化列表中,不能放到函数体内
C. 当有引用成员变量时,对该成员初始化
D. 当类中有其他类的成员子对象时,对该成员的初始化,也必须在初始化列表中显性调用其构造函数完成
② 析构函数
功能;当对象消亡时,用于回收对象的内存空间以及善后工作的
格式:函数名:类名前加~
没有返回值
没有参数(没有重载,一个类中只能有一个析构函数)
访问权限:一般为公共权限
格式:~类名(){函数体内容}
调用时机:当对象消亡时,系统会自动调用,无需手动调用
栈区:当对象生命周期结束后,会自动调用,无需手动调用
堆区:如何使用delete释放对象空间,何时调用析构函数,先构造后析构
默认析构函数:
A. 当类中没有显性定义析构函数时,系统会默认提供一个析构函数,来完成对对象空间的释放
B. 如果类中显性定义了析构函数,则系统就不再提供默认的析构函数
C. 当类中没有指针成员时,对于类对象的析构,只需使用系统提供的析构函数即可,当类中有指针成员并指向堆区空间时,则需要显性定义析构函数,在析构函数的函数体内,完成对堆区空间的释放
D. 当有继承关系时,我们一般需要显性定义析构函数,并且要定义成虚析构函数
③ 拷贝构造函数
功能:使用一个类对象给另一个类对象进行初始化工作的
格式:函数名与类同名
无返回值
参数:同类的其他类对象的引用
权限:public
格式:类名(类名&other){}
调用时机:使用一个类对象给另一个类对象初始化时,系统自动调用
类对象作为函数参数传递时,也会自动调用拷贝构造函数
函数的返回值时类对象时,也会自动调用拷贝构造函数
深拷贝:
浅拷贝:
④ 拷贝赋值函数
功能:本质上是运算符重载,也叫等号运算符重载函数,完成一个类对象给另一个类对象赋值时系统自动调用的
格式:函数名:operator=
返回值:该左操作数自身的引用
参数:同类的其他类对象
权限:public
格式:类名&operator = (const 类名&other){函数体内容}
调用时机:当使用一个类对象给另一个类对象进项赋值时,系统自动调用
3.复习俩个运算符重载,理清参数和返回值在重载中的作用算 数运算符,赋值运算符
运算符重载参数:
a.运算符重载函数的参数由运算符本身决定
b.函数返回值可以由用户根据实际情况决定
运算符返回值类型:operator#(参数列表)
4.尝试实现条件函数的重载,成员函数的函数头:bool operator#(类名 &类对象)
#include <iostream>
using namespace std;
class Stu
{
string name;
int age;
int score;
public:
Stu()
{
cout << "Stu no parameters" << endl;
}
Stu(string name,int age,int score)
{
this->name = name;
this->age = age;
this->score = score;
cout << "Stu have parameters" << endl;
}
//destructor function
~Stu()
{
cout << "destructor function " <<endl;
}
//output object value
void show()
{
cout << "name:" << name <<endl;
cout << "age:" << age <<endl;
cout << "score:" << score <<endl;
}
//copy construction function
Stu(Stu &other):name(other.name),age(other.age),score(other.score)
{
cout <<"copy construction function" << endl;
}
//copy assignment function
Stu &operator = (const Stu &other)
{
this->name = other.name;
this->age = other.age;
this->score = other.score;
cout <<"copy assignment function" << endl;
}
//+operator overload
Stu &operator+(Stu &p1)
{
static Stu p3;
p3.name = this->name + p1.name;
p3.age = this->age + p1.age;
p3.score = this->score +p1.score;
cout << "this is operator overload +" << endl;
return p3;
}
friend Stu &operator +=(Stu &p1,Stu &p2);
//>operator function
bool operator >(Stu &p)
{
cout <<"this is > operator function"<< endl;
return (this->age>p.age);
}
};
//+=assignment operator overload
Stu &operator +=(Stu &p1,Stu &p2)
{
p1.name +=p2.name;
p1.age +=p2.age;
p1.score+=p2.score;
return p1;
}
int main()
{
Stu p1("lll",18,99);
Stu p2("sss",1,2);
p1.show();
p2.show();
cout << "~~~~~~one~~~~~~~~~~~~~" << endl;
Stu p3 = p1;
p3.show();
cout << "~~~~~~~~~tow~~~~~~~~~~" << endl;
Stu p4;
p4 = p1;
p4.show();
cout << "~~~~~~~~three~~~~~~~~~~~" << endl;
Stu p5 = p1+p2;
p5.show();
cout << "~~~~~~~four~~~~~~~~~~~~" << endl;
p2+=p1;
p2.show();
cout << "~~~~~~~~~~five~~~~~~~~~" << endl;
bool sum = p1 > p2;
cout << "bool:" << sum << endl;
return 0;
}
运行结果
Stu have parameters
Stu have parameters
name:lll
age:18
score:99
name:sss
age:1
score:2
~~~~~~one~~~~~~~~~~~~~
copy construction function
name:lll
age:18
score:99
~~~~~~~~~tow~~~~~~~~~~
Stu no parameters
copy assignment function
name:lll
age:18
score:99
~~~~~~~~three~~~~~~~~~~~
Stu no parameters
this is operator overload +
copy construction function
name:lllsss
age:19
score:101
~~~~~~~four~~~~~~~~~~~~
name:ssslll
age:19
score:101
~~~~~~~~~~five~~~~~~~~~
this is > operator function
bool:0
destructor function
destructor function
destructor function
destructor function
destructor function
destructor function