重载函数

出现在相同的作用域中的两个函数,如果具有相同的名字而形参表不同。则称为 重载函数(overloaded function)

任何程序都仅有一个main 函数的实例。main 函数不能重载

函数重载和重复声明的区别

如果两个函数声明的返回类型和形参表完全匹配,则将第二个函数声明视为第一个的重复定义。

如果两个函数的形参表完全相同,但返回类型不同,则第二个声明是错误的。(然而  使用const  是可以被重载 的)

 

函数不能仅仅基于不同的返回类型而实现重载,但是可以基于const  (常量性) 被重载。

 

------------------------------------------------------------

Record lookup(Phone) ;

Record lookup(const Phone); // redclaration  重复声明

这个区别仅仅在于是否将形参 定义为const  . 这种差异并不影响传递至函数的对象;第二个函数声明被视为第一个的重复声明。其原因在与实参传递的方式。

复制形参时并不考虑形参是否未const ---- 函数操纵的只是副本。函数无法修改实参。 结果,即可将const 对象传递给 const 形参,也可传递给 非const 形参。两种形参并无本质区别。

 

然而,值得注意的是,形参与const 形参 的等价性 仅仅适用于 非引用形参。

有 const 引用形参的函数与有非const 引用形参的函数式不同的。类似的,如果函数带有指向 const 类型的指针形参, 则与带有指向相同类型的非const对象的指针形参的函数不相同。

 

 

 

可以基于函数的引用形参时指向const 对象还是 非const 对象,实现函数重载。

 

Record lookup(Account &);

Record lookup(const Account &);  //  ok  , new function 

const  Account a(0);

Account b;

lookup(a); // calls lookup(const Account&)

lookup(b);// calls lookup( Account &)

 

 

                              

 const  在 * 左边,说明指向的物 为const  不能变   。  *p =0 // error   ////

 const  在 * 右边。 说明指针本身为 const  指针不能变,但是指向的物可以变    ++p// error;

然而注意 不能基于 指针本身是否未const 来实现函数的重载: 

 f(int *)    

f(int * const)  //重复声明                                                                                

 

此时const  用于修饰指针本身,而不是修饰指针所指向的类型。两种情况都复制了指针,

指针本身是否为const 并没有带来区别, 当形参以副本传递时候,不能基于形参是否未const 来实现重载。

 

 

int cal(int, int);

int cal(const int&, const int &); //ok

int calc(char *  ,char *)

int calc(const char* , const char *);// ok

 

int calc(char* char*);

int calc(char* const , char  *const);// error   

 

 

 

时间: 2024-08-03 18:41:46

重载函数的相关文章

C++:运算符重载函数之"++"、"--"、"[ ]"的应用

5.2.5 "++"和"--"的重载 对于前缀方式++ob,可以用运算符函数重载为: ob.operator++() //成员函数重载 或 operator++(X &ob) //友元函数重载,其中ob为类X的对象的引用 对于后缀方式++ob,可以用运算符函数重载为: ob.operator++(int) //成员函数重载 或 operator++(X &ob,int) //友元函数重载,其中ob为类X的对象的引用 调用时,参数int一般被传递给值0

C++:运算符重载函数之成员运算符重载函数

5.2.3 成员运算符重载函数 在C++中可以把运算符重载函数定义为某个类的成员函数,称之为成员运算符重载函数. 1. 定义成员运算符重载函数的语法形式 (1)在类的内部,定义成员运算符重载函数的格式如下: 函数类型 operator 运算符(形参表) {       函数体 } (2)成员运算符重载函数也可以在类中声明成员函数的原型,在类外定义. 在类的内部,声明成员运算符重载函数原型的格式如下: class X{      ...      函数类型 operator运算符(参数表); };

第五篇:明确拒绝不想编译器自动生成的拷贝构造函数和赋值运算符重载函数

前言 如果你不想要编译器帮你自动生成的拷贝机制 (参考前文),那么你应当明确的拒绝. 如何拒绝?这便是本文要解决的主要问题. 问题描述 当你定义了一个类,而这个类中各对象之间也是封装的 - 禁止同类对象之间的相互赋值以及复制,那么你需要屏蔽掉编译器帮你生成的拷贝构造函数以及赋值运算符. 在许多代码中,会看到通过将拷贝构造函数和赋值运算符重载函数声明为私有且不予实现来实现这个功能.然而,这不是最科学的做法. 因为这没有做到真正的屏蔽:你在自己的成员函数中,或者友元函数中仍然可以调用这两个私有函数,

C++:运算符重载函数之友元运算符重载

5.2.2 友元运算符重载函数 运算符重载函数一般采用两种形式定义: 一是定义为它将要操作的类的成员函数(简称运算符重载函数): 二是定义为类的友元函数(简称为友元运算符重载函数). 1.定义友元运算符重载函数的语法如下: 在类的内部: friend 函数类型 operator运算符(形参表) { 函数体 } 在类的内部声明,在类外定义: class X{ ... friend 函数类型 operator运算符(形参表): }; 函数类型 X::operator运算符(形参表) { 函数体 }

明确拒绝不想编译器自动生成的拷贝构造函数和赋值运算符重载函数

前言 如果你不想要编译器帮你自动生成的拷贝机制 (参考前文),那么你应当明确的拒绝. 如何拒绝?这便是本文要解决的主要问题. 问题描述 当你定义了一个类,而这个类中各对象之间也是封装的 - 禁止同类对象之间的相互赋值以及复制,那么你需要屏蔽掉编译器帮你生成的拷贝构造函数以及赋值运算符. 在许多代码中,会看到通过将拷贝构造函数和赋值运算符重载函数声明为私有且不予实现来实现这个功能.然而,这不是最科学的做法. 因为这没有做到真正的屏蔽:你在自己的成员函数中,或者友元函数中仍然可以调用这两个私有函数,

重载函数编译后的新名字

我们都知道很多语言都支持函数重载,那么编译器是怎么处理编译后它们的命名冲突的呢? 1.先给出几个正确的重载函数: #include <iostream> using namespace std; int Add(int a, int b) { return a + b; } double Add(double a, double b) { return a + b; } double Add(double a, int b) { return a + b; } double Add(int a

使用System.IO.Combine(string path1, string path2, string path3)四个参数的重载函数提示`System.IO.Path.Combine(string, string, string, string)&#39; is inaccessible due to its protection level

今天用Unity5.5.1开发提取Assets目录的模块,使用时采用System.IO.Path.Combine(string, string, string, string)函数进行路径生成 明明是公有函数,为何会报错,奇了怪了 有谁知道什么原因?欢迎交流 ....... ... 重新打开了一下 ,可以了.版本原因 使用System.IO.Combine(string path1, string path2, string path3)四个参数的重载函数提示`System.IO.Path.Co

在c++ 模板类外写 操作符重载函数,并且是模板类的友元函数

看视频教程说不能在c++ 模板类外写 操作符重载函数,并且是模板类的友元函数 我试了试,可以,放出测试代码: #include <iostream> using namespace std; template<typename T> class A { public: A(T a) { this->a = a; } template<typename T> //加上这句就可以了 friend A<T> operator+(A<T> &

[email&#160;protected]重载函数

关于重载详细分析参考: http://www.cnblogs.com/skynet/archive/2010/09/05/1818636.html 内部机制涉及重载函数如何解决命名冲突,调用匹配的问题. 分辨重载的准则: 精确匹配:参数匹配而不做转换,或者只是做微不足道的转换,如数组名到指针.函数名到指向函数的指针.T到const T: 提升匹配:即整数提升(如bool 到 int.char到int.short 到int),float到double 使用标准转换匹配:如int 到double.d