《C++覆辙录》——2.7:“函数还是对象”的多义性

2.7:“函数还是对象”的多义性

对象的默认初始化语句不应该写成一个空的初始化实参列表的形式,因为它会被解释成一个函数声明:

String s("Semantics, not Syntax! "); // 显式指定了用以初始化的实参
String t; // 默认的对象初始化语句⑧
String x();⑨// 一个函数声明```
⑧译者注:对象名后不带括号。
⑨译者注:这里声明了一个不带实参并返回`String`型别的函数,可能违反代码作者本意。
这是一个C++语言内廪的多义性。实践角度来说,语言“掷硬币”决定了x是一个函数声明20。请注意,该多义性问题在new表达式中并不发作:

String *sp1 = new String(); // 这里没有多义性⑩
String *sp2 = new String; // 一样的意思`
⑩译者注:出于一致性考量不推荐。
当然,第二种形式更好。因为它被更广泛地使用,和对象的声明语句也更具正交性。

时间: 2024-09-20 09:41:31

《C++覆辙录》——2.7:“函数还是对象”的多义性的相关文章

《C++覆辙录》——导读

前言 C++覆辙录 本书之渊薮乃是近20年的小小挫折.大错特错.不眠之夜和在键盘的敲击中不觉而过的无数周末.里面收集了普遍的.严重的或有意思的C++常见错误,共计九十有九.其中的大多数,(实在惭愧地说)都是我个人曾经犯过的. 术语"gotcha"1有其云谲波诡的形成历史和汗牛充栋的不同定义.但在本书中,我们将它定义为C++范畴里既普遍存在又能加以防范的编码和设计问题.这些常见错误涵盖了从无关大局的语法困扰,到基础层面上的设计瑕疵,再到源自内心的离经叛道等诸方面. 大约10年前,我开始在

《C++覆辙录》——常见错误1:过分积极的注释

第1章 基础问题 C++覆辙录 说一个问题是基础的,并不就是说它不是严重的或不是普遍存在的.事实上,本章所讨论的基础问题的共同特点比起在以后章节讨论的技术复杂度而言,可能更侧重于使人警醒.这里讨论的问题,由于它们的基础性,在某种程度上可以说它们普遍存在于几乎所有的C++代码中. 常见错误1:过分积极的注释 很多注释都是画蛇添足,它们只会让源代码更难读,更难维护,并经常把维护工程师引入歧途.考虑下面的简单语句: a = b; // 将b赋值给a 这个注释难道比代码本身更能说明这个语句的意义吗?因而

《C++覆辙录》——第2章 语法问题2.1:数组定义和值初始化的语法形式混淆

第2章 语法问题 C++覆辙录C++语言的语法和词法结构博大精深.此复杂性的一部分是从C语言那里继承而来的,另一部分则是为支撑某些特定的语言特性所要求的. 本章中我们将考察一组语法相关的头疼问题.其中有些属于常见的手误,但是错误的代码仍然能够通过编译,只不过会以出人意料的方式运行罢了.另外一些则是由于一段代码的语法结构及它们的运行期行为不再互为表里.其余的部分,我们主要研究语法层面的灵活余地带来的问题:明明是一字不差的代码,不同的软件工程师能从中得出大相径庭的结论来. 2.1:数组定义和值初始化

javascript的原型和作用域(2) 函数和对象的关系

上文(理解javascript原型和作用域系列(1)--一切都是对象)已经提到,函数就是对象的一种,因为通过instanceof函数可以判断. var fn = function () { }; console.log(fn instanceof Object);  // true 对!函数是一种对象,但是函数却不像数组一样--你可以说数组是对象的一种,因为数组就像是对象的一个子集一样.但是函数与对象之间,却不仅仅是一种包含和被包含的关系,函数和对象之间的关系比较复杂,甚至有一点鸡生蛋蛋生鸡的逻

javascript用函数实现对象的方法

  本文实例讲述了javascript用函数实现对象的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html;

java-如何调用一个定义在不同函数中对象的方法?

问题描述 如何调用一个定义在不同函数中对象的方法? 程序中有一个函数 startTimer, 我创建了一个 CountDownTimer 类中的实例: public void startTimer(View view){ CountDownTimer myTime = new CountDownTimer(300001000) { }} CountDownTimer有一个方法调用 cancel(),我想从一个不同的方法 resetTimer() 中调用. public void resetTim

详解JavaScript的闭包、IIFE、apply、函数与对象_javascript技巧

目录 一.闭包(Closure) 1.1.闭包相关的问题 1.2.理解闭包 二.对象 2.1.对象常量(字面量) 2.2.取值 2.3.枚举(遍历) 2.4.更新与添加 2.5.对象的原型 2.6.删除 2.7.封装 三.函数 3.1.参数对象 (arguments) 3.2.构造函数 3.3.函数调用 3.3.1.call 3.3.2.apply 3.3.3.caller 3.3.4.Callee 3.5.立即执行函数表达式 (IIFE) 3.5.1.匿名函数与匿名对象 3.5.2.函数与函数

忽然间茫然之javascript函数和对象

问题描述 大家不要笑话我 前天晚上睡觉时候忽然想到这个问题 javascript对象是由函数构造的 可是我感觉貌似用函数就够了 使用对象就是为了多个继承吗 我发现自己很多时候用函数就够了 到底什么时候是必须用函数的呢 唉 脑子很乱 这样写也不知道大家看的懂我的意思不··· 问题补充:谢谢大家啦 看着大家都回复感觉无比幸福 继续研究研究 不急结贴 呵呵 解决方案 引用蔡老师说:"至于Object与Function的区别,感觉最大的还是在于原型"我的理解是Object和Function的原

Coursera Scala 4-1:函数作为对象

Coursera Scala 4-1:函数作为对象 Functions Types Relate to Classes Scala是纯粹的面向对象的语言,函数是拥有apply方法的对象. 函数类型A=>B等价于: package scala trait Function1[A,B]{ def apply(x:A):B } Functions Values Ralate to Objects 匿名函数 (x:Int) => x*x 等价于: { class AnonFun extends Fun