1.函数重载
所谓的函数重载其实指的就是函数名字一样,但是参数列表不同的函数。一般来说函数重载都会出现在类的构造函数里面,根据调用函数时输入的参数的类型,数目,不同调用最符合需求的函数。STL中的string类,vector类,就重载了多个构造函数,方便实现对类实例化的对象进行最合适的初始化。
参数列表:
void test01(int a,int b,int c) { } // (int a,int b,int c) 这个就是参数列表
构造函数:当你用class写一个类的时候,就会默认生成一个构造函数和一个析构函数,构造函数就是当你用实例化一个对象的时候,用来类的属性赋初值,初始化类的一个作用。只要你实例化了一个类,就一定会调用构造函数,不管是默认构造函数,还是自己写的有参构造函数,但只会调用一个,会根据参数列表选择一个最合适的调用。
class Person{
public:
Person(){} //系统默认给的空实现的构造函数,一般没啥用,也不会给显示出来,
//下面是得自己写的构造函数,叫有参构造,主要是方便给属性赋初值,初始化类
//名字一样,参数列表不一样,这就叫函数重载。
Person(string name,int age)
{
this->m_Name=name;
this->m_Age=age;
}
//成员函数:就是写在类里面的函数,可以用实例化的对像通过 p1.Print() 来调用它。
void Print()
{
cout<<"666"<<endl;
}
//属性
string m_Name;
int m_Age;
}
int main()
{
Person p1; //实例化一个Person类的对象p1,此时参数列表为空,会调用默认构造函数
Person p2("小明",12); //参数列表不为空,会调用类中自己写的有参构造函数,
}
函数重载的前提条件是参数列不同(类型,参数数量不一样)不然就会报错。调用的时候,会根据你传入的参数来选择最合适的那个函数调用,对应不同的函数功能。
2.运算符重载
一般用于同一个类创建的不同的两个对象之间,比如想用“ = ”这个符号 来实现两个实例化对象之间的赋值操作,直接用是不行的,但是在类里面重载一下“ = ” 就可以,再比如想用==来判断两个实例化对像的属性是否相等,也要重载==运算符才可以实现,重载运算符实质上就是一个名字为运算符号的一种特殊的成员函数。并且di'o'adioa用的方式就跟正常使用运算符一样,但一般是用于一个类实例化的两个不同的对象之间。
class Person{
public:
//下面是得自己写的构造函数,叫有参构造,主要是方便给属性赋初值,初始化类
//名字一样,参数列表不一样,这就叫函数重载。
Person(string name,int age)
{
this->m_Name=name;
this->m_Age=age;
}
Person operator=(Person &p) //引用的方式调用
{
this->m_Name=p.m_Name;
this->m_Age=p.m_Age;
return *this; //this 是一个指向对象本身的指针,只能在类内使用,
//*this 就相等于是调用这个=的对象,也就是=左边的;
//返回一个Person类对象,方便实现连等操作;
}
//属性
string m_Name;
int m_Age;
}
int main()
{
Person p1("xaioming",11);
Person p2;
p2=p1; //进行赋值操作,p2的属性的值现在就跟p1一样,如果没有重载=,那这样搞会出错误
}
理论上来说,你可以把加号重载成减号的作用,但不建议,一是这样会搞混,二是一般来说轮不到咱来重载运算符,一些标准的容器里,比如string类,里面就有重载的运算符,方便对字符串进行一些特定的操作。string类里面就重载了 [ ] ,方便你获取一个字符串的任意的字符,并可以对其进行修改。也重载了 += ,可以让你在原有的字符串后面再加上一些字符
运算符重载一般只有对类的对像进行操作的时候才会需要重载,因此它相当于是一个特殊的成员函数,需要一个实例化的对象调用,并且不用通过 “ . ”的方式调用,可以当成是正常的运算符一样来使用。
了解了函数重载和运算符重载将会方便后面学习类和STL的相关知识,是一些比较基础的知识点,属于是常识性的知识。
上述内容是本人闲着没事整理的一些琐碎的知识点和个人一些粗浅的想法,不太严谨,仅供参考。