C++ 构造函数被调用了两次

C++ 构造函数被调用了两次,c++,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 {

代码:

//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
};
//文件main.cpp
LINT a=“12”;
皮棉b=3;
a=“3”//为什么这一行调用CTOR?
std::string t=“1”;
//皮棉a=t//错误:从字符串到LINT没有合适的转换。你不应该这样做吗?
//文件LINT.h
#布拉格语一次
#包括“线头代表h”
类皮棉
{
私人:
typedef LINT_rep value_type;
常量值\u类型*我的\u数据\u;
样板
无效初始值(常数T&);
公众:
LINT(常量字符*=0);
LINT(const std::string&);
皮棉(常量皮棉&);
皮棉(恒长);
LINT&运算符=(常量LINT&);
虚拟线头(空隙);
LINT运算符+()常量;//完成
LINT运算符+(常量LINT&)const;//完成
LINT运算符-()常量;//完成
LINT运算符-(const LINT&)const;//完成
LINT运算符*(const LINT&)const;//完成
LINT运算符/(const LINT&)const;///等待批准
LINT&运算符+=(常量LINT&);//完成
LINT&运算符-=(常量LINT&);//完成
LINT&运算符*=(常量LINT&);//完成
LINT操作符/=(const LINT&);///等待批准
};

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

以下构造函数:

LINT(常量字符*=0)

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


还可以为您希望分配的任何类型添加分配运算符,而无需隐式构造。

,因为没有指定可使用的分配运算符。您可能需要以下内容:
LINT&运算符=(常量字符*)

您没有一个
=
运算符,它的RHS值为
std::string
(或
char*
),因此,文本“3”被构造为
LINT
,然后使用
=/code>运算符进行赋值


编辑:对于代码中的第二个问题,您需要调用
std::string
上的
c_str()
来获取字符串的
char*
缓冲区,然后与您的literal 3发生相同的事情。

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

a = "3";

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

LINT&operator=(const LINT&)
没有
LINT&运算符=(常量字符*)
但也有许多隐含的因素。

因此将调用隐式运算符。

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

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

您可以通过提供
LINT&operator=(const char*)
assignment操作符来增加复制赋值操作符,从而避免这种临时性

构造函数

LINT(const char* = 0);
充当转换构造函数,用于分配到
char*
(例如
LINT a=“3”
)。仅当将一个LINT对象指定给另一个LINT对象时,才会调用
=()
-运算符

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

上面的表达式将调用您的
=()
-运算符。

您可以发布“=”运算符的实现吗?什么是
LINT
?为什么
LINT a=“12”
#pragma once
#include
之前?无法从任何函数中更改变量。@Alexey Malistov很抱歉,我的错误我应该提到,这段代码来自两个不同的文件。去修理它;我忍不住想让你的头像图片在图标化版本中看起来很有趣:)我建议你仔细阅读
explicit
,在你不需要的时候防止这些类型的转换。@了解我了解你:错。编译器将只生成一个复制赋值运算符(即RHS与类本身的类型相同的运算符(模常量&)).Conversion赋值运算符从来都不是由编译器生成的。@Drew Hall我更正了。你完全正确。我错了。没有考虑到正在应用转换。那么不能将字符串转换为LINT呢?以及为什么我在尝试实现运算符=()时出错?@在花了一段时间之后,我决定简单一点,我刚刚创建了新的解决方案,我复制了这些文件(*.h&*.cpp),并且惊奇地发现,不能将字符串转换为LINT的问题不再存在,运算符=().@Neil我应该理解你对我问题的回答意味着我们从现在开始很冷静,还是你刚刚犯了一个错误,没有意识到是谁的问题?