首页 > 代码库 > C++学习笔记23,类内函数重载

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操作,这里就不演示了.


这个就是类里面的函数重载了.

需要注意的是继承的时候继承类中的重载有比较大的区别.请看下一篇博文.