C++ 重载运算符、构造函数等
C++ overloading operators,constructors and more
我创建了自己的四种方法来将字符串作为数字处理:
std::string addStrings(std::string,std::string);
std::string subtractStrings(std::string,std::string);
std::string multiplyStrings(std::string,std::string);
std::string divideStrings(std::string,std::string);
然后我决定创建大数的 class(称为 bin)。我对复制构造函数和复制赋值运算符有点陌生,所以,我需要你的帮助来修复我的代码:
class bin{
private:
std::string value;
public:
bin(){}
bin(const char* v1){
value = v1;
}
bin(std::string v1){
value = v1;
}
bin(const bin& other){
value = other.value;
}
bin& operator=(const bin& other){
value = other.value;
return *this;
}
bin& operator=(const char* v1){
value = v1;
return *this;
}
std::string getValue() const{
return value;
}
friend std::ostream& operator<<(std::ostream&,bin&);
};
std::ostream& operator<<(std::ostream& out,bin& v){
out << v.value;
return out;
}
bin operator+(bin& value1,bin& value2){
return bin(addStrings(value1.getValue(),value2.getValue()));
}
bin operator-(bin& value1,bin& value2){
return bin(subtractStrings(value1.getValue(),value2.getValue()));
}
bin operator*(bin& value1,bin& value2){
return bin(multiplyStrings(value1.getValue(),value2.getValue()));
}
bin operator/(bin& value1,bin& value2){
return bin(divideStrings(value1.getValue(),value2.getValue()));
}
为什么这有效:
bin d = a/c;
std::cout << d << std::endl;
而这不是:
std::cout << a/c;
(a 和 c 之前声明过)。运算符链接也不起作用,例如:
bin d = a * b + d;
投掷:
no match for operator* (operands are bin and bin).
谢谢!
在这些运算符中:
operator<<
operator+
operator-
operator*
operator/
你应该选择 const bin&
而不是 bin&
。否则您的函数将无法将临时参数作为参数。
而且,当您链接运算符时,每个独立运算符返回的值都是临时的。
首先,由于您的 class 只有一个 std::string
成员,因此您不需要实现复制构造函数或赋值运算符,因为默认编译器提供的那些将适合您。
其次,你们所有的操作员都应该将那里的参数作为 const &
以便他们可以捕获临时对象。这也允许您将运算符链接在一起,如 foo + bar + cat
我创建了自己的四种方法来将字符串作为数字处理:
std::string addStrings(std::string,std::string);
std::string subtractStrings(std::string,std::string);
std::string multiplyStrings(std::string,std::string);
std::string divideStrings(std::string,std::string);
然后我决定创建大数的 class(称为 bin)。我对复制构造函数和复制赋值运算符有点陌生,所以,我需要你的帮助来修复我的代码:
class bin{
private:
std::string value;
public:
bin(){}
bin(const char* v1){
value = v1;
}
bin(std::string v1){
value = v1;
}
bin(const bin& other){
value = other.value;
}
bin& operator=(const bin& other){
value = other.value;
return *this;
}
bin& operator=(const char* v1){
value = v1;
return *this;
}
std::string getValue() const{
return value;
}
friend std::ostream& operator<<(std::ostream&,bin&);
};
std::ostream& operator<<(std::ostream& out,bin& v){
out << v.value;
return out;
}
bin operator+(bin& value1,bin& value2){
return bin(addStrings(value1.getValue(),value2.getValue()));
}
bin operator-(bin& value1,bin& value2){
return bin(subtractStrings(value1.getValue(),value2.getValue()));
}
bin operator*(bin& value1,bin& value2){
return bin(multiplyStrings(value1.getValue(),value2.getValue()));
}
bin operator/(bin& value1,bin& value2){
return bin(divideStrings(value1.getValue(),value2.getValue()));
}
为什么这有效:
bin d = a/c;
std::cout << d << std::endl;
而这不是:
std::cout << a/c;
(a 和 c 之前声明过)。运算符链接也不起作用,例如:
bin d = a * b + d;
投掷:
no match for operator* (operands are bin and bin).
谢谢!
在这些运算符中:
operator<<
operator+
operator-
operator*
operator/
你应该选择 const bin&
而不是 bin&
。否则您的函数将无法将临时参数作为参数。
而且,当您链接运算符时,每个独立运算符返回的值都是临时的。
首先,由于您的 class 只有一个 std::string
成员,因此您不需要实现复制构造函数或赋值运算符,因为默认编译器提供的那些将适合您。
其次,你们所有的操作员都应该将那里的参数作为 const &
以便他们可以捕获临时对象。这也允许您将运算符链接在一起,如 foo + bar + cat