C++学习笔记23,类内函数重载
该博文仅用于交流学习。请慎用于不论什么商业用途,本博主保留对该博文的一切权利。
博主博客:http://blog.csdn.net/qq844352155
转载请注明出处:
在一个类内,最常见的就是构造函数的重载了.这里我就不介绍了.
先来看看常见的类内重载.
//method.cpp #include <iostream> #include <string> using namespace std; class base{ private: int i; string s; public: base(int ii,string ss):i(ii),s(ss){ } virtual ~base(){ } void add(int ii){ cout<<i<<"+"<<ii<<"="<<i+ii<<endl; } void add(string ss){ cout<<s<<"+"<<ss<<"="<<s+ss<<endl; } };
//main.cpp #include "method.cpp" int main(){ base b(10,"me"); b.add(25); b.add("name is jack!"); return 0; };
执行结果:
这个跟类外的函数重载差点儿没有差别,仅仅是这一次须要对象来调用方法而已.
GCC还有个奇怪的行为,
//method.cpp #include <iostream> #include <string> using namespace std; class base{ private: int i; string s; public: base(int ii,string ss):i(ii),s(ss){ } virtual ~base(){ } void add(int ii){ cout<<i<<"+"<<ii<<"="<<i+ii<<endl; } void add(string ss){ cout<<s<<"+"<<ss<<"="<<s+ss<<endl; } void add(string &ss){ cout<<" This is a &string"<<s<<" "<<ss<<endl; } };这个在编译的时候不会报错:可是在编译关联文件的时候却会导致歧义.
//main.cpp #include "method.cpp" int main(){ base b(10,"me"); b.add(25); b.add("name is jack!"); string s="wife is LJ"; b.add(s); return 0; };
可能这个是为了留给用户很多其它选择的余地吧.
同一时候要记住是能够通过const重载的,即參数是const和非const也算是不同的參数.
在C++11里面,能够显式删除某个重载方法.比如:
//method.cpp #include <iostream> #include <string> using namespace std; class base{ private: int i; string s; protected: int getI()const{return i;}; string getS()const{return s;}; public: base(int ii,string ss):i(ii),s(ss){ } virtual ~base(){ } void add(int ii){ cout<<i<<"+"<<ii<<"="<<i+ii<<endl; } void add(string ss){ cout<<s<<"+"<<ss<<"="<<s+ss<<endl; } //void add(char c)=delete };
//main.cpp #include "method.cpp" int main(){ base d(15,"you"); d.add(5); d.add("are fine!"); char ch='a'; d.add(ch); return 0; };
没有显式地删除add(char c)之前,执行结果为:
能够看到char被转换为了int类型,这也许不是我们想要的.
因此我们能够手动删除这个重载方法.
#include <iostream> #include <string> using namespace std; class base{ private: int i; string s; protected: int getI()const{return i;}; string getS()const{return s;}; public: base(int ii,string ss):i(ii),s(ss){ } virtual ~base(){ } void add(int ii){ cout<<i<<"+"<<ii<<"="<<i+ii<<endl; } void add(string ss){ cout<<s<<"+"<<ss<<"="<<s+ss<<endl; } void add(char c)=delete };
这样,编译的时候就会报错了.类外的函数重载相同支持delete操作,这里就不演示了.
这个就是类里面的函数重载了.
须要注意的是继承的时候继承类中的重载有比較大的差别.请看下一篇博文.