在代码中:
//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文件中?发生了什么事?
答案 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*)
赋值运算符来扩充复制赋值运算符来避免此临时性。