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)是不同的函数,函数签名不同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值