C++中操作符重载的const与默认构造函数

问题描述

C++中操作符重载的const与默认构造函数

原代码

class TestOverloadLessThan
{
public:
    TestOverloadLessThan( int m ) : m_int(m){};
    int getInt(){ return m_int;};

    bool operator<( const TestOverloadLessThan& t) const
    {
        return ( this->getInt() < t.getInt() );
    };
private:
    int m_int;
};

//bool operator<( const TestOverloadLessThan& t1,const TestOverloadLessThan& t2)
//{
//  return ( t1.getInt() < t2.getInt() );
//}

int _tmain(int argc, _TCHAR* argv[])
{
    using namespace std;

    list<TestOverloadLessThan> l;

    for ( int n=0 ; n<10 ; ++n )
    {
        TestOverloadLessThan t(n);
        l.push_front(t);
    }

    l.sort();

    for ( list<TestOverloadLessThan>::const_iterator it=l.begin() ; it!=l.end() ; ++it )
    {
        cout<<(*it).getInt()<<endl;
    }

    system("pause");
    return 0;
}

无论成员函数与非成员函数都是这个错误。两个const和const_iterator:
error C2662: 'TestOverloadLessThan::getInt' : cannot convert 'this' pointer from 'const TestOverloadLessThan' to 'TestOverloadLessThan &'
把所有的const去掉之后就可以通过,加上默认构造函数加上const可以通过

class TestOverloadLessThan
{
public:
    TestOverloadLessThan(){};
    TestOverloadLessThan( int m ) : m_int(m){};
    int getInt(){ return m_int;};

    bool operator<( const TestOverloadLessThan& t) const
    {
        return ( this->getInt() < t.getInt() );
    };
private:
    int m_int;
};

测试代码与原来一样。
请问这里是在哪里影响了this指针转换const——>普通引用的

时间: 2024-12-31 02:55:37

C++中操作符重载的const与默认构造函数的相关文章

c++ 操作符重载-关于操作符重载的问题

问题描述 关于操作符重载的问题 C++中如果想要对某个类设计一个友元的操作符重载,比如string类型支持string1+string2. 如果返回一个引用的话,编译器会报错.因为返回的类是局部变量,无法引用. 比如: //此函数为List类的友元函数. //template friend List& operator+(List& L1,List& L2); template List& operator+(List& L1,List& L2) { Lis

c++-关于C++操作符重载的问题

问题描述 关于C++操作符重载的问题 C++中如果想要对某个类设计一个友元的操作符重载,比如string类型支持string1+string2. 如果返回一个对象的引用的话,编译器会报错.因为返回的对象是局部变量,无法引用. 比如: //此函数为List类的友元函数. //template friend List& operator+(List& L1,List& L2); template List& operator+(List& L1,List& L2

asp.net中操作符简单介绍

c#中操作符重载:  代码如下 复制代码 class Test { public static Test operator + (Test arg1,Test arg2){...} } 虽然CLR对操作符一无所知,但它却规范了编程语言应该怎样提供操作符重载,以使它们可以很容易地被不同的编程语言编写的代码所使用,每个编程语言自己决定是否支持操作符重载,以及如果提供,表达和使用它们的语法是怎样的,对于CLR来讲,操作符重载仅仅是一些方法而已. 当编辑如果代码时,编辑器会产生一个名为op_Additi

Ruby中对一元操作符重载实例_ruby专题

一元操作大家都知道,就是表达式的操作符只有一个输入值.这个在C和Java中都很常见.今天我们要探讨一下Ruby中的一元操作符重载. 一元操作符有:+ – * ! & 等,为了避免与数值的 + – 混淆,重载一元操作符,要在后面加上一个 @ 操作符. 1. 一个简单的一元操作符重载例子:-@ 操作符我们以String类为例子.String默认没有定义 – 操作符: 复制代码 代码如下: 1.9.3p125 :027 > a = "Hello" => "Hel

C#中奇妙的操作符重载

C#中奇妙的操作符重载 细心的朋友可能发现,C#虽然可以重载操作符,但和C++比较起来,却有很大的不同.定义的时候重载操作符方法必须是static,而且至少有一个参数(一目和二目分别是一个和两个),C#和C++比起来,最重要的特征是:<.>:==.!=:true.false必须成对出现,即重载了"<"就必须重载">",重载了"=="就必须重载"!=",重载了"true"就必须重载&q

C#中如何利用操作符重载和转换操作符

原文:C#中如何利用操作符重载和转换操作符 操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成把两个整数加到一起的代码. 当编译器发现两个string类型的实例使用+操作符的时候,编译器会生成把两个字符串连接到一起的代码.那么编译器怎么就会知道这样做呢?如何进行操作符重载呢? 下面C#代码展示了一个类中如何进行操作符重载: namespace Do

C++中的操作符重载详细解析_C 语言

一.什么是操作符重载操作符重载可以分为两部分:"操作符"和"重载".说到重载想必都不陌生了吧,这是一种编译时多态,重载实际上可以分为函数重载和操作符重载.运算符重载和函数重载的不同之处在于操作符重载重载的一定是操作符.我们不妨先直观的看一下所谓的操作符重载: 复制代码 代码如下: #include <iostream> using namespace std; int main(){    int a = 2 , b = 3;    float c =

运算符重载-C++ 操作符重载的内存释放问题

问题描述 C++ 操作符重载的内存释放问题 =操作符重载,给复构造函数进行赋值时的代码如下: MyString & MyString::operator =(const MyString &str) { if(this == &str) return *this; delete []m_pData; //**???????????????????????????? ** m_pData = NULL; m_pData = new char(strlen(str.m_pData) +

C#锐利体验之第八讲 索引器与操作符重载

索引 索引器 索引器(Indexer)是C#引入的一个新型的类成员,它使得对象可以像数组那样被方便,直观的引用.索引器非常类似于我们前面讲到的属性,但索引器可以有参数列表,且只能作用在实例对象上,而不能在类上直接作用.下面是典型的索引器的设计,我们在这里忽略了具体的实现. class MyClass{    public object this [int index]    {        get        {            // 取数据        }        set