混沌 In C++::是类型?还是函数调用?

原创 2004年06月29日 05:22:00

难度:

文前提醒:看这篇文章时须家长陪同并引导,以免走火入魔

 

先看看下面的代码?   

struct A

{

     A(){}

};

 

template<typename T>

void func(T() )

{}

 

int main()

{

   A a( A() );    //(1), OK

   func( A() );   //(2), Wrong

   a = 5;          //(3), Wrong

}

 

(1) A  a( A() ); 是什么意思?

在这里是用A()创建一个对象,然后初始化对象a吗?这里真正的语a是一个参数为返回A对象的无参函数指针的函数,所以它的真面目应该是A a( A (*)() ),其中的A()是个函数类型,在实际作参数时会退化为一个A(*)()指针 。而这句仅仅起到声明函数的作用。重点就在于A()并不是创建对象,而是一个无参的、返回为A的函数类型

 

(2) func( A() ); 为什么会出错呢?

这里虽然函数模板func的参数同样也是一个函数类型,那为什么会出错呢? 其实在这里A()就不是一个函数类型了,而是创建一个匿名对象。那么这个函数即成了 void func( A ),而原本的函数模板func 类型是void ( T (*)() ),很明显参数类型不匹配。

 

(3) a = 5; 现在应该没有任何疑问了

int 传递给 A ()( A (*)() ),地球人都知道是错的。

 

千万别走火入魔!

是什么导致了(1)(2)中的A()表现出不同的语义呢?

答:在这里的 A() 就具有二义性:它即可以解释为新创建的类 A 的一个临时对象(在此过程中要调用 A 的构造函数),也可以解释为一种函数类型声明:其返回值为A类型的对象,函数参数为空。如果是前种解释,则 a 为类 A 的一个对象;如果是后一种,则整句就是一个函数声明:声明了一个函数 a,其返回值类型为 A,函数参数(省略了参数名。对于函数声明这样做是可以的)是上述的一个函数类型。到底是前一种还是后一种解释取决于它所在的语义环境。

 

更多

struct A

{

     A(int ){}

};

 

A a(A(1)); 在这里A(1) 就不可能是“类型”了,因为其中有个1,而A(1)就成了一个转换函数调用形式,所以A(1)这里是调用的A(int)

 

非常感谢whyglinux,为本文指出错误并作出修改。

//The End

 

 

理解 《混沌 In C++::是类型?还是函数调用?》

原文及评论见: 《混沌 In C++::是类型?还是函数调用?》http://blog.csdn.net/Jinhao/archive/2004/06/29/29021.aspx   看了原文的评论,...
  • Muf
  • Muf
  • 2004年07月02日 10:51
  • 2507

混沌时间序列的几个例子

混沌时间序列的例子:虫口模型、洛伦兹方程(天气预报模型)、CHne's吸引子 奇怪吸引子、吸引子 几个例子的MATLB程序,可以看到混沌序列的样子...
  • ldj1208
  • ldj1208
  • 2016年07月12日 23:01
  • 2029

混沌方法的数字图像加密

Abstract:目前混沌系统与加密技术相结合是现如今最热门的一个课题,虽然有大量的加密算法面世,但是这些加密算法并不成熟,仍然需要进一步的研究。本文采用像素位置置乱变换和像素值替代变换相结合的加密思...
  • hlx371240
  • hlx371240
  • 2015年05月09日 20:01
  • 5071

常见C/C++函数调用规范

例子不太好举啊,其实就是在函数声明的时候多加一个关键字,比如很多API函数就是象这样声明的: int   WINAPI   MessageBoxA(HWND,LPCSTR,LPSTR,UINT)...
  • pcliuguangtao
  • pcliuguangtao
  • 2010年12月03日 22:22
  • 1211

混沌系统解释

混沌系统解释
  • wik_123
  • wik_123
  • 2013年01月05日 11:09
  • 11316

函数调用运算符

如果类重载了函数调用运算符,则我们可以像使用函数一样使用该类的对象。因为这样的类同时也能存储状态,所以与普通函数相比它们更加灵活。 函数调用运算符必须是成员函数。一个类可以定义多个不同版本的调用运算...
  • tengyft
  • tengyft
  • 2015年04月21日 15:37
  • 1012

混沌学

基本介绍   混沌是指发生在确定性系统中的貌似随机的不规则运动,一个确定性理论描述的系统,其行为却表现为不确定性--不可重复、不可预测,这就是混沌现象。进一步研究表明,混沌是非线性动力系统的固有特性...
  • bookaswine
  • bookaswine
  • 2012年08月05日 09:17
  • 2670

C++中 引用符&,以int&举例说明

本篇是摘抄自byteH的一篇,int&
  • robinhjwy
  • robinhjwy
  • 2017年11月26日 10:52
  • 81

混沌变换及Logistic映射

引言 : 混沌算法? 如果一个系统的演变过程对初始的状态十分敏感,就把这个系统称为是混沌系统。 在1972年12月29日,美国麻省理工教授、混沌学开创人之一E.N.洛仑兹在美国科学发展学...
  • askfuhu
  • askfuhu
  • 2011年10月19日 20:30
  • 7554

【图像加密】图像处理之Logistic混沌序列加密

Logistic混沌序列加密。
  • hujingshuang
  • hujingshuang
  • 2015年05月14日 10:54
  • 3779
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:混沌 In C++::是类型?还是函数调用?
举报原因:
原因补充:

(最多只允许输入30个字)