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) constbool Widget::operator != (const Widget& widget)是不同的函数,函数签名不同。

posted @ 2020-11-25 19:52  cyssmile  阅读(101)  评论(0编辑  收藏  举报