精华内容
下载资源
问答
  • const成员函数重载

    2019-09-18 12:38:12
    除了常规的函数重载 在函数后加上一个const也可以实现重载,即使参数列表完全相同 调用时,根据对象的const性选择重载函数

    除了常规的函数重载
    在函数后加上一个const也可以实现重载,即使参数列表完全相同
    调用时,根据对象的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对象的指针做形参的函数是不同的。

    *下面谈论一个比较恶心的问题,基于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指针,地址不能改,但能改变其指向的对象或者变量)

     

     

    我们从一个例子说起,来看一下String类, 我们为它提供一个下标操作符([ ])以读写指定位置的字符(char)。

    只要了解过C++的操作符重载的语法,很快就可以写出下面这个[]操作符重载函数:
    char& operator[](int posion)    // function_1
     {
          return data[posion];
     };
    注意,这里该函数的返回值为一个引用,否则str[0] = 'c'这样的语句就会不合法,因为str[0]将是一个左值。

    那么,是否提供这样一个function_1就足够了呢?看下面这段代码:
    const String str= "She";
    char c = str[0];    // 错误!编译提示:error C2678: 二进制“[” : 没有找到接受“const String”类型的左操作数的运算符(或没有可接受的转换)

    很显然,我们必须还要为const String提供一个const版本的opeartor[]。如下:
    char& operator[](int posion) const
     {
          return data[posion];
     }
    这样,当使用const的String对象使用[]操作符时,便会调用该const的重载版本。
    但是,这样就OK了嘛?虽然上面的那段代码没有问题了,但是其中却隐藏了一个陷阱,看如下代码:
    const String str = "She";
    str[0] = 'T';
    上面这段代码可以编译,运行通过,str变为了"The"!而str声明为const的!!

    现在,你应该知道了,对于const的该操作符重载函数其返回值也应该是const的,否则就会出现可以通过其修改const对象的漏洞。修改如下:
    const char& operator[](int posion) const
     {
          return data[posion];
     }
    好了,现在没有问题了!

    我们再回过头来看一下,为了给String提供一个[]操作符来读写指定位置的字符,需要提供如下两个函数,以分别对非const String对象和const String对象提供支持:
    char& operator[](int posion)
     {
         return data[posion];
     };

     const char& operator[](int posion) const
     {
         return data[posion];
     }

    转自https://blog.csdn.net/net_assassin/article/details/9997257

    展开全文
  • const 参数重载与const 成员函数重载

    千次阅读 2017-10-18 20:59:01
    const 参数重载《C++ primer》一书中这样描述:“可基于函数的引用形参是指向 const 对象还是指向非 const 对象,实现函数重载。将引用形参定义为 const 来重载函数是合法的,因为编译器可以根据实参是否为 const ...

    const 参数重载

    《C++ primer》一书中这样描述:“可基于函数的引用形参是指向 const 对象还是指向非 const 对象,实现函数重载。将引用形参定义为 const 来重载函数是合法的,因为编译器可以根据实参是否为 const 确定调用哪一个函数。”
    

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

    const成员函数重载

    const成员函数的解析可被看做是对函数this参数用const来修饰的过程

    class A{  
    public:  
        A();  
        int foo(int *test); //可看做:int foo(A *this,int *test);  
        int foo(int *test) const;//可看做:int foo(const A *this,int *test);  
    };  
    A::A(){  
    }  
    int A::foo(int *test){  
        std::cout << *test << "foo" <<std::endl;  
        return 1;  
    }  
    int A::foo(int *test) const {  
        std::cout << *test << "foo const" <<std::endl;  
        return 1;  
    }  
    int main()  
    {  
        int b = 5;  
        const A a;  
        a.foo(&b);  //调用的是int foo(int *test) const;
        return 1;  
    }  

    总结:

    1. const重载主要是通过能否对传入的参数进行修改为判断的

    2. const参数重载和const函数重载机制都是一样的,因为对于const 函数重载可看做是对隐含的指针this的参数重载

    3. 重载是在编译阶段已经完成,对于汇编和链接来说透明的。

    展开全文
  • 在C++中void func() const 和void func()可以形成重载函数,如果void func() const和void func()写同样的代码实现func功能,这样就造成了代码浪费(重复写代码)。这种问题的解决方式就是利用static_cast达到代码复用...

     在C++中void func() const 和void func()可以形成重载函数,如果void func() const和void func()写同样的代码实现func功能,这样就造成了代码浪费(重复写代码)。这种问题的解决方式就是利用static_cast达到代码复用的目的(重复利用代码)。

    下面给出一个转换过程:

    // 实例只是为了讲述转换过程
    class TestBlock
    {
    public:
        bool checkIndex(const size_t index) noexcept
        {
            return index>=0 && index<this->m_text.size();
        }
        
        bool isValid() const noexcept
        {
            return this->m_text.empty();
        }
    
        const char& operator[](const size_t index) const noexcept
        {
            if (!isValid() || !checkIndex()) // 代码重复
                return char('\0');
            return this->m_text[index];
        }
        
        
        const char& operator[](const size_t index) noexcept
        {
            if (!isValid() || !checkIndex()) // 代码重复
                return char('\0');
            return this->m_text[index];
        }
    
    private:
        string m_text;
    };

    转换之后:( 注意static_cast<const T&>(*this) )

    // 实例只是为了讲述转换过程
    class TestBlock
    {
    public:
        bool checkIndex(const size_t index) noexcept
        {
            return index>=0 && index<this->m_text.size();
        }
        
        bool isValid() const noexcept
        {
            return this->m_text.empty();
        }
    
        const char& operator[](const size_t index) const noexcept
        {
            if (!isValid() || !checkIndex()) // 代码重复
                return char('\0');
            return this->m_text[index];
        }
        
        
        const char& operator[](const size_t index) noexcept
        {
            return static_cast<const TextBlock&>(*this)[index]; // 给this指针加上const属性,然后调用const版本的operator[]
        }
    
    private:
        string m_text;
    };

     

    展开全文
  • 书上和网上在很多地方都对const重载做了一些解释,但感觉都不是很详细。还有很多同学在不同的地方发问关于const 重载的问题,这里我又重新看了一下,做了一个简单的分析也可能有不对的地方,欢迎讨论。 所谓重载...
  • 成员函数和非常成员函数之间的重载 首先先回忆一下常成员函数 声明:<类型标志符>函数名(参数表)const; 说明: (1)const是函数类型的一部分,在实现部分也要带该关键字。 (2)const关键字可以用于对重载...
  • 在类中可以含有普通成员函数和静态成员函数,而使用 const修饰的普通成员函数称为 常成员函数 const修饰的是普通成员函数中的this指针指向的内存空间 类的普通成员函数中都存在隐藏的 this指针,比如: class ...
  • C++ 成员函数 const 重载

    千次阅读 2015-05-18 21:24:08
    还有一种类成员函数重载,它并不要求函数的参数类型不同。下面给出例子: #include using namespace std; class A { public: A(int a):_a(a){} void print()const//函数体中不能修改数据成员对象,否
  • C++中const用于函数重载成员函数和非常成员函数之间的重载 首先先回忆一下常成员函数 声明:<类型标志符>函数名(参数表)const; 说明: (1)const是函数类型的一部分,在实现部分也要带该关键字。 ...
  • 如何理解const成员函数

    多人点赞 2019-02-21 12:01:15
    在深入理解const成员函数之前,先来复习一下const关键字的基础用法。 1. const修饰某个非指针类型变量 const 修饰某个非指针类型变量,表示该变量只读。 const int a = 10; a = 20; // 错误,不可以赋值 2. const...
  • #include&lt;iostream&gt; using namespace std; class Test { ... Test(int v):data(v){} void print()//this指针...调用非const成员函数!"&lt;&lt;endl; data =7;//可以改变data的值 cout...
  • 最近遇到的一个错误,重载类的小于比较操作符,然后通过algorithm中的sort对其进行排序时提示了一个编译错误: 1>—— 已启动生成: 项目: T, 配置: Debug Win32 —— 1>正在编译… 1>Main.cpp 1>e:\code\X\t\t\...
  • C++ const函数重载的影响

    千次阅读 2019-08-20 21:00:07
    重载,是指允许存在多个同名函数,而这些函数的参数表不同,即函数名相同但函数的签名...一、const 修饰成员函数时的重载 第一种情况: #include<iostream> using namespace std; void fun(const int i...
  • 深入理解C++函数重载const

    千次阅读 2017-08-17 22:12:26
    书上和网上在很多地方都对const重载做了一些解释,但感觉都不是很详细。还有很多同学在不同的地方发问关于const 重载的问题,这里我又重新看了一下,做了一个简单的分析也可能有不对的地方,欢迎讨论。 所谓重载...
  • 成员函数和非常成员函数之间的重载 首先先回忆一下常成员函数 声明:&lt;类型标志符&gt;函数名(参数表)const; 说明: (1)const是函数类型的一部分,在实现部分也要带该关键字。 (2)const...
  • 类的成员函数可以仅按是否有后置const进行重载。 但:只有将类实体声明为const类型后,才会调用带后置const的函数 ...若不将实例声明为const类型,即使类成员含const数据也不会调用后置const成员函数
  • 本文转自https://www.cnblogs.com/qingergege/p/7609533.htmlconst到底是不是一个重载的参考对象,请看下面的例子class A{... //函数1 void f(int i) const { std::cout&lt;&lt;"2" ;};//函数2};...
  • 类的const和非const成员函数重载

    千次阅读 2013-05-08 16:49:10
    1. 类的const成员函数与非const成员函数重载 #include #include using namespace std; class Person { public: Person() {} Person(string name, string address) : mName(name), mAddress(address){} ...
  • 2• 对于const对象,只能调用const成员函数 3• Const函数和非const函数可以形成重载 4• 对于非const对象的函数调用优先选择非const成员函数 5• 对于类中的mutable数据成员,可以被const成员函数修改 ...
  • 1. 在C++中只有被声明为const的成员函数才能被一个const类对象调用。如果要声明一个const类型的类成员函数,只需要在成员函数...在类体之外定义const成员函数时,还必须加上const关键字,例如: char Screen :: get() c
  • C++ 运算符重载:成员、非成员函数重载

    千次阅读 多人点赞 2020-06-19 19:41:34
    C++ 运算符重载运算符重载1、背景2、运算符函数重载的两种形式1、成员函数重载1、定义格式2、非成员函数重载(友元)1、定义格式3、重载原则4、参数和返回值5、成员函数重载1、双目运算符重载1、定义2、调用格式2、...
  • 【C++】const 成员函数

    2019-08-18 16:20:00
    const(常)成员函数是一种获取对象状态的成员函数,并且不能改变对象的状态(也就是不能修改对象的成员的值)。声明和定义如下: class A { public: void func() const; }; A::void func() const { // 常成员...
  • 成员函数const重载总共有三种方式,有三个地方可以写const,要注意const在不同的地方的意义。 #include #include #include using namespace std; void fun(const int& i)//fun(10)这能用这个函数 { cout<<
  • const修饰类的成员函数

    千次阅读 2018-11-26 12:51:50
    将const修饰的类成员函数称之为const成员函数。const修饰类成员函数,实际修饰该成员函数隐含的 this 指针,表明在该成员函数中不能对类的任何成员进行修改。 二、 const 成员函数 (1)const 类成员函数中不能...
  • C++的const成员函数

    万次阅读 多人点赞 2013-03-04 18:00:42
    我们知道,在C++中,若一个变量声明为const类型,则试图修改该变量的值的操作都被视编译错误。例如, const char blank = ‘’;...为了保证const对象的常量性,编译器须区分不安全与安全的成员函数
  • C++重载运算符及const成员函数简述

    千次阅读 2017-04-12 22:18:33
    ACM中,用重载函数会使解题更加方便,但是又需要像c++那样深入理解,遂简单总结了结构体中的重载运算符及const成员函数一些简单的用法. 闲言少叙,直接看代码: /** * 行有余力,则来刷题! * 博客链接:...
  • 运算符重载,是C++多态的表现形式之一,可以通过对运算符进行重载来实现运算符特定的功能。 运算符重载一般具有以下原则: (1)不可重载不存在的运算符,如重载**来表示平方等; (2)重载后的运算符与原来的运算符...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 95,661
精华内容 38,264
关键字:

const成员函数重载