内部类型及指针的缺省初始化

cxjddd 2003-05-25 02:46:26
在写template时想到的,写出来,给大家参考一下。
一般,C++可以这样初始化一个内部类型:
int i(0); // OK,变量
double r(0);// OK,变量
但是不能这样:
int i(); // OK,^?^,函数
double r(); // OK,^?^,函数
当然,可以这样:
int i=int(); // OK,变量,i==0
double r=double(); // OK,变量,r==0.0
也可以带参数:
int i=int(1); // OK,变量,i==1
double r=double(1); // OK, 变量,r==1.0

普通指针:
typedef int* IntPtr;
IntPtr p(0); // OK,变量
IntPtr p=IntPtr(); // OK,变量
IntPtr p=IntPtr(0); // OK,变量
直接定义普通指针:
int* p(0); // OK,变量
int* p=(int*)(); // 不行
int* p=(int*)(0); // OK,变量

函数指针:
typedef int (*FunPtr)();
FunPtr f1(main); // OK,变量 //假定int main();
FunPtr f2=FunPtr(); // OK,变量
FunPtr f2=FunPtr(main); // OK,变量
直接定义函数指针:
int(*f)()(main); // OK,f==main
int(*f)()=(int(*)())(); // 不行了!!
int(*f)()=(int(*)())(main); // OK,f==main,太难看了
...全文
65 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
idontlikenickname 2003-06-06
  • 打赏
  • 举报
回复


好帖!收藏~~~

cxjddd 2003-06-06
  • 打赏
  • 举报
回复
不能说“一切事物都是对象”。我认为内置的类型只是可以用一些类似对象的东西而已,不然STL就有麻烦了。
cxjddd 2003-06-06
  • 打赏
  • 举报
回复
谢谢大家,我一般只用到static_cast, reinterpret_cast我还不没有记住:)
ckacka 2003-05-25
  • 打赏
  • 举报
回复
我来补充几点

int* p=static_cast<int*>(100);
是一种“静态的转化”,他有严格的类型检查,所以类似
int* p=(int*)(100);
这样的代码是不能通过编译的

不过C++在不提倡一些诸如
int* p=(int*)(100);
的写法外,仍然为自己提供了这样的转化,形如
int* p=reinterpret_cast<int*>(100);
他明确告诉编译器,程序员知道这样转化可能带来的不安全的因素
关于转化的更多解释请参考ISO/IEC 14882:1998(E) 5.2

至于
int i(0); // OK,变量
主要是符合“一切事物都是对象”这个观点,因为C++中把类型(无论是内置,还是扩展)看作对象,所以这样的初始化操作总是允许的,所以从semantics上来讲
int i=int(); // OK,变量,i==0
这样的问题就是一个构造函数的默认参数的问题

但是,指针不是内置类型,也无法当作扩展类型,因为他的应用依赖于一个取值运算符“*”
IntPtr p=IntPtr(); // OK,变量
可以通过编译,也确实把指针初始在0地址上,是因为编译器就把他当作一个对象,而且这个对象有一个int*的成员,在加上C++中,一个对象总是有四个内置的基本操作,也就是说,在用户没有显式地申明这几个基本操作的情况下,对象的默认操作理论上是默认存在的,只不过根据实际情况而真实的显现出来,再加上编译器总是喜欢不厌其烦地为我们的错误找到一个合理的解释(实在找不到才报错),所以这句代码被编译器自动合成了一个缺省的构造函数,而且默认参数是0

int* p=(int*)(); // 不行
也就是编译器无法把指针当作对象,
不过智能指针很好的解决了这一系列问题

至于函数指针的问题就很简单直接,我也就不赘述了


************************
上面一点见解,可能也有问题,还请高人指正
积木 2003-05-25
  • 打赏
  • 举报
回复
忘了说了,这些在Dev-C++4.9.8.0下通过。

还有一个有趣的东西。以前我想用static_cast把一个数转换成指针,象
int* p=static_cast<int*>(100);
编译没有通过。但是现在我可以这样了:
int* p=(int*)(100);

这个不应该用static_cast转化,应该用 reinterpret_cast 转化
当然,将一个整形做这种转化通常是没有意义,也是不必要的
ghtsao 2003-05-25
  • 打赏
  • 举报
回复
对了,把普通类型当作class那样来用,楼主多给我放点分就对了。
fishyqd 2003-05-25
  • 打赏
  • 举报
回复
好贴,学习ing
晨星 2003-05-25
  • 打赏
  • 举报
回复
好帖好帖,一定要提交FAQ哦。
cxjddd 2003-05-25
  • 打赏
  • 举报
回复
忘了说了,这些在Dev-C++4.9.8.0下通过。

还有一个有趣的东西。以前我想用static_cast把一个数转换成指针,象
int* p=static_cast<int*>(100);
编译没有通过。但是现在我可以这样了:
int* p=(int*)(100);

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧