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


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

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


  • 相关阅读:
    @Autowired 注解是如何实现的?
    工作 3 年的同事不懂 isEmpty 和 isBlank 的区别,我真是醉了。。
    4 个单词,谷歌返回 16 个 SQL 注入漏洞...
    MySQL 更新不成功,事务问题搞清楚了吗?
    Python Web应用如何部署?
    mapbox加载postgis矢量切片
    tile2lon:地图瓦片编号与经纬度的换算关系
    shp2pgsql:将shapefile导入postgis数据库
    postgreSQL表添加ID自增列
    postgreSQL连接配置
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5405069.html
Copyright © 2011-2022 走看看