C++ 中的结构体结合了类,于是就有很多很有意思的写法。
构造函数
1 | struct teamS { |
重载 [] 使结构变为类似于数组的形式
起初是看到 map 在这么用,试了一下,发现没有报错,有点香。
对一维数组重载,记得使用引用 &。
1 | struct triple |
对二维数组的重载,使用的是指针 *,就不需要引用了。
1 | struct matrix |
运算符重载
C++引入了运算符重载,并有以下规则:
- 只能重载已有的运算符,已有的少部分也不能重载(
::、#等); - 重载以后的优先级不变。
运算符重载的格式为:
1 | class Complex |
但是无法使用 c1 = 1 + c2,因为重载的 + 是属于 Complex 类的,而不是 int。
正确的使用方法是:把该重载声明为 Complex 类以外的函数(如果函数需要访问 Complex 的 private 成员,注意使用友元关键字)
1 | friend Complex operator + (Complex num, Complex C) {/* */} |
这样,编译器就能愉快的把 int 转换为 Complex 了。
下面写几个值得一提的特殊的运算符重载。
类型转换函数
把 int 当作一个一元操作符可还行。
1 | struct teamS { |
重载 ++ 自增运算符
我写类的时候,重载了 ++ 运算符,然后 date++ VS 报错。查了以后,才意识到,++ 分了前置/前缀形式和后置重载/后缀形式。
1 | class A |
注意:
- 为了区分前后,用
++()表示前自增,用++(int)后自增。 - **前自增应该返回引用
A&**,因为按照前自增的标准定义,应该支持++++a的语法,而且两次前自增都应该是对 a 对象的自身操作。如果返回A类型,那第二次前自增调用的是临时对象的前自增操作,和定义也不同; - 后自增应该返回
const,这可以防止形如a++++的用法。不能返回const &,因为实现里面返回的是临时的temp,不能返回临时的指针。所以就涉及到了复制构造(Copy Construction)的问题了额。还是多用前自增吧…… - 一般通过前自增操作来实现后自增操作符函数。
重载等于 =
重载 = 和拷贝构造函数很相似,于是放在拷贝构造函数一节。
从基类派生出结构
有点不可信,但确实可以。
In C++, a structure’s inheritance is the same as a class except the following differences: When deriving a struct from a class/struct, the default access-specifier for a base class/struct is public. And when deriving a class, the default access specifier is private.2009年6月11日
– Struct inheritance in C++ - Stack Overflow
结构和类的区别真就只有 private 和 public 了?