2015-12-03 3 views
2

Почему выполняется следующая работа?Передача указателя на функцию ref ref

#include <iostream> 
using namespace std; 

class PolyLine { 
public: 
    PolyLine() = default; 
    PolyLine(PolyLine * ptr) { 
    std::cout << "Ctor called" << std::endl; 
    } 

}; 

void function(const PolyLine& pt) { 
} 

int main() { 

    PolyLine *pobj = new PolyLine(); 

    function( pobj); 

    return 0; 
} 

Кажется, что неявное преобразование каким-то образом вызвано .. почему я не получаю ошибку компиляции?

+0

'почему я не получаю компиляции error' Почему вы ожидаете ошибку? – user657267

+1

Вы определили неявное преобразование, и компилятор использует это преобразование. Не удивительно. – Suma

+0

Вам не хватает 'delete pobj;' в конце main. Либо исправьте это, либо измените определение pobj на это: 'PolyLine pobj;' –

ответ

6

Он работает, потому что вы вызываете свой неявный конструктор преобразования, потому что это то, что может произойти, когда вы передаете что-то в качестве аргумента, и у вас есть неявный конструктор, принимающий один аргумент.

Если вы не хотите, неявное преобразование происходит в этом случае, вы можете пометить конструктор как explicit:

explicit PolyLine(PolyLine * ptr) { 
    std::cout << "Ctor called" << std::endl; 
} 

, что сказал, это кажется немного странным, чтобы иметь конструктор, принимающий указатель на другой объект того же класса; почему бы не использовать const PolyLine&?

+0

Потому что я n00b, вот почему. Спасибо – Dean

+1

Я предполагаю, что вы хотели добавить «явный» в фрагмент кода там? :) – CompuChip

+0

Для понимания: почему ссылка лучше, чем указатель в конструкторе? Чтобы избежать его отсутствия? – Dean

1

Это неявное преобразование работает на C++. Если вы передадите char* функции, которая принимает std::string в качестве первого параметра, C++ преобразует char* в std::string с использованием конструктора std::string.

-3

Если вы сделаете какую-либо операцию в function (..), которая изменит состояние объекта, тогда вы получите ошибку компилятора. Как следующее:

#include <iostream> 
using namespace std; 

class PolyLine { 
public: 
    PolyLine() = default; 
    PolyLine(PolyLine * ptr) { 
    std::cout << "Ctor called" << std::endl; 
    } 

    void test() 
    { 
    _a = 100; 
    } 

    private: 
    int _a; 
}; 

void function(const PolyLine& pt) { 
    pt.test(); 
} 

int main() { 

    PolyLine *pobj = new PolyLine(); 

    function( *pobj); 

    return 0; 
} 

выход Компиляция:

[email protected]:/tmp$ g++ -std=c++11 main.c 
main.c: In function ‘void function(const PolyLine&)’: 
main.c:21:12: error: passing ‘const PolyLine’ as ‘this’ argument of ‘void PolyLine::test()’ discards qualifiers [-fpermissive] 
    pt.test(); 
      ^
+0

Это связано с параметром 'const', не связанным с неявными преобразованиями. – TartanLlama

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