该博文仅用于交流学习。请慎用于不论什么商业用途,本博主保留对该博文的一切权利。


博主博客:javascript:void(0)

转载请注明出处:

在一个类内,最常见的就是构造函数的重载了.这里我就不介绍了.

先来看看常见的类内重载.

 

//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;

};

执行结果:

 

C++学习笔记23,类内函数重载_#include

这个跟类外的函数重载差点儿没有差别,仅仅是这一次须要对象来调用方法而已.

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;
	}

};
这个在编译的时候不会报错:可是在编译关联文件的时候却会导致歧义.

 

C++学习笔记23,类内函数重载_#include_02

 

//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;

};

C++学习笔记23,类内函数重载_ios_03

 

可能这个是为了留给用户很多其它选择的余地吧.

同一时候要记住是能够通过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)之前,执行结果为:

 

C++学习笔记23,类内函数重载_显式_04

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

 

C++学习笔记23,类内函数重载_调用方法_05

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

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