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


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

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


posted @ 2016-04-18 16:56  zfyouxi  阅读(197)  评论(0编辑  收藏  举报