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

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

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

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

时间: 2024-10-22 05:50:56

C++学习笔记23,类内函数重载的相关文章

C++ Primer 学习笔记_15_类与数据抽象(1)_类的定义和声明

C++ Primer 学习笔记_15_类与数据抽象(1)_类的定义和声明 在C++中,用类来定义自己的抽象数据类型.通过定义类型来对应所要解决的问题中的各种概念,可以使我们更容易编写.调试和修改程序.可以使得自己定义的数据类型用起来与内置类型一样容易和直观. 看一下Sales_item类: class Sales_item { private: std::string isbn; unsigned units_sold; double revenue; public: double ave_pr

python基础教程_学习笔记23:图形用户界面

图形用户界面 丰富的平台 在编写Python GUI程序前,需要决定使用哪个GUI平台. 简单来说,平台是图形组件的一个特定集合,可以通过叫做GUI工具包的给定Python模块进行访问. 工具包 描述 Tkinter 使用Tk平台.很容易得到.半标准. wxpython 基于wxWindows.跨平台越来越流行. PythonWin 只能在Windows上使用.使用了本机的Windows GUI功能. JavaSwing 只能用于Jython.使用本机的Java GUI. PyGTK 使用GTK

Java学习笔记_25_Collections类

25.Collections类: Collections类是一个工具类,用来对集合进行操作,它主要是提供一些排序算法,包括随机排序.反相排序等. Collections类提供了一些静态方法,实现了基于List容器的一些常用算法. Collections的一些方法列表: · void sort(List): 对List内的元素进行排序. · void shuffle(List): 对List内的元素随机排序. · void reverse(List): 对List内的元素进行逆序排列. · voi

C++ Primer 学习笔记_53_类与数据抽象 --友元、static成员

类 --友元.static成员 一.友元 友元机制允许一个类将对其非公有成员的访问权授予指定的函数或类(对未被授权的函数或类,则阻止其访问):友元的声明以关键字friend开始,但是它只能出现在类定义的内部.友元声明可以出现在类中的任何地方:友元不是授予友元关系的那个类的成员,所以它们不受其声明出现部分的访问控制影响. [最佳实践] 通常,将友元声明成组的放在类定义的开始或结尾是个好主意! 1.友元关系:一个例子 假设一个窗口管理类Window_Mgr可能需要访问由其管理的Screen对象的内部

C++ Primer 学习笔记_54_类与数据抽象 --复制构造函数、赋值操作符

复制控制 --复制构造函数.赋值操作符 引言: 当定义一个新类型时,需要显式或隐式地指定复制.赋值和撤销该类型的对象时会发生什么– 复制构造函数.赋值操作符和析构函数的作用!      复制构造函数:具有单个形参,该形参(常用const修饰)是对该类类型的引用.当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式的使用复制构造函数:当将该类型的对象传递给函数或者从函数返回该类型的对象时,将隐式使用复制构造函数.     析构函数:作为构造函数的互补,当对象超出作用域或动态分配的对象被删除

Swift学习笔记:类和结构

一.类和结构的异同 类和结构有一些相似的地方,它们都可以: 1. 定义一些可以赋值的属性: 2. 定义具有功能性的方法 3. 定义下标,使用下标语法 4. 定义初始化方法来设置初始状态 5. 在原实现方法上的可扩展性 根据协议提供某一特定类别的基本功能 1. 类还有一些结构不具备的特性: 2. 类的继承性 3. 对类实例实时的类型转换 4. 析构一个类的实例使之释放空间 5. 引用计数,一个类实例可以有多个引用 1. 定义语法 struct Name{ let firstName = "&quo

初探swift语言的学习笔记四(类对象,函数)

作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/29606137 转载请注明出处 假设认为文章对你有所帮助,请通过留言或关注微信公众帐号fengsh998来支持我,谢谢! swift扩展了非常多功能和属性,有些也比較奇P.仅仅有慢慢学习,通过经验慢慢总结了. 以下将初步学习一下类的写法. 码工,最大爱好就是看码,而不是文字,太枯燥. // // computer.swift // swiftDemo // // C

Java学习笔记_19_String类

19.String类: 1>String类的构造方法: · 利用字符串构造一个字符串对象: String str = "HelloWorld": · 无参构造一个字符串对象: String str = new String(); · 传递参数生成一个字符串对象: String str = new String("HelloWorld"); · 由字符数组生成一个字符串对象: String str = new String(char s[ ]); · 由字符数组

C++学习笔记8-操作符重载

1. 重载操作符必须具有一个类类型操作数 用于内置类型的操作符,其含义不能改变.例如,内置的整型加号操作符不能重定义: // error: cannotredefine built-in operator for ints int operator+(int, int); 也不能为内置数据类型重定义加号操作符.例如,不能定义接受两个数组类型操作数的operator+. 重载操作符必须具有至少一个类类型或枚举类型的操作数.这条规则强制重载操作符不能重新定义用于内置类型对象的操作符的含义. 2. 优