※ 引述《putumaxally (putumaxally)》之铭言:
: 大致上都能够理解 (汗
: 感谢大大让我知道我对阵列的概念一直是错的,之前在板上的文章看到 decay
: 都直接自动无视,一直坚持着阵列等同于指标(只是它永远指向第一个元素)
: 我之前有写过这种程式 http://pastebin.com/fv9DVKNW
: 这样是合法的吗(好像有看到置底的动画说多维阵列不应该这样用
如果是严格符合标准的话这个确实不行
(简单的理由是阵列存取超出范围, 但这里还有一个 aliasing 的问题在)
: reference parameter 的问题主要是看到这一篇文章 http://ppt.cc/R~t8
: "However, this statement will not even compile because every overloaded
: operator function must either be a member of a class, or have a parameter
: of type T, T &, or T const &, where T is a class or enumeration type.
: So in this particular case, using a reference is the only way to do it."
: 对于他说的只能用 reference 当参数,一直无法知道为什么,不过刚刚
: google 了一下,看到类似的文章(貌似是同一个作者),
: "Every overloaded operator function must either be a member of a class,
: or have a parameter of type T, T &, or T const &, where T is a class or
: enumeration type. In other words, every overloaded operator must accept
: an argument of a class or enumeration type. A pointer, even to an object
: of class or enumeration type, doesn't count."
: 因为第一个参数必须让 compiler 知道我是写谁的运算子多载,而指标不算(被排挤?
: 所以 enum 的运算子多载第一个参数一定要用 enum type 或 reference 对吧。
: 硬要用指标的话就会跑出这种奇怪的程式码
: day operator+(day d1, day* d2); => d1 + &d2
: PS.每次碰到C++的问题就会有一种感想,如果C是池塘,那C++就是大海,无穷无尽...
: 学校的老师(机械系)也不太敢教 C++,直接教 C#
其实问题并不只在左边 也不限制在指标
这里的规定是你不能对所有算子都是 primitive type 的 operator 做 overloading
例如你不能定义 operator + (int, int) 或 operator ! (int)
但是你可以定义 operator + (FooClass, int)
operator + (int, FooClass)
operator ! (FooClass)
FooClass::operator + (int)
FooClass::operator ! ()
因为这些式子都有至少一个算子不是 primitive type
指标本身也是一种 primitive type, 所以也受到这个限制
也就是说你不能定义 operator + (int *, int)
operator + (int *, int *)
operator + (FooClass*, int)
但你可以定义 operator + (FooClass, int *)
operator + (FooEnum&, FooEnum*)
等等
这个限制并不是“operator 的第一个参数得要非 primitive”
而是“operator 至少要有一个参数非 primitive”
我上篇回文的例子就有举了 operator == (const char *, const string &)
这就是个左边是指标, 右边是 std::string 的参考的一个 overloaded operator
因为第二个参数不是 primitive 所以这种 overload 是允许的
它会在 "someCString" == someStringObject 这个时候被呼叫到
另外要注意到的是 overloaded operator 编译器会换成对应的函式呼叫
也就是说你在 operator 的两边写上什么 传进函式的就是什么
因此如果硬要定成指标 像是你上面写的 operator + (day d1, day* d2)
那就必须要用 d1 + &d2 这样才会呼叫到那个函式