C++中的问题.

[复制链接]
查看11 | 回复3 | 2006-11-16 09:08:54 | 显示全部楼层 |阅读模式
在cppview创刊号,《c++程序的设计和演化》等等一些地方都有讨论。
这里是其中一个实现。大部分实现都是按照这个思路,细节上或者具体处理上有一些不同
#include "stdafx.h"
class NonDerivableHelper
{
NonDerivableHelper(){}
friend class NonDerivable;
};
#ifdef NDEBUG
#define FINAL_CLASS
#else
#define FINAL_CLASS : private virtual NonDerivableHelper
#endif
class NonDerivable FINAL_CLASS
{
//... some code here
};
class SomeClass : public NonDerivable
{
SomeClass(){};//编译无法通过
//...
};
int main(int argc, char* argv[])
{
return 0;
}
回复

使用道具 举报

千问 | 2006-11-16 09:08:54 | 显示全部楼层
下面这些操作符不能重载"&&" ,"||" , ",", ".", ".*", "::" ,"?:"new
delete
sizeof
typeidstatic_castdynamic_castconst_castreinterpret_cast下列操作符你可以重载operator new
operator deleteoperator new[]
operator delete[]+
- * / % ^
& |
~!
=
+= -= *= /= %=^=&=|=> >>==&&||++ --
, ->*->()[]原因例如:if (expression1 && expression2) ...
对于编译器来说,等同于下面代码之一:if (expression1.operator&&(expression2)) ...// when operator&& is a member functionif (operator&&(expression1, expression2)) ... // when operator&& is a global function
这好像没有什么不同,但是函数调用法与短路求值法是绝对不同的。首先当函数被调用时,需要运算其所有参数,所以调用函数functions operator&& 和 operator||时,两个参数都需要计算,换言之,没有采用短路计算法。第二是C++语言规范没有定义函数参数的计算顺序,所以没有办法知道表达式1与表达式2哪一个先计算。完全可能与具有从左参数到右参数计算顺序的短路计算法相反。
因此如果你重载&&或||,就没有办法提供给程序员他们所期望和使用的行为特性,所以不要重载&&和||。
回复

使用道具 举报

千问 | 2006-11-16 09:08:54 | 显示全部楼层
C++中,只有四个运算符不能重载:点号运算符: .作用域运算符: ::三目运算符: ?:指向成员的指针运算符: .*
回复

使用道具 举报

千问 | 2006-11-16 09:08:54 | 显示全部楼层
简单的讲.号::号*号 ?号 他们都不能被重载的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行