zoukankan      html  css  js  c++  java
  • 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操作,这里就不演示了.


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

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


  • 相关阅读:
    快速幂模板
    洛谷题解 P1596 [USACO10OCT]Lake Counting S
    洛谷题解 P1460 [USACO2.1]健康的荷斯坦奶牛 Healthy Holsteins
    洛谷题解 P1305 新二叉树
    洛谷题解 P1075 质因数分解
    洛谷题解 P1331 海战
    洛谷题解 P1506 拯救oibh总部
    【洛谷P4831】Scarlet loves WenHuaKe
    【洛谷P6499】Burza
    【CF757F】Team Rocket Rises Again
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5405069.html
Copyright © 2011-2022 走看看