如何在 C++ 中重载 << 运算符以重复使用?
how to overload << operator in c++ to use repeatedly?
抱歉标题不明确。
最近开始学习C++,不知道如何重载运算符<<
使其可重复
这是一个示例代码。
class Foo{
private:
int* a;
int idx = 0;
public:
Foo(){a = new int[100];
void operator<< (int a) {arr[idx++] = a;}
<<
所做的基本上是class获取整数作为操作数并将其保存到arr
。(此处忽略溢出情况)
例如,a << 100
会将 100 添加到数组中。
我想做的是使 <<
运算符可以像 a << 100 << 200
一样重复使用内联
我应该如何修复上面的代码以允许此功能?
提前致谢:)
Return 对 *this
的引用。它无关紧要,但您应该使用向量来避免内存泄漏。尽量避免原始 new
class Foo{
private:
std::vector<int> a;
public:
Foo &operator<< (int a) {
arr.push_back(a);
return *this;
}
};
重载的 Foo::operator<<()
实际上有两个参数:
- 右边给出的参数
int
- 左侧的隐式
this
。
要允许链接此运算符,它应该 return 对左侧的引用(即 *this
)使其在左侧可用。
示例代码:
#include <iostream>
struct Foo {
Foo& operator<<(int a)
{
std::cout << ' ' << a;
return *this;
}
};
int main()
{
Foo foo;
foo << 1 << 2 << 3;
}
输出:
1 2 3
通过返回对实例的引用启用链接,这样您就可以调用另一个方法:
class Foo{
private:
std::vector<int> a;
public:
Foo(){}
Foo& operator<< (int a) {
arr.push_back(a);
return *this;
}
};
现在您可以调用 f << 100 << 200 << 42;
。
请注意,我用 std::vector
替换了数组以减少 Foo
损坏(除非你有一个你没有显示它正在泄漏内存的 descrutor,你可以修复它,但随后仍然复制会导致问题,简而言之,当您拥有资源时,您需要遵守 3/5 规则,使用 std::vector
会使事情变得简单得多)。
PS:其他方法同样适用。您只需在返回的 this
引用上调用另一个方法。请注意,运算符只是方法(带有一些语法糖),您也可以编写 f.operator<<(100).operator<<(200).operator<<(42);
.
抱歉标题不明确。
最近开始学习C++,不知道如何重载运算符<<
使其可重复
这是一个示例代码。
class Foo{
private:
int* a;
int idx = 0;
public:
Foo(){a = new int[100];
void operator<< (int a) {arr[idx++] = a;}
<<
所做的基本上是class获取整数作为操作数并将其保存到arr
。(此处忽略溢出情况)
例如,a << 100
会将 100 添加到数组中。
我想做的是使 <<
运算符可以像 a << 100 << 200
一样重复使用内联
我应该如何修复上面的代码以允许此功能?
提前致谢:)
Return 对 *this
的引用。它无关紧要,但您应该使用向量来避免内存泄漏。尽量避免原始 new
class Foo{
private:
std::vector<int> a;
public:
Foo &operator<< (int a) {
arr.push_back(a);
return *this;
}
};
重载的 Foo::operator<<()
实际上有两个参数:
- 右边给出的参数
int
- 左侧的隐式
this
。
要允许链接此运算符,它应该 return 对左侧的引用(即 *this
)使其在左侧可用。
示例代码:
#include <iostream>
struct Foo {
Foo& operator<<(int a)
{
std::cout << ' ' << a;
return *this;
}
};
int main()
{
Foo foo;
foo << 1 << 2 << 3;
}
输出:
1 2 3
通过返回对实例的引用启用链接,这样您就可以调用另一个方法:
class Foo{
private:
std::vector<int> a;
public:
Foo(){}
Foo& operator<< (int a) {
arr.push_back(a);
return *this;
}
};
现在您可以调用 f << 100 << 200 << 42;
。
请注意,我用 std::vector
替换了数组以减少 Foo
损坏(除非你有一个你没有显示它正在泄漏内存的 descrutor,你可以修复它,但随后仍然复制会导致问题,简而言之,当您拥有资源时,您需要遵守 3/5 规则,使用 std::vector
会使事情变得简单得多)。
PS:其他方法同样适用。您只需在返回的 this
引用上调用另一个方法。请注意,运算符只是方法(带有一些语法糖),您也可以编写 f.operator<<(100).operator<<(200).operator<<(42);
.