2013-05-31 3 views
4

У меня есть код, который работает, как ожидалось:Почему не так называется ctor?

EscapedString es("Abc&def"); 
EscapedString es2(""); 
es2 = es;  // es2 == Abc%26def 

и код, который не работает, как ожидалось:

EscapedString es("Abc&def"); 
EscapedString es2 = es; // es == Abc%2526def 

Во втором случае CTOR2 вызывается вместо CTOR3 даже если es является EscapedString.

EscapedString es(EscapedString("Abc?def")); 

ли правильно, но я не могу показаться, чтобы установить точку останова на CTOR3, так что я не уверен, что она работает правильно, или код оптимизирован прочь или он случайно работает.

Класс ниже:

class EscapedString : public std::string { 
public: 
    EscapedString(const char *szUnEscaped) { // CTOR1 
     *this = szUnEscaped; 
    } 

    EscapedString(const std::string &strUnEscaped) { // CTOR2 
     *this = strUnEscaped; 
    } 

    explicit EscapedString(const EscapedString &strEscaped) { // CTOR3 
     *this = strEscaped; // Can't set breakpoint here 
    } 

    EscapedString &operator=(const std::string &strUnEscaped) { 
     char *szEscaped = curl_easy_escape(NULL, strUnEscaped.c_str(), strUnEscaped.length()); 
     this->assign(szEscaped); 
     curl_free(szEscaped); 
     return *this; 
    } 
    EscapedString &operator=(const char *szUnEscaped) { 
     char *szEscaped = curl_easy_escape(NULL, szUnEscaped, strlen(szUnEscaped)); 
     this->assign(szEscaped); 
     curl_free(szEscaped); 
     return *this; 
    } 
    EscapedString &operator=(const EscapedString &strEscaped) { 
     // Don't re-escape the escaped value 
     this->assign(static_cast<const std::string &>(strEscaped)); 
     return *this; 
    } 
}; 
+0

я думаю, что он должен делать с перегрузкой операторов. –

+7

Возможно, потому, что вы сделали свой конструктор копирования явным? – juanchopanza

ответ

10

Обычно EscapedString es2 = es; будет вызывать конструктор копирования, однако вы явно сказали, это не сделав конструктор копирования explicit:

explicit EscapedString(const EscapedString &strEscaped) 

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

EscapedString es(EscapedString("Abc?def")); 

Вот что происходит, когда компилятор встречает EscapedString es2 = es;.

Сначала компилятор видит, может ли он использовать конструктор копирования и обнаруживает, что он не может, поскольку он был отмечен explicit. Поэтому он ищет другого конструктора для вызова. Поскольку EscapedString происходит от std::string, компилятор может бросить es как const std::string& и называют:

EscapedString &operator=(const std::string &strUnEscaped) 
Смежные вопросы