2 eve dark Eve_dark 于 2014.12.21 12:31 提问

c++声明时,如何确认是变量还是函数
c++

在c++中,声明一个变量或者函数是怎么确定的,例如下面的代码:
class A;
A f();
可以理解为创建一个A类的f对象,使用默认构造函数。
还可以理解为声明一个返回为A 类型,传入参数为空的f函数。
这个貌似一般都不会出错,但是我用模板时编译器就把两者搞混了。
谁能解释一下这个语言规则到底是怎样?

6个回答

nokiaguy
nokiaguy   Rxr 2014.12.21 13:46
已采纳

楼主不是问的这个意思。问的是如果遇到A f()这种情况,C++编译器会认为f是变量还是函数声明。你的将f变成了成员函数了。 实际上,这种情况,C++会认为
f是函数,不信用sizeof(f),看看会不会报错,而且报的什么错。如果要创建对象,可以用A f = A(); 这样就会认为f是变量了。

Eve_dark
Eve_dark 申请新对象的时候,可以直接 new A(),就想着直接声明也可以的。
3 年多之前 回复
caozhy
caozhy   Ds   Rxr 2014.12.21 12:37

你可以这么写
A ::f();
定义函数

enpersuen
enpersuen   2014.12.21 17:22

()是操作符,不能用在函数声明中的,所以编译器只能认为这个是返回A类的一个函数;
比如[]符号,既可以用在声明中,又可以用做操作符,这样的话,

A f[]; 

编译器就会理解为声明
并且,除非是在函数声明的参数列表里,编译器还会报错.

FocusOnACE
FocusOnACE   2014.12.29 20:39

函数也可以是变量啊。
下面就是c++代码

auto x = { return i * i; };

auto y = x (3);

FocusOnACE
FocusOnACE   2014.12.29 20:40

函数也可以是变量啊。
下面就是c++代码

auto x = { return i * i; };

auto y = x (3);

FocusOnACE
FocusOnACE   2014.12.29 20:42

晕死,发出去的内容跟写的内容不 一致。

  auto x = [](int i) { return i+4; };
    auto y = x (3);

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
struct结构在声明时对其中的某一项进行初始化
这个方法巧妙地运用了C++对于Struct功能的拓展。 灵感来源于下:http://blog.sina.com.cn/s/blog_48f587a80100k630.html C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能。 struct能包含成员函数吗? 能! struct能继承吗? 能!! struc
C语言中定义与声明的本质区别:有无内存分配
变量在定义时被分配内存,并且变量可以指定一个初始化的值。变量只能在这个程序中定义一次。声明在该程序中指定了变量的类型和名称。定义也是一种声明:当我们定义一个变量时,我们声明了它的名字和类型。我们也可以通过使用extern关键字来声明一个变量的名字而不用定义。   一个声明可以是加extern前缀的并包含了目标的类型和名称,如:   点击(此处)折叠或打开   extern int i; //
C/C++笔试系列--默认参数在哪指定?函数声明还是定义?
  经典C++笔试题解析8--默认参数在哪指定?函数声明还是定义?  Sailor_forever sailing_9806@163.com 转载请注明http://blog.csdn.net/sailor_8318/archive/2008/11/19/3337236.aspx 成员函数参数的默认值是在声明里赋,还是在定义里?class CAbc{    
变量初始化规则以及声明和定义
当我们定义没有初始化式的变量的时候,系统有时候会帮我们初始化变量.系统提供什么样的值取决于变量的类型,也取决于变量定义的位置.内置类型变量的初始化.内置类型变量是否自动初始化取决于变量定义的位置.在函数体外定义的变量都初始化为0,在函数体里面定义的内置类型变量不进行自动初始化 除了用作赋值操作符的左操作数,未初始化变量用作任何其他用途都是没有定义的.未初始化变量引起的错误难以发现. 
关于C语言static定义函数类型的具体解释
内部函数和外部函数       函数一旦定义后就可被其它函数调用。   但当一个源程序由多个源文件组成时,   在一个源文件中定义的函数能否被其它源文件中的函数调用呢? 为此,C语言又把函数分为两类:   一、内部函数 static     如果在一个源文件中定义的函数只能被本文件中的函数调用,而不能被同一源程序其它文件中的函数调用,   这种函数称为内部函   数。定义内部函数的一般形式是:
Fortran学习笔记2(变量声明)
常数的申明方式 变量初始化 等价申明EQUIALENCE 类型转化 自定义类型 KIND用法
Fortran 声明的注意事项
implicit none 让每个变量必须显示声明。parameter 常数声明 常数声明的两种方法 program parameter implicit none real a real , parameter :: b = 3.15 parameter(a=3.14) write(*, '(3x, f5.2)') a write(*, '(3x,
C语言声明,定义,赋值,初始化
摘自:http://blog.csdn.net/zlhy_/article/details/8442573 我想不管是现在学C系语言的人,还是学习Java等以及其他语言的人最初的入门语言应该都是C语言吧。C语言的难易程度是否适合作为编程入门语言我恐怕没有这个能量来论述一番。我想说的是C语言中的这几个名词(RT)自从最开始出现就一直萦绕在耳边,停留在口头上,但却又总是分不清,道不明的。最近
C/C++语言变量声明内存分配
一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。程序结束时由编译器自动释放。 2、堆区(heap) — 在内存开辟另一块存储区域。一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 3、全局
作用域和static、const、auto、extern关键字
作用域:             作用域是一个标识符在程序正文中有效的区域,它包含有函数原型作用域、局部作用域(块作用域)、类作用域和命名空间作用域。             1、函数原型作用域             函数原型声明时形参的作用范围就是函数原型作用域。             例如:int area (int x,int y)             2、局部作用域(块作