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

问题描述

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

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

解决方案

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

解决方案二:

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

解决方案三:

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

A f[];

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

解决方案四:

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

auto x = { return i * i; };

auto y = x (3);

解决方案五:

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

auto x = { return i * i; };

auto y = x (3);

解决方案六:

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

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

时间: 2024-10-30 11:17:14

c++声明时,如何确认是变量还是函数的相关文章

android-Android在变量声明时用不用提前指定为null

问题描述 Android在变量声明时用不用提前指定为null public class MainActivity extends Activity { private ListView listview = null; private TextView textView = null; private String data = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(

c++-C++中指针声明时,int* p=0跟int *p=0哪个比较好?为什么?

问题描述 C++中指针声明时,int* p=0跟int *p=0哪个比较好?为什么? 新手学习C++时候,发现有些书写 int* p=0; 有些书写: int *p=0; 这两个有区别吗?区别在哪里?为什么会有两种写法? 还有下面的两种有区别吗?区别在哪里? int* const p=0; int const *p=0; 解决方案 第一个问题,这是定义一个int* p指针变量,(int p)<--->(int p) 这两种是等价,编译器会处理中间的空白符问题.第二个问题,int *const

php-PHP如何在echo输出时,再解析变量?

问题描述 PHP如何在echo输出时,再解析变量? 举个栗子吧: <?php $a="abc{$xxx}abc"; $xxx="666"; echo $a; ?> 以上代码不成立,不能得到预期的"abc666abc" 检查代码后,个人认为是变量"$xxx"在第一行就已经被解析了, 但是在第一行"$xxx"没有定义,所以得不到值 如何让变量在输出时再解析这个"$xxx"变量,得

局部变量与全局变量在声明时的注意事项

/* ============================================================================ Name : TestVariable.c Author : lf Version : Copyright : Your copyright notice Description : 局部变量与全局变量在声明时的注意事项 全局变量只能要常量赋值,但是局部变量可用常量和表达式以及函数赋值. 这是为什么呢? 程序在开始执行时需要用适当的值来初

Win8系统删除文件时出现确认对话框怎么设置

  Win8回收站设置是否显示删除文件确认对话框 进入Win8传统桌面中,用鼠标右键点击回收站图标,选在右键菜单中选择"属性",打开"回收站属性"设置面板. 在Win8"回收站属性"设置面板中我们可以对每一个分区设置回收站空间大小,也可以干脆选择"不将文件移到回收站中.移除文件后立即将其删除",当然,最重要的就是下方的勾选框"显示删除确认对话框". 勾选"显示删除确认对话框"并确定之后,

xfire-使用XFire框架直接生成wsdl文件时,如何改变变量名

问题描述 使用XFire框架直接生成wsdl文件时,如何改变变量名 10C 如图所示,如何才能将小写的字母改成大写?PS:在代码中我已经将所有成员变量都写成大写了,但是生成出来的name,只要有下滑先的,第一个字母都变成小写.有没有变法可以把它变成大写?

android中Bundle作为方法参数的数据类型声明时的问题

问题描述 android中Bundle作为方法参数的数据类型声明时的问题 那么Bundle的数据类型是什么,是属于String类吗,归根结底是二进制数据101010101吗 解决方案 Bundle内部就是一个map,可以存储任何对象,key是String类型 解决方案二: ArrayMap mMap = null; 解决方案三: ArrayMap<String, Object> mMap = null; 解决方案四: 本质上所有的数据在计算机里都是二进制数据. 最简单的,一个整数,比如1,就是

引入DTD定义时jsp中的变量没有替换

问题描述 引入DTD定义时jsp中的变量没有替换 编写了一个简单的jsp页面,运行后发现页面中的${pageContext.request.contextPath}等变量没有替换为相应的值,而是被直接显示,查看tomcat为jsp生成的java文件,发现这些变量没有替换为获取变量的代码,而是被当做字符串了,对比了一下能够正常运行的工程,发现唯一的区别只是web.xml的头部多定义了一个DTD文件做校验,是maven的webapp模板生成的web.xml自动生成的,如下 <!DOCTYPE web

android- java.lang.RuntimeException(已声明但未初始化的变量出错)

问题描述 java.lang.RuntimeException(已声明但未初始化的变量出错) 我的错误定位了,但是我不知道怎么改,请大神指点哈. 代码如下 switch (bundle.getInt(PushConsts.CMD_ACTION)) { case PushConsts.GET_CLIENTID: comm_frame.dev.client_id = bundle.getString("clientid"); <--这里 } 错误原因是comm_frame.dev.c