C++中第一种多态的实现形式:静态多态也叫编译时多态机制
C中定义函数功能类似时的方式:
函数重载机制:
根据同名函数的参数不同,调用与之对应的函数。
函数重载是发生在同一作用域的。
函数重载与他的函数中的参数列中的形参的类型,个数,顺序 是相关的,与他的返回值是没有关系的。
函数重载示例
#includeint add(int a, int b) { return a + b; } float add1(float a, float b) { return a + b; } double add2(double a, double b) { return a + b; } int main() { add1(); return 0; }
返回类型不同不发生重载
#include重载的注意事项:using namespace std; int add(int a,int b) { return a + b; } float add(float a, float b) { return a + b; } string add(string a, string b) { return a + b; } int main() { int a = 10; int b = 20; cout << add(a,b) << endl; float a1 = 3.14; float b1 = 5.21; cout << add(a1,b1) << endl; string a2 = "zhang"; string b2 = "san"; cout << add(a2,b2) << endl; return 0; }
1、引用作为重载条件
#includeusing namespace std; void fun(int &a){ cout<<"hello world"< cout<<"hello world"< fun(10);//走的是第二个函数,因为int&a=10;不合法 int b=10; fun(b);//走的是第一个函数 int &a=b合法 }
2、重载遇见默认参数
void fun(int a,int b=10){ cout<<"hello world"<cout<<"hello world"< 运算符重载 概念 对已有运算符重新定义,赋予另一种功能适应不同数据类型。
运算符重载函数的语法形式:实现运算符重载可以通过成员函数和全局函数实现
返回值 + operator + 要重载的运算符(形参列表) { //函数体功能一定要与运算符的功能相匹配 }C++的=号运算符重载及实现一个+运算符重载:#include自增运算符的重载:#include using namespace std; class Stu { private: string name; int age; public: //C++11新语法。 //Stu() = default; Stu(string name, int age) { this->name = name; this->age = age; cout << "Stu的构造" << endl; } ~Stu() { cout << "Stu的析构" << endl; } Stu(const Stu& other) { this->name = other.name; this->age = other.age; } //编译器自动提供的=号运算符重载函数。 //如果当类中有属性指针指向堆区时,改造深拷贝的过程 //我往期文章有介绍 // Stu& operator=(const Stu& other) // { // this->name = other.name; // this->age = other.age; // return *this; // } //成员函数实现重载 //实现一个两个对象相加的运算符重载。 int operator+(const Stu& other) { return this->age + other.age; } void showInfo() { cout << "姓名:" << this->name << ",年龄:" << this->age << endl; } }; //全局函数实现重载 Stu operator+(const Stu& o1,const Stu& o2){ Stu stu; stu.age=o1.age+o2.age; return stu; //本质是Stu stu=operator+(o1,o2); //简化为Stu stu=o1+o2; } int main() { Stu stu("zhangsan",20); Stu stu1("lisi",35); // stu1 = stu; // stu1.showInfo(); //以下两者的用法是一样的。 cout << stu + stu1 << endl; cout << stu.operator+(stu1) << endl; //本质Stu stu=stu.operator+(stu1); //简化Stu stu+=stu1; return 0; } #include重载左移运算符#include using namespace std; class My_Clock { private: int min; int sec; public: My_Clock(int m, int s) { this->min = m; this->sec = s; } //如果形参列表是没有任何类型 默认为前++ My_Clock& operator++() { sec++; if(sec == 60) { sec = 0; min++; min %= 60; } return *this; } //使用一个int来做为一个标识,编译器会默认为后++ //这种用类型仅做为标识使用的方式也叫哑元。 My_Clock& operator++(int) { return ++(*this); } void showTime() { cout << min << ":" << sec << endl; } }; int main() { My_Clock c(0,0); while (true) { c++; sleep(1); c.showTime(); } return 0; } 成员函数实现
void operator <<(cout)//p.operator<<(cout)简化为p<全局函数实现,operator << (cout,p)简化为cout<< p ostream& operator << (ostream& cout, const MyString& other) { cout << other.getM_data(); return cout ; }<<左移运算符和=赋值运算符都要出现追加操作,举个例子。int a =10; int b=10;
int c=20;a=b=c=30;cout < 所以我们在输出自定义数据类型时要以引用方式返回,不然值的方式返回调用的是拷贝构造。输出的是原来的复制品。而且为了提高代码运行效率我们一般用引用返回。#include#include using namespace std; class person { public: int age; string name; person(int age,string name){ this->age=age; this->name=name; } person personAdd(person &p){ this->age+=p.age; return *this; } } int main() { person p1(18,"张三"); person p2(20,"李四"); p1.personAdd(p2).personAdd(p2).personAdd(p2); cout<