zoukankan      html  css  js  c++  java
  • C++ 学习之函数重载、基于const的重载

    函数重载

    函数重载的定义是:在相同的作用域中,如果函数具有相同名字而仅仅是形参表不同,此时成为函数重载。注意函数重载不能基于不同的返回值类型进行重载。

    注意函数重载中的“形参表”不同,是指本质不同,不要被一些表象迷惑。main函数不能被重载。

    下面三组定义本质是相同的,不是重载:

    1)int sum (int &a); 和 int sum (int &);

    2)  int sum (int a) 和 int sum (const int a);

    3)typedef int DD;

         int sum(int a); 和 int sum (DD a);

    其中第二个例子对于非引用传参,形参是否const是等价的。但是当使用引用传参时,有无const是不同的。使用指针传参时,指向const对象的指针和指向非const对象的指针做形参的函数是不同的。《C++ primer》一书中这样描述:“可基于函数的引用形参是指向 const 对象还是指向非 const 对象,实现函数重载。将引用形参定义为 const 来重载函数是合法的,因为编译器可以根据实参是否为 const 确定调用哪一个函数。”

    对于函数值传递的情况,因为参数传递是通过复制实参创建一个临时变量传递进函数的,函数内只能改变临时变量,但无法改变实参。则这个时候无论加不加const对实参不会产生任何影响。但是在引用或指针传递函数调用中,因为传进去的是一个引用或指针,这样函数内部可以改变引用或指针所指向的变量,这时const 才是实实在在地保护了实参所指向的变量。因为在编译阶段编译器对调用函数的选择是根据实参进行的,所以,只有引用传递和指针传递可以用是否加const来重载。

    #include<iostream>
    
    class A{
    public:
    	A();
    	int foo(int *test);//可看做:int foo(A *this,int *test);
    	int foo(const int *test);//可看做:int foo(const A *this,int *test);
    };
    A::A(){
    }
    int A::foo(int *test){
    	std::cout << *test << " A::foo(int *test)" <<std::endl;
    	return 1;
    }
    int A::foo(const int *test){
    	std::cout << *test << " A::foo(const int *test)" <<std::endl;
    	return 1;
    }
    int main()
    {
    	const int b =5;
    	int c = 3;
    	A a;
    	a.foo(&b);
    	a.foo(&c);
    	return 1;
    }



    *下面谈论一个比较恶心的问题,基于const的重载。

    在类中会有这样一种重载,它是合法的。

    Class A {

    int function ();

    int function () const;

    };

    可以看到在A类中,function函数是发生重载了,而且是合法的。而且在调用时,只用A类的const对象才能调用const版本的function函数,而非const对象可以调用任意一种,通常非const对象调用不是const版本的function函数。

    原因是:按照函数重载的定义,函数名相同而形参表有本质不同的函数称为重载。在类中,由于隐含的this形参的存在,const版本的function函数使得作为形参的this指针的类型变为指向const对象的指针,而非const版本的使得作为形参的this指针就是正常版本的指针。此处是发生重载的本质。重载函数在最佳匹配过程中,对于const对象调用的就选取const版本的成员函数,而普通的对象调用就选取非const版本的成员函数。

    (注:this指针是一个const指针,地址不能改,但能改变其指向的对象或者变量)

    #include <iostream>
    using namespace std;
    
    class A{
    public:
    	int fun()
    	{
    		return 10;
    	}
    	int fun()const
    	{
    		return 5;
    	}
    };
    int main()
    {
    	A a1;
    	cout << a1.fun() << endl;
    	const A a2;
    	cout << a2.fun() << endl;
    }


    http://blog.csdn.net/guiyinzhou/article/details/6307754

  • 相关阅读:
    POJ 3126 Prime Path
    POJ 2429 GCD & LCM Inverse
    POJ 2395 Out of Hay
    【Codeforces 105D】 Bag of mice
    【POJ 3071】 Football
    【POJ 2096】 Collecting Bugs
    【CQOI 2009】 余数之和
    【Codeforces 258E】 Devu and Flowers
    【SDOI 2010】 古代猪文
    【BZOJ 2982】 combination
  • 原文地址:https://www.cnblogs.com/lgh1992314/p/5835262.html
Copyright © 2011-2022 走看看