struct
C++struct支持数据类型为简单类型的隐式转换,包括stl中一些容器。
#include <iostream>
#include <string>
struct Widget {
int x;
std::string str;
};
int main() {
Widget w1;
w1.x = 10;
w1.str = "hello";
Widget w2 = w1;
std::cout << w2.x << " " << w2.str << std::endl;
return 0;
}
在使用==
!=
的时候需要重写运算符。
#include <iostream>
#include <string>
struct Widget {
int x;
int y;
bool operator == (const Widget& widge);
bool operator != (const Widget& widge);
};
bool Widget::operator == (const Widget& widget) {
return x == widget.x && y == widget.y;
}
bool Widget::operator != (const Widget& widget) {
return x != widget.x || y != widget.y;
}
int main() {
Widget w1;
w1.x = 10;
w1.y = 20;
Widget w2;
w2.x = 0;
w2.y = 10;
if (w1 == w2) {
std::cout << "w1==w2" << std::endl;
}
if (w1 != w2) {
std::cout << "w1!=w2" << std::endl;
}
return 0;
}
带const使用struct要小心。
比如正常的
#include <iostream>
#include <string>
struct Widget {
int x;
int y;
bool operator == (const Widget& widge);
bool operator != (const Widget& widge);
};
bool Widget::operator == (const Widget& widget) {
return x == widget.x && y == widget.y;
}
bool Widget::operator != (const Widget& widget) {
return x != widget.x || y != widget.y;
}
static constexpr Widget NullWidget = {0, 0};
int main() {
Widget w1;
w1.x = 10;
w1.y = 20;
Widget* widget_ptr = nullptr;
Widget w2 = (widget_ptr) ? *widget_ptr :NullWidget;
if (w1 == w2) {
std::cout << "w1==w2" << std::endl;
}
if (w1 != w2) {
std::cout << "w1!=w2" << std::endl;
}
return 0;
}
有时候会出现这个错误
passing '' as 'this' argument discards qualifiers [-fpermissive]
这个时候需要将函数设置为const的
#include <iostream>
#include <string>
struct Widget {
int x;
int y;
bool operator == (const Widget& widge) const;
bool operator != (const Widget& widge) const;
};
bool Widget::operator == (const Widget& widget) const{
return x == widget.x && y == widget.y;
}
bool Widget::operator != (const Widget& widget) const{
return x != widget.x || y != widget.y;
}
static constexpr Widget NullWidget = {0, 0};
void TestConstWidget(const Widget* widget) {
Widget w1;
w1.x = 10;
w1.y = 20;
const Widget& w2 = (widget) ? *widget :NullWidget;
if (w1 == w2) {
std::cout << "w1==w2" << std::endl;
}
if (w1 != w2) {
std::cout << "w1!=w2" << std::endl;
}
}
int main() {
Widget w;
w.x = 1;
w.y = 2;
TestConstWidget(&w);
return 0;
}
注意
bool Widget::operator != (const Widget& widget) const
和bool Widget::operator != (const Widget& widget)
是不同的函数,函数签名不同。