struct Dot
{
double x, y;
//====================构造函数===================
Dot () {}
Dot (double x, double y) : x(x), y(y) {}
//============================================
//==================运算符重载===================
Dot operator + (Dot a)
{
return Dot (x + a.x, y + a.y);
}
Dot operator - (Dot a)
{
return Dot (x - a.x, y - a.y);
}
//============================================
} d[200];
上述结构体记录平面上一个点坐标,并且重载了加减运算符可以类比向量加减法则直接对两个坐标进行运算。
这几个函数只是构造函数和运算符重载的其中一种实现方式。
先说构造函数吧,一开始不能理解第一句话存在的意义,感觉什么东西都没有写嘛。。
但是编译的时候会提示最后一行声明d[200]时有错误:
no matching function for call to 'Dot::Dot()'
为什么以前声明的时候都不会报错呢?
因为以前没有在类(C++里面类和结构体很相似,就不作区分了)里面定义构造函数,所以在声明一个成员时会自动调用默认构造函数,但是这里已经定义了一种构造函数 Dot (double x, double y) 了,直接声明 d[200]就有歧义了(我就权且这么理解了。。或者是不会再去调用默认构造函数了?),所以要自己显示定义一个空的构造函数来初始化成员。
第二句构造函数还有一种形式:
Dot (double g, double h)
{
x = g;
y = h;
}
具体区别。。以后再深入学习使用类了再补充吧。。
再来说说运算符重载。
上述代码中的运算符重载是放在类里面的,是作为类的一部分定义的(貌似是叫做友元函数?)。
其实运算符重载可以是完全独立于类的。
就像下面这样就能实现运算符重载:
Dot operator + (Dot a, Dot b)
{
return Dot (a.x + b.x, a.y + b.y);
}
可以通过传输地址重载单木运算符,其他的关于类内外重载运算符的区别。。同样有待补充。。这些东西先用着吧、