如何重载用于初始化新对象的运算符=?
How to overload operator= used in initializing a new object?
我是 C++ 的新手,我想了解 Class 的工作原理。我遇到这个问题给自己做了一个简单的例子。我的 class 有一个 private 属性 num
并且我试图用这样的 int 初始化它: Number one = Number::ONE;
但它不起作用。但是,当我这样做时它工作正常:Number one; one = Number::ONE
。我更喜欢第一个选项。请帮忙!
这是我的完整代码:
class Number {
public:
enum {ONE, TWO, THREE, FOUR};
Number();
void print() const;
Number& operator=(int);
private:
int num;
};
Number& Number::operator=(int n) {
num = n;
return *this;
}
int main(int argc, const char * argv[]) {
Number n = Number::ONE; // doesn't work :(
n.print();
return 0;
}
Number::Number() {
num = 0;
}
void Number::print() const {
cout << num << endl;
}
在 C++ 中,当您编写
Number one = Number::ONE;
编译器将不会使用赋值运算符来初始化one
。 operator=
函数仅在您有一个要重新分配新值的现有对象时调用。相反,在这种情况下,编译器会尝试调用 转换构造函数 ,该构造函数接受等式右侧类型的对象。由于您没有定义这样的构造函数,因此会出现编译器错误。
一种方法是这样的:
class Number {
public:
Number(int value); // <-- Conversion constructor
...
};
Number::Number(int value) {
num = value;
}
现在,您在此处提供的代码将可以正确编译。
您可能想阅读一下复制构造函数、赋值运算符、转换构造函数和转换赋值运算符,因为它们是常规 C++ 中比较棘手的部分之一,并且经常使人们从基本 C++ 过渡到更多中级语言技巧。
您没有重载构造函数以将整数作为参数,这就是您收到错误的原因:
class Number
{
public:
enum {ONE, TWO, THREE, FOUR};
Number(int x) : num(x){}
void print() const;
Number& operator=(int);
private:
int num;
};
我是 C++ 的新手,我想了解 Class 的工作原理。我遇到这个问题给自己做了一个简单的例子。我的 class 有一个 private 属性 num
并且我试图用这样的 int 初始化它: Number one = Number::ONE;
但它不起作用。但是,当我这样做时它工作正常:Number one; one = Number::ONE
。我更喜欢第一个选项。请帮忙!
这是我的完整代码:
class Number {
public:
enum {ONE, TWO, THREE, FOUR};
Number();
void print() const;
Number& operator=(int);
private:
int num;
};
Number& Number::operator=(int n) {
num = n;
return *this;
}
int main(int argc, const char * argv[]) {
Number n = Number::ONE; // doesn't work :(
n.print();
return 0;
}
Number::Number() {
num = 0;
}
void Number::print() const {
cout << num << endl;
}
在 C++ 中,当您编写
Number one = Number::ONE;
编译器将不会使用赋值运算符来初始化one
。 operator=
函数仅在您有一个要重新分配新值的现有对象时调用。相反,在这种情况下,编译器会尝试调用 转换构造函数 ,该构造函数接受等式右侧类型的对象。由于您没有定义这样的构造函数,因此会出现编译器错误。
一种方法是这样的:
class Number {
public:
Number(int value); // <-- Conversion constructor
...
};
Number::Number(int value) {
num = value;
}
现在,您在此处提供的代码将可以正确编译。
您可能想阅读一下复制构造函数、赋值运算符、转换构造函数和转换赋值运算符,因为它们是常规 C++ 中比较棘手的部分之一,并且经常使人们从基本 C++ 过渡到更多中级语言技巧。
您没有重载构造函数以将整数作为参数,这就是您收到错误的原因:
class Number
{
public:
enum {ONE, TWO, THREE, FOUR};
Number(int x) : num(x){}
void print() const;
Number& operator=(int);
private:
int num;
};