C++数据结构算法
一、提出问题
1、什么是函数重载?
答:具有不同形参列表的同名函数称为函数重载,编译系统根据实参的类型来选择函数,这个过程称为重载解析。
2、什么是运算符重载?
答:在实际应用中,我们常常要扩展关系运算符对象的类型,比如比较两个结构体中某一变量的值,扩展的逻辑为:先将运算符看作是函数表达式,其函数名为operator加关系符<;通过运算符函数的定义实现运算符对象的类型扩展,称为运算符重载。
3、什么是浅、深复制?
答:结构对象通过赋值运算符只能完成浅层对象的复制(浅复制),深层对象的复制则称为深复制。
4、什么是指向const型的指针和const型的指针?
答:指针与两个对象有关:一个是它本身,用来存储一个对象的地址;另一个是它所指向的对象,地址就是这个对象的地址。如果指针指向的对象是不允许修改的(const型),那么就称为指向const型的指针,如果指针本身是const型的,则称为const型指针。const型指针在初始化完成后,就不能再指向别的对象。
6、字面量为什么不能是引用传递中的实参?为什么可以是const型引用传递中的实参?
答:引用实质上是指向被引用对象的指针,所以引用传递的实质是地址传递,字面量因为不能传址,所以不能是引用传递的实参,即不能是被引用的对象。假设函数是形参为抽象类型Type的值传递:
void PushBack(SeqList* l, Type item);
因为抽象类型Type可以实例化SeqList类型,所以要改为引用传递,以实现深复制。因为原来是值传递,而值传递不会改变实参的值,所以要改为引用const型的引用传递:
void PushBack(SeqList* l, const Type& item);
抽象类型Type还可以实例化为整型。因为原来是值传递,而值传递的实参可以是字面量,所以const型引用传递的实参可以是字面量。
7、什么是默认参数和默认函数?
答:默认参数是指函数声明中带有默认值的形参。调用函数可以省略相应的实参,编译器将用默认值代替。所有形参都是默认参数的函数称为默认函数。
二、相关代码片段实例
1、 运算符重载:
struct student
{
int id;
int score;
};
/*想要比较两个student的成绩大小*/
bool operator == (student x, student y)
{
return x.score == y.score;
}
bool operator >(student x, student y)
{
return x.score > y.score;
}
int main()
{
student s1 = { 2172, 90 };
student s2 = { 0007, 90 };
cout << (s1 == s2) << endl;
}
结果将返回一个布尔值,对于未重载的运算符,结果将出错;
int main()
{
student s1 = { 2172, 90 };
student s2 = { 0007, 90 };
bool a = s1.score == s2.score;
cout << a << endl;
}
其实比较结构体变量只需要 结构体.变量名 就可以了,不重载运算符也行。
2、函数重载
void pfun(int n)
{
cout << n << " use int pfun" << endl;
}
void pfun(char n)
{
cout << n <<" use char pfun"<< endl;
}
void pfun(string n)
{
cout << n <<" use string pfun" << endl;
}
int main()
{
pfun('1');
pfun(10);
pfun("hello world");
}