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
了?