2015-11-11 4 views
4

Мне было интересно, почему скомпилирован следующий код.Оператор присваивания C++ и перегрузка

#include <iostream> 
#include <cassert> 
using namespace std; 

class Integer{ 
private: 
    int i; 
public: 
    Integer(int value):i(value){} 
    // unary or binary 
    const Integer operator+(const Integer& rv){ 
     cout << "operator+"<< endl; 
     return Integer(i + rv.i); 
    } 
    // Binary Operator 
    Integer& operator+=(const Integer& rv){ 
     cout << "operator+=" << endl; 
     i += rv.i; 
     return *this; 
    } 
    ostream& operator<<(ostream& lv){ 
     lv << i; 
     return lv; 
    } 
    friend ostream& operator<< (ostream& lv, Integer& rv); 
}; 

ostream& operator<< (ostream& lv,Integer& rv){ 
    return lv << rv.i; 
} 

int main(){ 
    cout << "using operator overloading"<< endl; 

    Integer c(0), a(4), b(5); 
    Integer d = 8; 
    c = a + b; 
    cout << c << endl; 
    cout << d << endl; 
} 

Я не понимаю, почему возможно d = 8. d - определенный пользователем тип. Я не перегружал задание oeprator для класса Integer. Есть ли перегруженный по умолчанию оператор?

+0

Этот сайт описывает явные/неявные конструкторы достаточно хорошо: http://en.cppreference.com/w/cpp/language/explicit – jensa

ответ

8

Вы не объявлен Integer конструктор explicit, поэтому он действует как неявное преобразование из int в Integer.

Если объявить конструктор

explicit Integer(int value); 

компилятор запускает ошибку:

error: conversion from ‘int’ to non-scalar type ‘Integer’ requested

2

Ваш конструктор определяет преобразование из INT в Integer

Integer(int value):i(value){} 
2

I dont understand why d = 8 is possible. d is a user defined type.

Просто инструмент код немного больше, а также проследить CTOR вызовов.

#include <iostream> 
#include <cassert> 
using namespace std; 

class Integer{ 
private: 
    int i; 
public: 
    Integer(int value):i(value){ 
     cout << "Integer(int) called with " << value << endl; 
    } 
    // unary or binary 
    const Integer operator+(const Integer& rv){ 
     cout << "operator+"<< endl; 
     return Integer(i + rv.i); 
    } 
    // Binary Operator 
    Integer& operator+=(const Integer& rv){ 
     cout << "operator+=" << endl; 
     i += rv.i; 
     return *this; 
    } 
    ostream& operator<<(ostream& lv){ 
     lv << i; 
     return lv; 
    } 
    friend ostream& operator<< (ostream& lv, Integer& rv); 
}; 

ostream& operator<< (ostream& lv,Integer& rv){ 
    return lv << rv.i; 
} 

int main(){ 
    Integer d = 8; 
    cout << d << endl; 
} 

выход:

Integer(int) called with 8 
8 

live в Coliru-х

Предполагаемое назначение непосредственного 8 на самом деле вызывает не- explicitInteger(int) CTOR называться с 8 в качестве аргумента.

Смежные вопросы