构造函数被调用两次

时间:2010-06-03 11:34:35

标签: c++

在代码中:

//file main.cpp
LINT a = "12";
LINT b = 3;
a = "3";//WHY THIS LINE INVOKES CTOR?


std::string t = "1";
//LINT a = t;//Err NO SUITABLE CONV FROM STRING TO LINT. Shouldn't ctor do it?

//file LINT.h
#pragma once
#include "LINT_rep.h"
class LINT
{
private:
    typedef LINT_rep value_type;
    const value_type* my_data_;
    template<class T>
    void init_(const T&);
public:
    LINT(const char* = 0);
    LINT(const std::string&);
    LINT(const LINT&);
    LINT(const long_long&);
    LINT& operator=(const LINT&);
    virtual ~LINT(void);

    LINT operator+()const;               //DONE
    LINT operator+(const LINT&)const;//DONE
    LINT operator-()const;               //DONE
    LINT operator-(const LINT&)const;//DONE
    LINT operator*(const LINT&)const;//DONE
    LINT operator/(const LINT&)const;///WAITS FOR APPROVAL

    LINT& operator+=(const LINT&);//DONE
    LINT& operator-=(const LINT&);//DONE
    LINT& operator*=(const LINT&);//DONE
    LINT operator/=(const LINT&);///WAITS FOR APPROVAL
};

在第3行而不是赋值optor ctor被调用。为什么?我愿意在某些服务器上卸载整个解决方案,否则很难将所有内容都放在这里。我也可以上传视频文件。另一件事是,当我实现这个赋值optor时,我得到一个错误,这个optor已经在obj文件中?发生了什么事?

7 个答案:

答案 0 :(得分:7)

您没有=运算符,其RHS为std::string(或char*),因此,文字“3”正在构建为{{1} },然后使用您的LINT运算符进行分配。

编辑:至于代码中的第二个问题,你需要在=上调用c_str()来获取字符串的std::string缓冲区,然后同样的事情将发生在用你的文字3。

答案 1 :(得分:6)

您的赋值运算符将LINT对象作为参数,但是当您说:

a = "3";

您正在将赋值操作传递给字符串文字,而不是LINT对象。编译器需要创建赋值操作可以使用的LINT对象,因此它调用以const char *作为参数的构造函数来执行此操作。

答案 2 :(得分:4)

以下构造函数:

LINT(const char * = 0);

将被调用为文字赋值“3”,因为它充当隐式构造函数调用。如果您希望避免这种情况,请在构造函数前加上“显式”限定符。

还为您希望分配的任何类型添加赋值运算符,而不进行隐式构造。

答案 3 :(得分:2)

因为没有指定可以使用的赋值运算符。你可能需要这样的东西: LINT& operator=(const char*);

答案 4 :(得分:2)

构造函数

LINT(const char* = 0);

充当转换构造函数,用于char*的分配(例如LINT a = "3")。如果将LINT对象分配给另一个LINT对象,则仅调用=() - 运算符。

LINT a;
LINT& b = a
LINT& c = LINT("4");

上面的表达式会调用您的=() - 运营商。

答案 5 :(得分:1)

LINT& operator=(const LINT&); 没有LINT& operator=(const char *); 但是有很多隐含的因素。 因此会调用imptort ctor。

答案 6 :(得分:0)

LINT类定义的唯一赋值运算符是复制赋值运算符LINT& operator=(const LINT&)。因此,在第3行,当您尝试将静态C样式字符串(const char [])分配给LINT对象时,编译器会识别出没有匹配的赋值运算符。

但是,允许编译器使用一个用户定义的类型转换来使调用工作。它选择LINT(const char *)构造函数将const char []转换为LINT对象,然后在它为右侧创建的临时LINT对象上调用复制赋值运算符。

您可以通过提供LINT& operator=(const char*)赋值运算符来扩充复制赋值运算符来避免此临时性。