精华内容
下载资源
问答
  • 物资采购合同一般条款.docx
  • 反不正当竞争法中一般条款与“互联网条款”的司法适用.pdf
  • 带提供国际工程施工合同(一般条款)模板,通过这份合同能够保障自己的合法权益,保证自己的利...该文档为国际工程施工合同(一般条款),是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看
  • 《反不正当竞争法》的一般条款规定了诚实信用原则,通常作为兜底条款起补充作用,对于王跃文案,该法有两项可供选择的具体规定,而法院的判决适用了一般条款,属于法律适用错误。适用一般条款应遵循如下步骤:首先,...
  • 优化《反不正当竞争法》一般条款与互联网专条的司法适用.pdf
  • 一般货物销售合同示范条款.doc
  • 劳动合同一般怎么写有哪些条款.pdf
  • 【合同大全】一般货物销售合同示范条款.doc
  • 一般货物销售合同示范条款精品协议模板2021.doc
  • 合同模板范文2021-一般货物销售合同示范条款.doc
  • 条款与条件

    千次阅读 2015-07-02 10:42:43
    条款与条件 A. MAC APP STORE、APP STORE和IBOOKS B. MAC APP STORE、APP STORE和IBOOKS STORE条款和条件 您在使用MAC APP STORE、APP STORE和IBOOKS STORE(“有关商店”)时受到下文所载的您与ITUNES SARL ...
    条款与条件
    

    A. MAC APP STORE、APP STORE和IBOOKS
    B. MAC APP STORE、APP STORE和IBOOKS STORE条款和条件

    您在使用MAC APP STORE、APP STORE和IBOOKS STORE(“有关商店”)时受到下文所载的您与ITUNES SARL (“ITUNES")之间的法律协议的管辖。如您同意这些条款,请点击“同意”。如您不同意这些条款,请勿点击“同意”,也不要使用MAC APP STORE、APP STORE或IBOOKS STORE。适用本协议并不影响您可能为了使用ITUNES应用程序等目的而订立的软件许可。

    如欲了解有关我们产品和服务的更多信息,请访问http://www.apple.com/support/。

    A. MAC APP STORE、APP STORE和IBOOKS STORE销售条款

    付款、税款和退款政策

    您同意为您通过有关商店购买的所有产品付款,且iTunes可以就您购买的任何产品以及因您的帐户而发生的或与您的帐户有关的任何额外款项(包括任何适用的税款和滞纳金)从您的支付方式收款。您有责任及时支付所有费用并为所有费用的支付向iTunes提供有效的支付方式。如欲了解关于购买如何收费的详情,请参见 http://support.apple.com/kb/HT5582。

    您认知并同意,如果您在注册有关商店过程中指定一张信用卡或在注册后重新指定另一张信用卡作为付款方式,仅为验证该信用卡帐户之目的,您指定的信用卡可能会被暂时扣款人民币1元。您可能会收到该信用卡发卡银行以手机短信或其他方式向您发送的有关该等款项从您的信用卡帐户中被扣除的通知。尽管如此,被扣取的该人民币1元款项将在稍后退还至您的相关信用卡帐户,因此您不必为验证信用卡帐户支付任何款项。您可能不会收到有关退款交易的手机短信或其他方式的通知,且由于没有发生实际的付款,该等扣款和退款交易可能不会反映在您指定的信用卡的对帐单中。

    使用银行卡进行的任何支付将会反映在相应的银行对帐单中,并显示为向iTunes的第三方支付处理商做出的支付。额外费用,如跨境交易费和信用卡费用,可能适用。

    您所购产品的总价将包括产品的价格再加上任何适用的销售税;该等销售税基于帐单发送地址以及您下载产品时有效的销售税率而征收。本公司仅在对数字产品征税的司法管辖区内收取税款。任何客户均无权获得免税。

    产品一旦出售,交易即确立。

    在任何购买完成前, iTunes保留其通过有关商店对提供的产品的随时变更的权利。 在产品售出后,如果随后出现降价或促销,有关商店不提供价格保护或退款。

    如果某一产品在交易完成后、下载之前成为不可提供的产品,则您唯一的救济是取得退款。如果因技术问题导致您所购产品的交付受阻或发生不合理的延误,则您唯一的救济是更换产品或就已支付的价格取得退款,具体由iTunes决定。

    1-CLICK®

    1-Click是根据许可使用的亚马逊公司的注册服务标记。这个便捷的功能使您只需单击一下您的鼠标或其他输入设备,即可通过有关商店购买产品。在您的电脑上访问有关商店时,点击“Buy”按钮就会出现一个对话框,而通过这一对话框就可激活1-Click。(您通过点击您的帐户信息中的“Reset Warning”,就可随时对这一选择进行重新设置)。在您运行iOS的Apple品牌产品(如iPad、iPod touch或iPhone)(“iOS设备”)上访问有关商店时,通过点按标明产品价格的按钮(随即出现“Buy”按钮),即可为每一交易激活1-Click。在激活1-Click后,点按“Buy”按钮即意味着立即开始下载并完成您的交易,而无需任何其他步骤。

    礼券、内容码和帐户额度

    礼券、内容码和未使用的帐户额度不能现金赎回,也不能退回以获得现金退款(法律要求的除外),亦不能交换、转售、用于购买礼品或礼券、用于在Apple网上商店购物或在Apple零售店中使用。未用完的余额不可转让。

    所购买的或设计为在中国流通的礼券和内容码仅可在中国通过有关商店赎回。

    iTunes对于礼券、内容码或帐户额度丢失或失窃不承担责任。对于礼券,权利灭失风险在电子传送至接受者之时从卢森堡转移至位于中国的购买者。对于内容码,权利灭失风险在电子传送之时从位于卢森堡的iTunes转移至位于中国的购买者;为避免疑问,在内容码的情形下,您未必是接受者。

    如果礼券、内容码或帐户额度是以欺诈的方式取得或用于有关商店,iTunes保留关闭帐户或要求采取其他支付方式的权利。

    ITUNES及其被许可方、关联公司和许可方对于礼券、内容码、帐户额度或有关商店未作出任何明示或默示的保证,包括但不限于有关适销性或适合用于特定用途的明示或默示保证。如果礼券或内容码不能使用或运行,您的唯一救济和我们唯一的责任为更换该等礼券或内容码。这些限制可能不适用于您。某些司法辖区不允许对默示保证加以限制或对某些损害赔偿加以排除或限制。如果这些法律适用于您,上述免责、排除或限制条款的部分或全部规定可能不适用于您,并且您可能享有其他权利。

    礼品

    从有关商店购买的礼品,仅可为中国的人士购买,并仅可由该等人士兑换。某些礼品要求礼品获得者必须拥有兼容的硬件及家长控制设置方可使用。

    家庭共享

    通过“家庭共享”这一功能,您最多可以与您的一个“家庭”的五名其他成员共享有关的App Store、Mac App Store、iBooks Store产品。通过设立或加入“家庭”,您可以浏览每一其他成员的合格产品,并可以将其下载到您可兼容的关联设备或电脑上。您也可以选择隐藏您购买的产品,这样其他家庭成员就无法从您处浏览或下载到这些产品。您可以分享信息,如通过Photos应用程序来分享照片和视频,您家庭日历中的事件,Reminders应用程序中的提醒,Find My Friends中共享的地点信息及Find My iPhone提供的设备地点信息等。“家庭共享”功能只能用于个人、非商业用途。需要您拥有iTunes及iCloud账号,iOS 8和/或OS X Yosemite来开始并加入一个“家庭”。某些交易和功能可能与较早版本的软件不兼容并需要您更新软件版本。如果您加入了一个“家庭”,该“家庭共享”功能会自动在您可兼容的设备和电脑里面实现。

    “家庭”的“组织人”可以邀请其他成员加入“家庭”。“组织人”必须是一名在iTunes上注册了合格支付方式的18岁及以上的成年人。如果您是“组织人”则表明您必须是“家庭”中的任何13岁以下未成年人的家长或法定监护人。如果“家庭”成员购买了任何内容且收费超过该成员帐户中的iTunes Store可用余额,则组织人的支付方式将被用以进行付款。“家庭”成员购买的内容将与进行该项交易的那名“家庭”成员的账号相关联。组织人将“家庭”成员添加到“家庭共享”中,即表示组织人同意,任何就家庭成员所发起的购买的所有收费均获得授权,并且同意对所有该等收费负责,即使组织人对发生的交易并不知情,或其“家庭”成员的行为超越了其权限范围,或多个家庭成员发起了对同一个产品的购买。组织人应负责遵守与其支付服务提供商之间的任何协议,并且,如果与其“家庭”成员共享该等支付方式限制了该等提供商针对擅自收费提供的保护,则相关风险全部由组织人自行承担。组织人随时都可以对注册的支付信息作出变更。交易记录将会发送至做出该交易的家庭成员及组织人,如果您及您的“家庭”成员对收据或支付对账单上的某项收费不予认可,请使用收据上的“报告问题”功能。

    组织人可以使用”Ask to Buy”(询问购买)的功能要求不满18岁的儿童和/或组织人指定的其他成人在下载免费或付费的产品之前获得该组织人的许可。通过其他家庭成员处下载的产品或通过赎回码获得的产品不适用该Ask to Buy功能。如果您是组织者,那么您即保证您或您指定的成人是需要激活该Ask to Buy功能家庭成员的家长或法定监护人。Ask to Buy功能在iOS 8及OS X Yosemite下得以优化;使用较早版本软件进行产品购买或下载需求可能展示使用者其他的许可程序或阻止购买,并可能需要软件升级。iTunes对Ask to Buy 功能在许可或拒绝时的延迟所可能造成的不良后果不负任何责任。

    组织人可以删除任何“家庭”成员,之后该“家庭”成员将无法使用组织人的付款方式进行获授权的购买,并且将无法浏览和共享其他“家庭”成员的产品。如果一名“家庭”成员离开“家庭”,剩余的“家庭”成员便不能再浏览或下载该名离开成员的产品,包括在其仍属于该“家庭”期间采用组织人的支付方式购买的任何产品;同样地, 如果您离开一个家庭,那么您也不能再浏览或下载其余“家庭”成员的产品或信息,您在作为家庭成员期间从其他家庭成员处下载的产品也不将能获取。 如果您从离开的家庭成员以往购买的应用程序里又进行了App内购买,或者您已经不再是一个家庭的成员,您则需要自行购买该应用程序并重新存储App内购买以便再次获取该App内购买。请您在购买App内购买前,详读开发者政策及本协议中关于App内购买的相关条款。由于为年龄为13岁以下的用户设立个人账号是家庭共享功能的一部分,为了删除家庭成员而将该用户账号删除将会终止该家庭成员的Apple ID及该成员必须通过其账号获取iTunes服务和其他与该账号有关的内容的能力。

    在任一时间点您只能属于一个“家庭”,且于一年内加入任何“家庭”的次数不得超过两次;您变更您与一个“家庭”关联的iTunes帐户的频率不得超过每90天一次。所有的家庭成员必须在同一国家或地区。合格的应用程序可以被下载到家庭成员拥有或控制的任何设备或电脑上。不是所有的产品(包括App内购买、订阅及之前购买的某些App)都可以使用“家庭共享”功能。iTunes保留根据本协议中的“终止”条款解散一个“家庭”的权利。

    预购

    您预购产品,即表示您授权有关商店自动向您的帐户收费并在产品可获得时下载产品。您可在预购产品可获得之前取消您的预购。

    电子合同

    您对有关商店的使用包括以电子方式订立协议和/或进行交易的能力。您确认,您以电子方式同意某些协议和提交某些交易即表示您同意并愿意受此等协议的约束和为此等交易付款。您对受您以电子方式同意的协议和提交的交易约束所表示的同意和意愿适用于您在本网站上订立的所有交易的所有记录,包括关于取消、政策、合同和应用的通知。为访问和保留您的电子交易记录,您可能需要有某些硬件和软件,这些硬件和软件完全由您自行负责。

    iTunes不对排印错误承担责任。

    B. MAC APP STORE、APP STORE和IBOOKS STORE条款和条件

    您使用MAC APP STORE、APP STORE和IBOOKS STORE(“有关商店”)以及从有关商店购买iTunes向您出售的许可的行为受您与iTunes S.à.r.l. (“iTunes”)之间的本法律协议的管辖。

    MAC APP STORE、APP STORE和IBOOKS STORE

    iTunes 是有关商店的提供商,有关商店使您可以依照本协议规定的条款和条件向iTunes购买软件产品和数字内容(“有关产品”)的使用许可,但仅可供终端用户使用。对App Store产品(定义见下文)而言,其最终使用者可以是以其本人身份行事的个人、商业企业或教育机构。

    使用有关商店的要求

    年龄在13岁以上的个人可以创建账号。未满13岁的个人账号需要由其家长或法定监护人为使用家庭共享功能而创建,或由一个被批准的教育机构来创建。是未满18岁的儿童应与他们的家长或法定监护人共同审阅本协议,确保该儿童与家长或法定监护人理解本协议。

    您仅可在中国使用有关商店。您同意不会在中国境外使用或试图使用有关商店。iTunes可采用技术手段核实您是否遵守本规定。

    使用有关商店需要有兼容设备、互联网连接以及某些软件(可能收费),可能需要定期更新,并可能受到这些因素的性能表现的影响。强烈建议您采用高速互联网连接。建议使用iTunes和Mac App Store软件的最新版本来访问有关商店,并且对某些交易或功能而言以及对下载先前从有关商店购买或取得的有关产品而言,可能必须使用iTunes 软件的最新版本。您同意这些可能不时改变的要求由您自行负责。有关商店并非任何其他产品或供应品的一部分,购买或取得任何其他产品不得被理解为声明或保证您可访问有关商店。

    您的帐户

    作为有关商店的注册用户,您可设立一个帐户(“帐户”)。不要将您的帐户信息透露给任何其他人。您自行负责您帐户的保密和安全,并对您的帐户发生的或通过您的帐户发生的一切活动负全责,而且您同意将您的帐户出现的任何违反安全原则的情况立即通知iTunes。对于并非iTunes重大过失导致的对您的帐户的擅自使用引起的任何损失,iTunes不承担任何责任。

    要从有关商店购买和下载有关产品,您必须输入您的Apple ID和密码或使用Touch ID对您的帐户进行验证,以便交易。使用您的Apple ID和密码验证过您的帐户后,在十五分钟内您无需再次进行验证;您可以选择让您的电脑或记住您的密码以便保持验证状态。在这段时间内,您无需重新输入密码即可购买和下载有关产品。通过调整您的计算机或iOS设备上的设置,您可以关闭有关产品交易的功能,或者更改设置要求每次产品交易都需要密码。如需了解更多信息,请参见http://support.apple.com/kb/HT1904和http://support.apple.com/kb/HT4213。

    您同意在有关商店注册时以及在使用有关商店时提供准确和完整的信息(“注册资料”),并且您同意为使您的注册资料保持准确和完整而更新您的注册资料。您同意,iTunes可以存储和使用您提供的注册资料,以用于维持您的帐户和从您的帐户中收费。

    自动交付和下载之前购买的产品

    当您首次通过有关商店购买App Store 产品(从Mac App Store购买的产品除外)或iBooks Store产品(统称“合格内容”)时,您可以选择在其他iOS设备和经iTunes授权的并带有兼容软件的计算机上自动接收(“自动下载”)该等合格内容,方法是根据下述关联规则将该等iOS设备和计算机(“关联设备”)相关联。对于每一关联设备,您可以指定哪一类型的合格内容(如有)可以自动下载到该关联设备之上。对于能够接收推送通知(“具有推送功能”)的关联设备(包括iOS设备),当该设备与互联网连接时内容将自动下载到该设备上;对于不具有推送功能的关联设备,包括在Windows 操作系统上运行的设备,合格内容将自动出现在下载队列中,您可以在iTunes 中手动开始下载。

    为了给您提供方便,在取得合格内容后,您可以将某些之前取得的合格内容下载到任何关联设备上。您之前取得的某些合格内容可能无法在之后的任何特定时间进行后续下载,在此情况下Apple不对您承担任何责任。由于您可能无法后续下载某些之前取得的合格内容,一旦您下载一项合格内容,您即应负责不丢失、毁坏或损坏该合格内容,并且建议您进行备份。

    关联设备的关联须遵守下列条款:

    (i) 您可以在最多10台关联设备上从帐户自动下载合格内容或下载之前取得的合格内容,前提是这些关联设备中经iTunes授权的计算机不超过5台。

    (ii) 在任何特定时间一台关联设备仅可与一个帐户相关联。

    (iii) 您可以将一台关联设备转换到一个不同的帐户,但仅可每90天进行一次。

    (iv) 在免费内容在有关商店中免费提供期间,您可以将之前取得的免费内容下载至数量不受限制的设备上,但其中经iTunes授权的计算机不得超过5台。

    以上(i) 至 (iv)项不适用于App Store产品。

    某些合格内容可能容量很大,通过数据连接传输该等合格内容可能会产生高额数据传输费。

    自动更新

    您的设备和电脑会定期查看App Store和Mac App Store,以查找其所需的应用程序更新,若适用,即可自动下载和安装更新。您同意,Apple公司可通过App Store和Mac App Store在您的设备或电脑上自动下载和安装更新。您可以通过更改您的设备或电脑上的自动更新设置,随时彻底关闭自动更新。

    应用程序捆绑

    有些App Store产品可能含有多个项目(“App Bundles”)(应用程序捆绑)。您将会在购买某个应用程序捆绑之时按照在该个应用程序捆绑旁边所展示的价格被收取费用。应用程序捆绑价格可能会降低以便计算您以前已经购买或获得的App Store产品,但可能会包含一个最低收费来完成应用程序捆绑,除非之前的购买是由其他货币完成。

    隐私权

    有关商店适用在 http://www.apple.com/legal/privacy/公布的苹果公司隐私权政策。

    有关产品和有关商店的使用

    iTunes向您出售的是使用有关产品的许可。一旦从iTunes购得,该许可即构成您直接与该有关产品的出版商(“出版商”)之间达成的关于您对该有关产品之使用的具有约束力的协议。您同意,有关商店和某些有关产品包含使您对有关产品的使用受到限制的安全技术(“安全技术”),并且,无论有关产品是否受安全技术限制,您均应遵照iTunes及出版商制定的适用的使用规则(“使用规则”)使用有关产品,而对有关产品的任何其他使用可能构成著作权侵权行为。任何安全技术构成有关产品不可分割的一部分。iTunes保留在任何时候修改使用规则的权利。尽管如此,该等修改不适用于您已经购买的产品。任何上述修改将会向您告知。如果您不接受任何修改,您将不能够从有关商店中再购买产品。

    内容安全

    您同意不会因任何原因违反该等使用规则或对该等使用规则进行规避、反向工程、反编译、反汇编或以其他方式对与该安全技术的任何元素进行改动,也不会试图这样做或协助他人这样做。iTunes可为了确保使用规则得以遵守之目的控制和监视使用规则,且iTunes保留在不通知您的情况下执行使用规则的权利。

    您同意,您不会通过除苹果公司和苹果的关联公司(“苹果”)提供的访问有关商店的软件以外的任何手段来访问有关商店。您不得访问或试图访问您未被授权访问的任何帐户。您同意不为任何目的(包括擅自访问有关商店的目的),以任何方式或形式修改软件,或使用该等软件的修改版本。违反系统安全或网络安全规定可能会导致民事或刑事责任。

    交付有关产品并不意味着向您转让有关产品的任何促销使用权。

    您确认,虽然iTunes并非您与有关产品出版商之间的使用许可的合同方,但由于有关商店、有关产品以及使用规则的执行的某些方面需要iTunes的持续参与,因此,如果iTunes改动有关商店的任何部分或停止有关商店(可由iTunes选择),则您可能不能像改动或停止前那样使用有关产品,在此等情况下,iTunes不对您承担任何责任。

    向有关商店提交材料

    有关商店可能提供互动功能,使您可以实现在有关商店的其他用户及公众可以访问和观看的有关商店区域提交材料(包括通往第三方内容的链接)。您同意,您对此等功能的任何使用,包括您提交的任何材料,均完全是您自身的责任,不得侵犯或违反任何其他方的权利、违反任何法律或者促成或鼓励侵权或非法行为,也不得是下流淫秽、令人反感或庸俗的。您还同意,您已经取得了一切必要的权利和许可。您同意在有关商店上提交任何材料时提供准确、完整的信息。您特此向iTunes授予世界范围内的、免使用费的非独家许可,许可其作为有关商店的一部分或在与有关产品相关的情况下使用该等材料,而无须为此向您给予任何报酬或承担任何义务。 iTunes保留在任何时候根据其自行决定,在无须做出通知或承担责任的情况下不张贴或公布任何材料以及删除或编辑任何材料的权利。您不得针对使用促销内容码下载的App Store产品提交评论或评分。

    iTunes有权但无义务监视由您提交的或可在有关商店上获得的任何材料,调查任何被报告的或明显的违反本协议行为,以及采取iTunes根据其自行判断认为适当的任何行动,包括但不限于根据本协议或根据苹果公司的著作权政策(见http://www.apple.com/legal/copyright.html)终止本协议。

    第三方材料

    可通过有关商店获得的某些内容、有关产品和服务可能包括第三方的材料。iTunes可能为方便于您而提供通往第三方网站的链接。您同意,iTunes不负责检查或评估任何该等第三方材料或网站或第三方的任何其他材料、产品或服务的内容或准确性,并且,iTunes对此不作保证、不承担任何责任、也不负有任何义务。您同意,您将不会以侵犯或违反任何他方权利的方式使用任何第三方材料,而且iTunes不以任何方式为您的任何此等使用承担责任。

    令人反感的材料

    您理解,在使用有关商店时,您也许会遇到您可能视为是无礼的、下流的或令人反感的材料,此类内容可能会也可能不会被确定为含有露骨的材料。尽管如此,您同意自行承担风险使用有关商店,对于可能被认定属于无礼、下流或令人反感的材料,iTunes不向您承担任何责任。有关产品的种类和描述仅为方便之目的而提供,您同意iTunes不保证它们的准确性。

    知识产权

    您同意,有关商店(包括但不限于有关产品、图片、用户界面、声音素材、编辑内容和安装有关商店所使用的脚本和软件)包含iTunes和/或出版商拥有的专有信息和材料,受适用的知识产权法律和其他法律(包括但不限于著作权法律)的保护。您同意,您不会以任何方式使用该等专有信息或材料,但为了根据本协议使用有关商店的目的而使用的除外。除本协议条款明确允许的以外,不得以任何形式或任何方式复制有关商店的任何部分。您同意,不以任何方式修改、出租、租赁、出借、出售、分发有关商店,或以有关商店为基础创作衍生作品,并且您不得以任何未经授权的方式利用有关商店,包括但不限于侵占网络容量或使网络容量负荷过重。

    不论本协议中有任何其他规定,iTunes及出版商保留在任何时候不经通知即变更、暂停、去除或禁止访问任何有关产品、内容或构成有关商店一部分的其他材料的权利。在任何情况下,iTunes均不会因作出该等变更而承担任何责任。iTunes还可在任何情况下不经通知即对有关商店某些功能或部分的使用或访问施加限制,而无须为此承担任何责任。

    有关商店中的以及对有关商店的所有著作权(包括内容汇编、张贴、通往其他互联网资源的链接以及关于上述资源的描述)和相关软件的著作权,由iTunes和/或其许可商所有,iTunes和/或其委托人保留其在法律和衡平法上的所有权利。除本协议中允许的对有关商店的使用外,对软件或有关商店的任何部分的使用均是严格禁止的,此等使用侵犯他人的知识产权,可能使您因侵犯著作权而受到民事和刑事处罚,包括可能支付损害赔偿金。

    苹果、苹果标识、iTunes以及就有关商店使用的其他苹果商标、服务标记、图形和标识是iTunes和/或苹果公司在美国和/或其他国家的商标或注册商标。就有关商店使用的其他商标、服务标记、图表和标识可能是其各自所有人的商标。未就任何上述商标或对上述商标的任何使用授予您任何权利或使用许可。

    终止

    如果您未遵守或iTunes怀疑您未遵守本协议的任何规定,则iTunes可按其自行决定,无须通知您即:(i)终止本协议和/或您的帐户,而您仍将负责截至终止之日(含该日)您帐户中的所有应付款项;和/或(ii)导致软件使用许可被终止;和/或(iii) 阻止对有关商店(或其任何部分)的访问。

    iTunes保留在任何时候无论是否通知您而修改、暂停或停止有关商店(或其任何部分或内容)的权利,如果iTunes行使该等权利,其不就此对您或任何第三方承担责任。iTunes将尽其最大可能通知您上述修改、暂停或中断商店。修改、暂停或中断商店将不会影响您使用已经获得的产品。尽管如此,您将不能授权额外的电脑来使用产品。

    保证的排除;责任限制

    在适用法律允许的最大范围内,iTunes不担保、声明或保证您对有关商店的使用将会是不中断的或无错误的,并且,您同意,iTunes可在不通知您的情况下不时无限期地撤除有关商店,或随时取消有关商店。

    您明确同意,您使用或无能力使用有关商店均由您自身独自承担风险。有关商店以及通过有关商店向您交付的所有产品和服务(除iTunes明确声明的外)均按“原样”及“现有”的原则提供,供您使用,不含任何种类的明示或默示保证,包括对适销性、适合于特定用途、所有权及不侵权的所有默示保证。由于某些司法管辖区不允许排除默示保证,因此,上述默示保证的排除可能不适用于您。

    在任何情况下,iTunes、其董事、高级职员、雇员、关联公司、代理、承包商、委托人或许可方均不对由您对任何有关商店的使用所引起的任何直接、间接、附带、惩罚性、特殊或后果性的损害赔偿或者在任何方面与您对有关商店的使用有关的权利主张(包括但不限于任何内容中的任何错误或遗漏、由于使用通过有关商店所张贴、传输或通过其他方式提供的任何内容(或有关产品)而发生的任何种类的任何损失或损害)承担责任,即使已被告知其可能性。由于某些司法管辖区不允许排除或限制对后果性或附带损害所承担的责任,因此,在该等司法管辖区内,iTunes的责任限制应以法律允许的为限。

    iTunes应尽合理努力保护您就有关商店提交的信息,但是您同意,您提交该等信息的风险由您自行承担,iTunes特此声明不以任何方式就与该等信息有关的任何损失或责任向您承担任何责任。

    在适用法律允许的最大范围内,iTunes不声明或保证有关商店不会遭受缺失、损坏、攻击、病毒、干扰、黑客入侵或其它的安全侵入情况,iTunes不承担与之有关的任何责任。某些产品仅可下载一次。如果在下载后因任何原因遗失,这些产品无法更换。您应负责备份您自己的系统,包括从有关商店购买的任何有关产品。

    豁免和赔偿

    通过使用有关商店,您同意在法律允许的范围内就因您违反本协议、您使用有关商店、iTunes在对涉嫌违反本协议的行为进行调查的过程中采取的任何行动、或iTunes做出的已发生违反本协议的行为的结论或决定而引起的任何权利主张向iTunes、其董事、高级职员、雇员、关联公司、代理、承包商、委托人和许可方进行赔偿,并使其免受损害。这意味着您不能因iTunes做出去除或拒绝处理任何信息或内容、对您予以警告、暂停或终止您对有关商店的访问、或在对涉嫌违反行为的调查中采取任何其他行动的决定造成的,或是因iTunes做出已发生违反本协议的行为的结论而造成的损失或损害而对iTunes、其董事、高级职员、雇员、关联公司、代理、承包商、委托人和许可方起诉,或从上述各方取得任何损害赔偿。在适用法律允许的最大范围内,此项豁免和赔偿规定适用于本协议中所述或拟议的一切违反。

    变更

    iTunes保留随时修改本协议并就您对有关商店的使用施加新的或额外的条款或条件的权利。前述修改以及额外的条款和条件将立即生效并纳入本协议。您对有关商店的继续使用将被视为构成您对该等修改以及额外条款和条件的接受。

    其他规定

    本协议构成您与iTunes之间的全部协议,适用于您对有关商店的使用,取代您与iTunes之间以前达成的任何协议。在您使用关联公司服务、第三方内容或第三方软件时,您可能还须遵守其他的条款与条件。如果本协议的任何部分被判定为无效或不可强制执行,则该部分应按与适用法律一致的方式加以解释,以尽可能地反映各方的原意,而其余部分仍应充分有效。iTunes未强制执行本协议中的任何权利或规定不构成对该等规定或任何其他规定的放弃。iTunes不对其不能控制的原因造成的未履行义务情况承担责任。

    有关商店由iTunes从其在卢森堡的办公地点运行。您同意遵守适用于您对有关商店的使用的所有地方、州、联邦和国家的法律、法令、条例和法规。有关商店上进行的所有交易适用卢森堡法律(其冲突法规则除外)。您对有关商店的使用可能还需要遵守其他法律。您明确表示将就您使用iTunes或与您使用有关商店的任何争议纠纷交由位于卢森堡的法庭独家管辖。所有以电子方式交付之交易的灭失风险和所有权在电子传输给接收者后即转移至在中国的购买人。iTunes的任何雇员或代理均无权变更本协议。

    iTunes可通过向您的帐户电邮地址发送电子邮件、向您的帐户通讯地址邮寄信件,或者在有关商店上张贴的方式,就有关商店向您发送通知。通知立即生效。

    iTunes有权采取其认为合理必要或适当的措施以执行和/或核实对本协议任何部分的遵守情况。您同意,iTunes有权向执法机构、政府官员和/或某一第三方披露其认为对于执行和/或核实对本协议任何部分的遵守情况而言是合理必要或适当的任何注册资料和/或帐户信息(包括但不限于iTunes对与您使用有关商店和/或有关产品和/或关于您使用有关商店和/或有关产品是非法的和/或侵犯第三方权利的第三方权利主张有关的任何法律程序予以配合的权利),而无须对您承担责任。

    关于iTunes:我们公司注册号码为 RCS Luxembourg B 101 120 ;公司地址为 31 – 33, rue Sainte Zithe, L-2763Luxembourg。

    更多MAC APP STORE和APP STORE的条款和条件

    MAC APP STORE和APP STORE产品的许可

    iTunes向您出售的是使用通过Mac App Store和App Store提供的软件产品(共同称为“App Store产品”)的许可。App Store产品分为下列两(2)类:(i)由Apple开发并由iTunes许可给您的App Store产品(“苹果产品”);及(ii)由第三方开发商开发并许可给您的App Store产品(“第三方产品”)。具体的App Store产品类别(即,苹果产品或第三方产品),会在Mac App Store的应用程序或App Store的应用程序上标明。

    您对每一App Store产品的使用许可必须遵守下文所载的许可应用程序最终用户许可协议,并且您同意,该等条款将适用,除非该App Store产品适用您与该App Store产品的出版商(“出版商”)订立的一份有效的最终用户许可协议(在此等情况下,出版商的最终用户许可协议将适用于该App Store产品)。出版商保留未明确向您授予的对App Store产品的一切权利。

    您确认,您通过App Store获得的每一苹果产品的使用许可,或您与您账号的链接,是您与iTunes之间达成的具有约束力的协议。您确认:一旦您向iTunes购买一项第三方产品,您即直接与出版商达成一项有关您对该第三方产品之使用的具有约束力的协议;就该第三方产品而言,iTunes不是您与出版商之间的使用许可的合同方。每项第三方产品的出版商应对该第三方产品、该第三方产品中的内容、未予排除的任何保证、以及您或任何其他方与该第三方产品相关的任何权利主张自行承担全部责任。

    您确认并同意,iTunes及其关联公司是各项第三方产品的许可应用程序最终用户许可协议或出版商的最终用户许可协议(以适用者为准)的第三方受益人。您还同意,一旦您接受任何该等第三方产品之使用许可的条款和条件,iTunes将享有(而且将被视为已接受)作为该等使用许可的第三方受益人对您执行该等使用许可的权利。

    App内购买

    某些App Store产品可能包含一种功能,使您能够购买额外服务或在App Store产品内使用额外功能或内容的许可(“App内购买”)。在使用App Store产品时实现的App内购买(例如虚拟弹药)不能在设备间进行转移,只能下载一次,且在下载后不能进行替换。在您购买并取得可实现的App内购买后,对于并非iTunes重大过失导致的任何损失、毁坏或损害,iTunes不对您承担责任。就本条款和条件而言,一切App内购买均视为App Store产品,而在第三方产品内进行的App内购买视为第三方产品,并作为第三方产品对待。

    您必须进行验证以进行App内购买,该验证独立于为获得有关产品而进行的任何验证,验证方法是在收到提示时输入密码。但是,一旦您的一项App内购买经验证后,您将能够在十五分钟内进行额外的App内购买,而无需再次输入密码。您可以按照http://support.apple.com/kb/HT4213所述的步骤在您的iOS设备上关闭App内购买功能。

    App内订阅

    部分App Store有关产品可能包含使您能够在订阅基础上获得内容(“App内订阅”)的功能。付费的App内订阅是不可退款的。App内订阅将自动地按您选择的时间期限续展,您的帐户将在当前App内订阅期届满前24小时内被扣除订阅费用(如适用)。您可以通过在您的帐户设置中选择“管理应用程序订阅”并选择您要改变的订阅项目而取消付费的App内订阅的自动续展。如果出版商上调订阅价格,订阅的自动续展功能将被关闭。您可以通过从您的设备中删除App Store产品来取消免费的App内订阅。部分付费的App内订阅可能在从您的帐户中扣除订阅费用前提供免费试用期。如果您决定您不愿购买App内订阅,请在免费试用期内在您的帐户设定中关闭自动续展。某些App内订阅可能被指定为“Newsstand”产品,在这种情况下,该等App内订阅仅在下载后于您的设备的Newsstand应用程序内可见。在App Store产品内进行购买时,您还应参阅关于付费的App内订阅选择的更多信息。我们可能会要求您同意将您帐户中列明的姓名、电子邮件地址和邮政编码提供给出版商,以便于出版商根据其公布的隐私政策向您发送有关其产品的宣传信息。一旦出版商获得该等信息,出版商将会根据其隐私政策加以处理。我们鼓励您在同意向出版商提供您的个人信息前了解其隐私权保护实践。如欲了解更多信息,请您参阅出版商的隐私政策或者与出版商直接联系。

    POPULAR NEAR ME

    当您选择加入Popular Near Me启用“定位服务” 后,iTunes将不时地自动收集与您的某些App Store产品有关的信息,例如您使用每一App Store产品的时间以及每一App Store产品的启动次数。此等信息会被匿名存储而不会与您的姓名或帐号联系在一起。iTunes将使用此等信息以及其他信息(例如您的App Store产品下载记录),向您提供个性化建议。

    iTunes可使用上述信息并将其与来自选择加入此项功能的其他用户的汇总信息、您从iTunes Store购买产品的记录、您从App Store进行下载的记录、其他用户下载App Store产品的汇总记录以及其他信息如顾客对App Store产品的评级等合并在一起,从而:

    • 向您提供针对您可能想购买、下载或使用的App Store产品、媒体资料及其他产品和服务的建议。

    • 向其他用户提供建议。

    您的信息将由始至终根据苹果公司的隐私权政策处理。

    如果您希望我们不以上述方式从您的装置或系统中收集和使用此等信息,则请勿启动定位服务功能或使用Popular Near Me。在任何时候,您都可以通过在您装置和/或系统上的App Store Account页面关闭。Popular Near Me来选择退出。MAC APP STORE产品使用规则

    除非本文中另有规定,

    (i) 如果您是以本人身份行事的个人,您可以为个人而非商业使用目的在您拥有或控制的任何运行Mac OS X的Apple品牌产品(“Mac电脑”)上下载和使用来自Mac App Store的应用程序(“Mac App Store产品”)。

    (ii) 如果您是一家商业企业或教育机构,您可以下载Mac App Store产品, (a) 供一个人在由您拥有或控制的、该人所使用的每台Mac电脑上使用,或(b) 供多个人在您拥有或控制的一台共享Mac电脑上使用。例如,一名雇员可以在其桌面Mac电脑和笔记本Mac电脑上都使用Mac App Store产品,或多名学生可以先后在位于资源中心或图书馆的一台Mac电脑上使用Mac App Store产品。为明确起见,多名用户先后使用每台Mac电脑需要独立的许可。

    (iii) 使用Mac App Store产品可能要求您使用Apple ID登录,用于从Mac App Store下载Mac App Store产品。Mac App Store产品只能通过Mac App Store升级更新。

    APP STORE产品使用规则

    (i) 如果您是以本人身份行事的个人,您可以为个人而非商业使用目的在您拥有或控制的任何iOS设备上下载和同步App Store产品。

    (ii) 如果您是一家商业企业或教育机构,您可以下载和同步App Store产品, (a) 供一个人在由您拥有或控制的、该人所使用的一台或多台iOS设备上使用,或(b) 供多个人在您拥有或控制的一台共享iOS设备上使用。例如,一名雇员可以在其iPhone和iPad上都使用App Store产品,或多名学生可以先后在位于资源中心或图书馆的一台iPad上使用App Store产品。为明确起见,多名用户先后使用每台iOS设备需要独立的许可。

    (iii) 您在同一时间应能够在兼容的iOS设备上从最多五个不同的帐户存储App Store产品。

    (iv)您应能将iTunes产品从至少一个经iTunes授权的设备上手动同步到有手动同步模式的iOS设备上,前提是iTunes产品与主要的经iTunes授权的设备上的一个帐户相关联(这里主要的经iTunes授权的设备是指最先与iOS设备同步的设备,或者是之后您用iTunes应用程序指定为主要设备的设备)。

    重要安全信息

    为避免在玩视频游戏的过程中发生肌肉、关节或眼睛的损伤,您在游戏过程中应经常停下来休息片刻,如果您感到酸痛、疲劳或其他不适,应休息更长时间。有一小部分人在有闪烁的光或图案的环境下(包括在玩视频游戏或观看视频的过程中)可能出现突然发作或短暂昏厥的情况。症状可包括头晕、恶心、不自主运动、丧失知觉、视力模糊、刺痛、麻木或其他不适。如果您曾经有过上述症状或类似症状,在玩视频游戏前请咨询医生意见,如果在玩游戏过程中发生上述症状,请立即停止游戏,去看医生。家长在孩子玩游戏时应注意观察孩子是否有相关症状表现。

    MAC APP STORE和APP STORE产品的维护和支持

    iTunes将负责按照许可应用程序最终用户许可协议或单独的最终用户许可协议(以适用者为准)或按适用法律的要求仅就苹果产品提供任何维护和支持服务。任何第三方产品的出版商将自行负责按照许可应用程序最终用户许可协议或出版商最终用户许可协议(以适用者为准)或按适用法律的要求就该第三方产品提供维护和支持服务。

    许可应用程序最终用户许可协议

    通过Mac App Store和App Store(共同称为“App Stores”)提供的Mac App Store产品和App Store产品(共同称为“App Store产品”)是许可给您,而不是出售给您的。您通过App Stores或您链接的账号取得的对每一App Store产品的使用许可的前提是您首先要接受本许可应用程序最终用户许可协议(“标准最终用户许可协议”),并且您同意本许可应用程序最终用户许可协议的条款将适用于您通过App Stores获得使用许可的每一App Store产品,除非该App Store产品适用您与该App Store产品的出版商订立的一份有效的最终用户许可协议,在此情况下,适用该单独的最终用户许可协议的条款。您在本标准最终用户许可协议或独立的最终用户许可协议项下取得的对任何苹果产品的使用许可,是由iTunes授予的,而您在本标准最终用户许可协议或独立的最终用户许可协议项下取得的对任何第三方产品的使用许可,是由该第三方产品的出版商授予的。受到本标准最终用户许可协议约束的任何App Store产品在本协议中称为“许可应用程序”。出版商或iTunes(视情况而定,下称“许可商”)保留本标准最终用户许可协议中未明确向您授予的对许可应用程序的一切权利。

    a. 许可范围:许可商就许可应用程序向您授予的此项使用许可为一项不可转让的许可,范围仅限于按照Mac App Store、App Store和iBooks Store条款与条件规定的使用规则(“使用规则”)在由您拥有或控制的任何运行iOS的Apple品牌产品(包括但不限于iPad、iPhone和iPod touch)(“iOS设备”)或运行Mac OS X的Apple品牌产品(“Mac电脑”)(视情况而定)(共同称为“Apple设备”)上使用许可应用程序。本许可不允许您在不由您拥有或控制的任何Apple设备上使用许可应用程序,而且除非使用规则中另有规定,您不得在网络上分发或提供许可应用程序,以致许可应用程序在同一时间可供多个设备使用。您不得对许可应用程序进行出租、租赁、出借、出售、转让、再分发或再许可,并且当您向第三方出售您的Mac电脑或iOS设备时,您必须在出售前从Mac电脑或iOS设备中移除许可应用程序。您不得对许可应用程序、任何更新或其任何部分进行拷贝(本许可和使用规则明确允许的除外)、反编译、反向工程、反汇编、修改,试图导出其源代码或制造其衍生作品(但适用法律禁止任何前述限制,或适用于许可应用程序所含的任何开放源组件的使用的许可条款允许的情形除外)。凡试图进行上述任何行为均属违反许可商和其许可方的权利。如您违反本限制,您可能会被追究责任及须作出赔偿。

    该许可条款将适用于许可商提供的任何替代和/或补充原许可应用程序的升级程序,除非该等升级程序附有单独的许可,在此情况下该许可的条款将予适用。

    b. 对数据使用的同意:您同意,许可商可以收集并使用技术数据和相关信息,包括但不限于定期收集关于您的设备、系统和应用程序软件以及外围设备的技术信息,以便向您提供与许可应用程序有关的软件更新、产品支持和其他服务(如果有)。许可商可采用不会使您本人的身份被识别出来的方式使用该等信息改善其产品或者向您提供服务或技术。

    c. 终止。本许可在由您或许可商终止之前有效。如果您未遵守本许可的任何条款,则您在本许可项下的权利将自动终止,而无须许可商发出通知。在本许可终止后,您应立即停止对许可应用程序的一切使用,并销毁许可应用程序的全部拷贝(无论是完整的还是部分的)。

    d. 有关服务;第三方材料。许可应用程序可能会使您能够访问iTunes、许可商和/或第三方的服务及网站(均称为“外部服务”)。使用外部服务需要互联网连接,并且使用某些外部服务要求您接受其他条款。通过一个iTunes Store帐号使用本软件,您同意最新版本的iTunes Store条款和条件以及使用规则,您可以通过http://www.apple.com/legal/internet-services/itunes/ww/获取和查看这些文件。

    您理解,在使用任何外部服务时,您也许会遇到可能被视为是无礼的、下流的或令人反感的内容,此类内容可能会也可能不会被确定为含有露骨的语言;而且任何搜索得到的结果或进入某特定网址时,可能会在无意中自动生成对令人反感的内容的链接或提及。尽管如此,您同意自行承担风险使用外部服务,对于可能被认定为属于无礼、下流或令人反感的内容,许可商或其代理人均不向您承担任何责任。

    某些外部服务可能显示、包含或提供来自第三方的内容、数据、信息、应用程序或材料(“第三方材料”)或提供通往某些第三方网站的链接。通过使用外部服务,您确认并同意,许可商或其代理人均不负责对该等第三方材料或网站的内容、准确性、完整性、及时性、有效性、遵守著作权情况、合法性、适当性、质量或任何其他方面进行检查或评估。对任何第三方外部服务、第三方材料或网站或者第三方的任何其他材料、产品或服务,许可商、其代理人、管理人员、关联方和子公司均不作保证或认可,亦不对您或任何其他人承担或负有任何义务或责任。第三方材料和与其他网站的链接仅为您的方便而提供。

    任何外部服务显示的财务信息仅供一般参考之用,而不应被作为可供依赖之投资建议。在基于通过外部服务获得的信息进行任何证券交易之前,您应向根据您所在的国家或地区的法律有资格提供财务或证券意见的财务或证券专业人员咨询。通过App Store 产品或外部服务所展示的任何医疗信息仅仅为普通医疗信息,如非医生直接指导,不得作为医疗诊断或治疗的依据。您应该在依赖App Store产品所提供的医疗信息时咨询医疗专业人士。任何外部服务提供的位置数据仅供基本导航之用,而并非旨在作为在需要精确的位置信息,或者位置数据错误、不准确、延迟或不完整可能会导致死亡、人身伤害或财产或环境损害的情况下可供依赖的信息。许可商、其代理人或其任何内容提供商均不保证任何外部服务显示的股票信息数据、位置数据或其他任何数据的可提供性、准确性、完整性、可靠性或及时性。

    您同意,外部服务含有由许可商和/或其代理人或许可人所有并受适用的知识产权法律和其他法律(包括但不限于著作权法律)保护的专有内容、信息和材料,您将不会以任何方式使用该等专有内容、信息或材料(但经允许的对外部服务的使用除外),或者以任何与本标准最终用户许可协议的条款不相符或侵害第三方或iTunes的任何知识产权的方式使用该等专有内容、信息或材料。不得以任何形式或任何方式复制外部服务的任何部分。您同意,不以任何方式修改、出租、租赁、出借、出售、分发外部服务或者以外部服务为基础创作衍生作品,并且您不得以任何未经授权的方式利用外部服务,包括但不限于使用外部服务传播任何电脑病毒、蠕虫病毒、特洛伊木马或其它恶意软件,或者侵占网络容量或使网络容量负荷过重。您进一步同意,您不会以任何方式使用外部服务来骚扰、辱骂、跟踪、威胁、诋毁任何其他方或侵犯或违反任何其他方的权利,而且许可商和其代理人均不以任何方式对您的任何此类使用或您因使用任何外部服务而可能收到的任何骚扰性、威胁性、诋毁性、冒犯性、侵权性或非法的信息或传输内容承担责任。

    此外,可通过Apple设备访问、在Apple设备上显示或可从Apple设备链接到的外部服务和第三方材料并非以所有语言提供或在所有国家或地区均可获得。许可商不作任何关于此等外部服务和材料适合于或者可供在任何特定地点使用的声明。如您选择使用或访问该等外部服务和材料,您是自主决定这样做的,而且您负责遵守任何适用法律,包括但不限于适用的地方法律。许可商保留在不通知您的情况下,随时变更、暂停、去除或禁止访问任何外部服务的权利。在任何情况下,许可商均不为去除或禁止访问任何此等外部服务而承担任何责任。许可商还可在任何情况下,不经通知即对使用或访问某些外部服务施加限制,而无须为此承担任何责任。

    e. 不作保证:您明确确认和同意,您使用许可应用程序由您自身独自承担风险,并且关于质量是否满意、性能、准确性的全部风险和工作均由您自行负责。在适用法律允许的最大范围内,许可应用程序以及由许可应用程序履行或提供的任何服务均按“原样”及“现有”的原则连同其所有瑕疵一起提供,而且不含任何种类的保证;许可商特此声明,其未针对许可应用程序和任何有关服务作出或提出任何保证和条件(无论明示、默示、还是法定的),包括但不限于有关适销性、质量满意、适合于特定用途、准确性、安静享用权及不侵犯第三方权利的默示保证和/或条件。许可商并未作如下保证:您使用许可应用程序时不会被干扰;许可应用程序中包含的功能或由许可应用程序履行或提供的有关服务会满足您的要求;许可应用程序或有关服务的运行不会受到干扰也不会出现错误;许可应用程序或有关服务中的缺陷会得到纠正。许可商或其授权代表给予的任何口头或书面信息或意见均不构成一项保证。如果许可应用程序或有关服务被证明有缺陷,您应自行承担所有必要的维修或纠正费用。有些司法管辖区不允许排除默示保证,也不允许对消费者的相关法定权利加以限制,因此上述排除和限制可能对您不适用。

    f. 责任限制。在法律未禁止的范围内,在任何情况下,对于因您使用或不能使用许可应用程序而产生的或与之相关的任何人身伤害或任何附带的、特殊的、间接的或后果性的损害赔偿(包括但不限于关于利润损失、数据灭失、业务干扰或任何其他商业损害或损失),无论因何种原因导致也无论基于何种责任理论(合同、侵权还是其他),即使许可商已被告知发生该等损害赔偿的可能性,许可商也无需承担任何责任。某些司法管辖区不允许对人身伤害或就附带或后果性的损害赔偿设定责任限制,因此,上述责任限制规定可能不适用于您。无论如何,许可商就所有损害赔偿(但在涉及人身伤害的情况下适用法律要求的损害赔偿除外)对您承担的责任总额不得超过五十美元($50)。即使这一救济未能实现其基本目的,上述责任限制规定也应适用。

    g. 除美国法律及获得许可应用程序所在的司法辖区法律允许的以外,您不得使用或者出口或转口许可应用程序。特别是(但不以此为限)许可应用程序不得出口或转口(a) 至任何遭美国禁运的国家,或(b)给美国财政部的特别指定国民名单或美国商务部的被禁人士或机构名单上的任何人士。您使用许可应用程序,即表示您声明和保证您并非位于上述任何国家也未被列入上述任何名单。您还同意您不会将该等产品用于美国法律禁止的任何目的,包括但不限于开发、设计、制造或生产核子、导弹、或生化武器。

    h. 许可应用程序和相关文档均属“商业项目”(该词定义见48 C.F.R. §2.101),包含“商用计算机软件”和“商用计算机软件文档”(两词的定义见48 C.F.R. §12.212或48 C.F.R. §227.7202)(以适用者为准)。根据48 C.F.R. §12.212或48 C.F.R. §227.7202-1 至 227.7202-4(以适用者为准),商用计算机软件和商用计算机软件文档是在下列条件下许可给美国政府最终用户:(a)仅作为商业项目,(b)仅带有按照本协议条款和条件授予所有其他最终用户的那些权利。未公布的权利根据美国著作权法律予以保留。

    i. 卢森堡法律(其冲突法规则除外)适用于本许可及您对许可应用程序的使用。您对许可应用程序的使用还可能受其他地方、州、国家或国际法律的管辖。

    iBOOKS STORE的额外条款与条件

    购买iBOOKS STORE产品

    您确认,iTunes向您出售的是使用通过iBooks Store提供的内容(“iBooks Store产品”)的许可。一旦从iTunes购得,该许可即构成您与该iBooks Store产品的第三方提供商(“出版商”)直接达成的有关您对该iBooks Store产品之使用的具有约束力的协议;就该iBooks Store产品而言,iTunes不是您与出版商之间的使用许可的合同方;每一iBooks Store产品的出版商保留强制执行与该iBooks Store产品相关的使用条款的权利;每一iBooks Store产品的出版商对该iBooks Store产品、其中的内容、未予排除的任何保证、以及您或任何其他方与该iBooks Store产品相关的或您对该iBooks Store产品的使用相关的任何权利主张承担全部责任。

    iBooks Store产品的使用规则

    (i) 您仅为个人而非商业使用目的获得使用iBooks Store产品的授权。

    (ii) 您一次应能够在某些iOS设备(例如iPad、iPod touch或iPhone)上从最多五个不同的帐户存储iBooks Store产品。

    (iii) 您在任何时间应能够在五个经iTunes授权的设备上存储iBooks Store产品。

    (iv) 交付iBooks Store产品并不意味着向您转让iBooks Store产品的任何促销使用权,也不意味着向您转让将iBooks Store产品刻录到磁盘的任何权利。

    (v) 您应能将iBooks Store产品从至少一个经iTunes授权的设备上手动同步到有手动同步模式的设备上,前提是iBooks Store产品与主要的经iTunes授权的设备上的一个帐户相关联(这里主要的经iTunes授权的设备是指最先与有关设备同步的设备,或者是之后您用iTunes指定为主要设备的设备)。

    最近的更新:2015年6月30日
    展开全文
  • 条款1仔细选择你的容器 条款2小心对容器无关代码的幻想 条款1概述总结了STL中的容器以及选择容器的方法。条款2讲解了不要泛化容器,但是可以用class封装容器。

    条款1:仔细选择你的容器

    先回顾一下STL中的容器:

    • 标准STL序列容器:vector、string、deque、list
    • 标准STL关联容器:set、multiset、map、multimap
    • 非标准序列容器slist、rope
    • 非标准关联容器hash_set、hash_multiset、hash_map、hash_multimap。条款 25介绍基于散列的容器和标准关联容器的不同。
    • vector作为string的替代品。条款 13 有详细介绍。
    • vector作为标准关联容器的替代品。条款 23有介绍,有时vector在时间和空间上的表现比关联容器好。
    • 集中标准非STL容器,包括数组、bitset、valarray、stack、queue、priority_queue。它们是非STL容器,因此讲的比较少。注意,数组可以使用STL算法,因为数组指针可以当做迭代器。
    如何选择使用的容器是非常重要的一个话题,STL标准给提供了在vector、deque、list之间的选择方案:
    vector、list、deque提供了不同的复杂度,应该这样用:vector是可以默认使用的序列,当频繁对序列中部进行插入删除时应该使用list,当大部分插入和删除发生在序列头或尾时可以使用deque。
    

    上面这么做的原因是:vector是连续内存,当在中部插入删除都要移动元素;list是双向链表,可以在中部方便插入删除;deque是双端队列,内存是一段一段连续的,在头部或尾部插入删除不需移动元素,且它预先分配了空间,不像list需要频繁动态开辟内存。

    STL容器的分类:基于连续内存容器和基于节点的容器

    连续内存容器(基于数组容器):容器的内存是一个或多个连续的内存块;如果插入或删除一个元素,就需要移动一部分元素。这样影响了效率(条款 14、15)和异常安全。标准连续内存容器有vector、string、deque;非标准连续内存容器有rope。

    基于节点额容器:每个节点是个内存块,且只保存一个元素,节点之间通过指针连接起来,这样插入和删除元素只需要改变指针即可,不需要移动元素。list和slist是基于节点的链表容器,标准关联容器(底层为平衡树)也是基于节点的。非标准散列容器也是基于节点,可参考条款 25。

    下面是关于使用标准STL容器的准则:

    1、如果可以在容器的任何一个位置插入一个新元素的能力,那么使用序列容器,关联容器做不到。关联容器底层是RB-Tree,元素插入的位置和key值相关。
    2、如果关心元素在容器中的顺序,不要使用散列容器。散列容器通过散列函数映射元素位置,元素在容器中顺序具有随机性。
    3、必须使用标准C++容器吗?如果是,取出散列容器、slist和rope。
    4、需要什么类型的迭代器。需要随机访问迭代器,那么只能使用vector、string、deque,还可以考虑rope(条款 50)。需要双向迭代器,略过slist(条款 50)和散列容器的一般实现(条款 25)。
    5、插入或删除元素时,是否在意元素的移动?是,就不要选择连续内存容器(条款 5)。
    6、容器中的数据内存布局是否需要兼容C? 是的话,只能使用vector(条款 16)。
    7、查找速度是否重要?是的话,可以使用散列容器(条款 25)、排序的vector(条款 23)和标准关联容器。
    8、是否介意容器底层使用了引用计数器?如果是,不要使用string(条款 13),也不要使用rope,rope的权威实现是基于引用计数的(条款 50)。重新审核string,可以使用vector。
    9、是否需要插入和删除的事务性语义?即是否需要可靠的回退插入和删除的能力。如果需要,使用基于节点的容器;如果需要多元素插入(例如-以范围方式插入条款 5),使用list,它是唯一提供多元素插入事务性语义的标准容器。事务性语义对异常安全比较重要,连续内存容器实现事务性语义的性能开销比较大,具体实现可以参考《Effective C 》资源管理:条款25–考虑写出一个不抛出异常的swap函数条款29:为“异常安全”而努力是值得的
    10、需要把迭代器、指针、引用失效的次数减到最少吗?如果是,最好使用基于几点的容器,因为在连续内存容器上插入删除,有时引起内存的动态重新分配,造成当前迭代器失效。
    11、需要具有以下特性的序列容器吗:1)可以文集访问迭代器;2)只要不删除元素,且插入只在容器结尾,指针或引用的数据不会失效。这是特殊情况,但是如果遇到这种情况,deque是完美选择。

    上面的讨论只是一部分,例如没有关注不同容器使用不同内存配置策略的影响(条款 10、14)。但是上面内存已经足够让你信服:元素顺序、标准一致性、迭代器能力、内存布局和C兼容、查找速度、引用计数器的行为、事务性语义、迭代器失效。

    STL给了许多容器给我们选择,在选择一个容器前,要考虑上面的方方面面。

    条款2:小心对“容器无关代码”的幻想

    STL建立在泛化的基础上,例如数组泛化为容器,参数泛化为包含对象的类型;函数泛化为算法,参数泛化为所用迭代器的类型泛化为其所指向的对象类型。

    容器可以泛化为序列容器和关联容器,且类似的容器拥有类似的功能。连续内存容器提供随机访问迭代器,基于节点的容器提供双向迭代器。序列容器支持push_back或push_front,但关联容器不支持;关联容器提供对数时间复杂度的lower_bound、upper_bound和equal_range成员函数,序列容器没有。

    基于泛化的思想,我们可能想泛化容器,即写和容器无关的代码。例如,现在用的是一个vector,再不修改代码情况下可以用deque或list代替。这样的泛化可能会带来麻烦。

    要写既适用于序列容器,又适用于关联容器的代码并没有什么意义。有些成员函数只存在某类特定容器,例如序列容器支持push_front、push_back,关联容器支持count、lower_bound。即使相同的成员函数,对于不同的容器,其意义也不同。例如insert函数,把对象插入到序列容器时,它保留你放置的位置;但插入到关联容器时,容器会按照规则把对象插入到合适位置。erase函数,在序列容器上操作,它会返回一个新的迭代器,但在关联容器上操作,他什么也不返回。(条款 9有例子)。

    即使要写只适用于序列容器:vector、deque、list容器的代码,也不现实。因为你必须使用它们的交集成员函数来编写,这意味着你不能使用reserve或capacity(条款 14),deque和list不支持它们;list只支持双向迭代器,也不能使用operator[],这意味着不能使用随机访问迭代器的算法:sort、stable_sort、partial_sort和nth_element(条款 31)。

    如果支持vector的规则,不使用push_front和pop_front,且用vector和deque都会使splice和成员函数方式的sort失败,这意味着不能再“泛化的容器”上调用任何一种sort。

    违背上面的限制,代码可能在某个容器上发生编译错误。这是因为不同的序列容器对应不同的迭代器、指针和引用的失效规则。如果想要写vector、deque和list配合的代码,必须假设那些操作使容器的迭代器、指针或引用失效了。所以,必须假设每次调用insert都使迭代器失效了,因为deque::insert会使所有迭代器失效;因为缺少capacity,也要假设vector::insert也会使迭代器、指针和引用失效。同理,erase也要假设使所有东西失效。

    还有一些限制。不能把容器的数据传递给C风格界面,因为只有vector支持(条款 16)。不能用bool保存的对象来实例化容器(条款 18),vector并非总是表现为一个vector,实际上它没有真正保存bool值。list插入删除时间复杂度O(1),但vector和deque为O(n)。

    如果不是全部泛化,只是泛化一部分。例如放弃对list的支持,这时你仍然放弃了reserve、capacity、push_front、pop_front,仍然假设insert和erase有线性时间复杂度且会使迭代器、指针、引用失效,仍然不能存储bool。

    如果泛化关联容器,上面的问题仍然存在。例如,同时支持set和map几乎不可能,set保存单个对象,map保存键值对。即使兼容set/multiset或map/multimap也很难,set/map的insert只返回一个值,multiset/multimap的insert返回类型不同,且要避免对一个保存在容器中的值得拷贝份数作出任何假设。对于map/multimap,避免使用operator[],因为它只存在map中。

    实际上没必要泛化容器,不同的容器优缺点不同;它们没有被设计成相互替换的,我们也无法做什么包装工作。

    当你决定使用某一容器时,这个容器可能不是最理想的,且你可能需要使用不同类型的容器。当改变容器时,不仅仅修改编译器诊断出的错误,还要检查迭代器、指针、引用是否失效。如果从vector切换到其他容器,要确认不再依赖C兼容的内存布局;如果切换到vector,要保证不用来存储bool。

    如果有改变容器的需求,可以这样做:使用封装,封装,再封装。最简单的一个方法通过对容器和迭代器使用typedef。所以不要这样写:

    class Widget {...};
    vector<Widget> vw;
    Widget bestWidget;
    ...//bestWidget赋值
    vector<Widget>::iterator i=//找和bestWidget相等的
        find(vw.begin(), vw.end(), bestWidget);

    要这样写:

    class Widget {...};
    typedef vector<Widget> WidgetContainer;
    typedef WidgetContainer::iterator WCIterator;
    WidgetContainer cw;
    Widget bestWidget;
    ...
    WCIterator i=find(vw.begin(), vw.end(), bestWidget);

    这样,改变容器只需修改很少代码。
    typedef带来的封装可能对你没有意义,但是它可以节省许多工作,例如有如下容器,

    map<string, vector<Widget>::iterator, CIStringCompare>;

    要使用const_iterator来遍历这个map,那么可能多次需要使用:

    map<string, vector<Widget>::iterator, CIStringCompare>::const_iterator

    typedef是其他类型的同义词,它提供的封装是纯词法。如果要更深层次的封装,例如不像暴露出所使用的容器,可以使用class。
    限制用一个容器替换另一个容器可能需要修改的代码,就需要在类中隐藏那个容器,通过接口限制容器的特殊信息可见性。例如要建一个用户列表,可以封装list:

    class CustomerList{
    private:
        typedef list<Customer> CustomerContainer;
        typedef CustomerContainer::iterator CCIterator;
        CustomerContainer customers;
    public:
        ...//限制list特殊信息可见。

    一开始这么做可能看不出有什么意义,因为CustomerList就是一个list。实际上并不是这样,例如我们发现插入和删除并不频繁,但我们需要频繁定位元素nth_element(条款 31)。nth_element需要随机访问迭代器,这时可以把list替换为vector或deque。

    当决定把list改为vector或deque时,要检查CustomerList的每个成员函数和友元,看它们是否有影响。做好对CustomerList的封装,那么客户端可以写出和容器无关的代码。

    展开全文
  • 《Effective C++》:条款41-条款42

    千次阅读 2015-03-10 22:13:03
    条款41了解隐式接口和编译期多态 条款42了解typename的双重意义条款

    条款41:了解隐式接口和编译期多态

    面向对象编程总是以显示接口(explicit interfaces)和运行期多态(runtime polymorphism)来解决问题。例如

     class Widget{
        public:
            Widget();
            virtual ~Widget();
            virtual std::size_t size() const;
            virtual void normalize();
            void swap(Widget& other);
            ……
        };
    
        void doProcessing(Widget& w)
        {
            if(w.size()>10 && w!=someNasyWidget)
            {
                Widget temp(w);
                temp.normalize();
                temp.swap(w);
            }
        }

    可以这样说doProcessing内的w

    • w的类型被声明为Widget,所以w必须支持Widget接口。
    • Widget的某些成员函数是virtual,w对于这样函数的调用将表现出运行期多态(runtime polymorphism)。

    在Templates和泛型编程的世界中,显示接口和运行期多态仍然存在,但是更要到的是隐式接口(implicit interface)和编译器多态(compile-time polymorphism)。将doProcessing从函数变为函数模板(function template)

    template<typename T>
        void doProcessing(T& w)
        {
            if(w.size()>10 && w!=someNasyWidget)
            {
                Widget temp(w);
                temp.normalize();
                temp.swap(w);
            }
        }

    现在再来看doProcessing内的w

    • w必须支持哪种接口,有template中执行于w身上的操作来决定。
    • 凡涉及w的任何函数调用,例如operator>和operator!=,有可能造成template的具现化(instantiated),使这些调用得以成功。这样的局现化发生在编译期。以不同template参数具现化function template会导致调用不同的函数,这就是编译期多态(compile-time polymorphism)。

    编译期多态和运行期多态不难区分,现在来看显式接口和隐式接口的区别。通常显式接口有函数的签名式(函数名称、参数类型、返回值)构成。

        class Widget{
        public:
            Widget();
            virtual ~Widget();
            virtual std::size_t size() const;
            virtual void normalize();
            void swap(Widget& other);
            ……
        };

    public接口由一个构造函数、一个析构函数、函数size,normalize、swap以及其参数、返回值、常量性(constness)构成,还包括编译器产生的copy构造函数和copy assignment操作符。

    隐式接口就完全不同,它不是由函数签名决定,而是由有效表达式(valid expression)组成。

    template<typename T>
        void doProcessing(T& w)
        {
            if(w.size()>10 && w!=someNasyWidget)
            {
                Widget temp(w);
                temp.normalize();
                temp.swap(w);
            }
        }

    可以看出T(w类型)的隐式接口好像有这些约束

    • 必须提供一个名为size的函数,该函数返回一个整数值
    • 必须支持一个operator!=汗还是,用来比较两个对象。

    其实并不是必须满足这两个约束。T必须支持size成员函数,但是这个函数可能从base class继承。这个函数不需要返回一个整数值,甚至不需要返回一个数值类型。甚至不需要返回一个定义有operator>的类型。它唯一要做的就是返回一个类型为X的对象,而X对象加上一个int(10的类型)必须能够调用一个operator>。这个operator>不需要非得取得一个类型为X的参数,它可以取得类型为Y的参数,只要存在一个隐式转换能够将类型X的对象转换为类型为Y的对象。同理T不需要支持operator!=。

    以上分析还没有考虑operator&&被重载,一个连接词的改变或许完全不同的某种东西,可能改变上述表达式的意义。

    第一次以此种方式思考隐式接口会感觉不习惯。隐式接口仅仅由一组有效表达式构成,这个表达式可能看起来很复杂,但它们要求的约束条件一般而言相当直接又明确,例如:

    if(w.size()>10 && w!=someNasyWidget)
    

    关于函数size、operator>、operator&&、operator!=身上的约束条件,很难再说太多;但整体确认表达式约束条件很容易。if表达式必须为布尔值,因此整体表达式必须与bool兼容。这时template doProcessing中类型参数T隐式接口的一部分,doProcessing要求其他隐式接口:copy构造函数、normalize和swap也必须对T型对象有效。

    加诸于template参数身上的隐式接口和加诸于class对象身上接口一样真实,都是在编译期完成检查,如果template中使用不支持template所要求的隐式接口,代码不能编译通过

    总结

    • class和template都支持接口和多态。
    • class的接口是显式的,以函数签名为中心,多态是通过virtual函数发生于运行期。
    • template的接口是隐式的,基于有效表达式。多态是通过template具体化和函数重载解析(function overloading resolution)发生在编译期。

    条款42:了解typename的双重意义

    使用模板时,可以用typename,也可以用class

     template<class T> class Widget;
        template<typename T> class Widget;

    两者没有什么不同。作为template的类型参数,意义完全相同。在使用习惯上来说,很多人喜欢使用typename,因为这暗示参数并非一定要是个class类型。

    C++有时不会把class和typename等价。有时候一定要用typename;为了了解原理,先来谈谈在template内指涉(refer to)的两种名称。

    用一个例子来说明,现在有个template function,接收STL兼容容器为参数,容器内对象可被赋值为int,这个函数打印第二个元素的值

     template<typename C>
        void print2nd(const C& container)
        {
            if(container.size()>=2)
            {
                C::const_iterator iter(container.begin());
                ++iter;
                int valaue=*iter;
                std::cout<<value;
            }
        }

    现在解释一下两个local变量iterate和value。iterate类型为C::const_iterator,实际是什么取悦于template参数C。template内出现的名称如果依赖于某个template参数,称这个名称为从属名称(dependent names)。如果从属名称在class内呈嵌套状,称之为嵌套从属名称(nested dependent name)。C::const_iterator就是这样的嵌套从属名称(nested dependent name),且指涉某类型。value是int类型,不依赖template参数,称之为非从属名称(non-dependent names)。

    嵌套从属名称有可能导致解析(parsing)困难,例如在print2dn这样做

    template<typename C>
    void print2nd(const C& container)
    {
        C::const_iterator* x;
        ……
    }
    

    表面上看是声明了一个local变量x,x类型是只需C::const_iterator的指针,这是因为我们直到C::const_iterator是个类型。如果不是这样呢?例如,C内有个static成员变量碰巧命名为const_iterator,或x是个global变量;这样的话就是一个相乘动作:const::const_iterator乘以x。编写C++解析器的人必须操心这样的输入。

    在直到C是什么之前,不能确定C::cont_iterator是否为一个类型。当编译器解析template print2nd时,不知道C是什么东西。C++有个规则可以解析这个歧义状态:如果解析器在template中遭遇到一个嵌套从属名称,它便假设这个明白不是个类型,除非你告诉它是。所以缺省情况下,嵌套从属名称不是类型。这个规则还有个例外,稍后再提。

    再来看看print2nd,C::const_iterator iter只有在C::const_iterator是个类型时才合理,但是C++缺省认为它不是。要矫正这个形式,我们必须告诉C++C::const_iterator是个类型,在其前面放置关键字typename即可

     template<typename C>
        void print2nd(const C& container)
        {
            if(container.size()>=2)
            {
                typename C::const_iterator iter(container.begin());
                ++iter;
                int valaue=*iter;
                std::cout<<value;
            }
        }

    “typename必须作为嵌套从属类型名称的前缀词”这一规则的例外是:typename不可以出现在base class list内的嵌套从属类型名称之前,也不可以在member initialization list(成员初值列)中作为base class修饰符。

     template<typename T>
        class Derived: public Base<T>::Nested{ //base class list中不允许typename
        public:
            explicit Derived(int x)
            :Base<T>::Nested(x)  //mem init.list中不允许typename
            {
                typename Base<T>::Nested temp; //嵌套从属名称类型
                ……  //既不在base class list中,也不再mem init list中,作为base class修饰符要加上typename
            }
            ……
        };

    再来看一个typename例子。一个function template接受一个迭代器,我们打算为该迭代器指涉的对象做一份local复件(副本)temp

        template<typename IterT>
        void workWithIterator(IterT iter)
        {
            typename::std::iterator_traits<IterT>::value_type temp(*iter);
            ……
        }

    typename::std::iterator_traits<IterT>::value_type是标准traits class(**条款**47)的一种运用。std::iterator_traits<IterT>::value_type是个嵌套从属类名称,所以在其前面放置typename。如果使用std::iterator_traits<IterT>::value_type感觉太长不习惯,可以考虑建立一个typedef,对于traits成员名称,普遍的习惯是设定typedef名称代表某个traits成员名称。

     template<typename IterT>
        void workWithIterator(IterT iter)
        {
            typedef typename::std::iterator_traits<IterT>::value_type value_type;
            value_type temp(*iter);
            ……
        }

    最后提一下,typename相关规则在不同编译器上有不同的实践。这意味着typename和嵌套从属名称之间的互动,也许会在移植性方面带来头疼的问题。

    总结

    • 声明template参数时,前缀关键字class和typename可以互换。
    • 使用关键字typename标识嵌套从属类型名称;但不得在base class list(基类列)或member initialization list(成员初值列)内以它作为base class修饰符。
    展开全文
  • 《Effective C++》:条款32-条款33

    千次阅读 2015-02-25 23:10:35
    条款32-条款40是介绍继承相关内容的。 条款32介绍public继承塑造出基类和派生类之间的关系。 条款33介绍继承层次中,变量的作用域以及遮掩关系。

    条款32-条款33是介绍继承相关内容的。
    条款32介绍public继承塑造出基类和派生类之间的关系。
    条款33介绍继承层次中,变量的作用域以及遮掩关系。

    条款32:确定你的public继承塑模出is-a关系

    以C++面向对象编程,最重要一个规则是:public inheritance(公开继承)意味着“is-a”(是一种)的关系。在这里是“直译”,例如class D: public B直译就是D是一种B。

    如果让class D(“Derived”)以public形式继承class B(“Base”),这便意味着一个类型为D的对象同时也是一个类型为B的对象(或者说D对象含有B对象),但是反之不成立。B比D表现出更一般化的概念,而D比B表现出更特殊化的概念。可以使用B对象的地方,也可以使用D对象。

    以一个具体例子来说明:

        class Person {……};
        class Student: public Person {……};

    由生活经验可以知道,每个学生都是人,但是并非每个人都是学生。这就是这个继承体系的主张。可以预期,对人成立的每件事,对学生也都成立。但是对学生成立的事对人未必成立。在C++中,任何函数如果期望接受类型为Person对象的实参(或pointer to person,或reference to person),也都可以接受一个类型为Student对象的实参(或pointer to student,或reference to student)。

     void eat(const Person& p);
        void study(const Student& s);
        Person p;
        Student s;
        eat(p);//正确
        eat(s);//正确
        study(s);//正确
        study(p);//错误 

    当然,上面正确的前提是以public继承,如果以private继承,意义将完全不同(**条款**39),protected继承也是一样。

    有时public和is-a之间的关系会误导我们。例如,企鹅(penguin)是一种鸟,这是事实;鸟可以飞,这也是事实。如果以C++描述这层关系:

        class Bird{
            publicvirtual void fly();
            ……
        };
        class Penguin: public Bird{
            ……
        };

    但是我们知道,企鹅不会飞,这个是事实。这个问题的原因是语言(英语)不严谨。当我们说鸟会飞时,我们表达的意思是一般的鸟都会飞,并不是表达所有的鸟都会飞。我们还应该承认一个事实:有些鸟不会飞。这样可以塑造一下继承关系

        class Bird{
            ……
        };
        class FlyingBird: public Bird{
        public:
            vitual void fly();
            ……
        };
        class Penguin: public Bird{//没有fly函数
            ……
        };

    这样的设计能更好的反映我们真正要表达的意思。但是这时,我们仍未完全处理好这些鸟事。例如,如果你的系统不会区分鸟会不会飞,你关心的是鸟啄和鸟翅,这样的话,原先的“双class继承体系”更适合你的系统。并不存在完美设计,具体问题要具体讨论。

    还有一个方法来处理“所有鸟都会飞,企鹅是鸟,但企鹅不会飞”这个问题,我们可以在企鹅类重新定义fly函数,让它在产生一个运行期错误:

        void error(const std::string& msg);//输出错误
        class Penguin: public Bird {
        public:
            virtual void fly(){ error("Attemp to make a penguin fly");}
            ……
        };

    这里前面的解决方法不同,这里不说企鹅不会飞,当你说企鹅会飞时,会告诉你这是一个错误。但是这种解决方法之间有什么差异?从错误被侦测出来的时间来看,第一种解决方法“企鹅不会飞”这个限制条件在编译期强加事实;第二个解决方法,“企鹅会飞是错误”是在运行期检测出来的。第一种解决方法更好,**条款**18说过,好的接口可以防止无效的代码通过编译,相比之下,我们应该选择在编译期来找出这个问题。

    在考虑一个例子,基础几何我们都学过,那么正方形和矩形的关系有多么复杂呢?先看下面这个例子:class Square应该以public形式基础class Rectangle吗?我们都知道正方形是特殊的矩形,如果以public继承

     class Rectangle{
        public:
            virtual void setHeight(int newHeight);
            virtual void setWidth(int newWidth);
            virtual int height() const;
            virtual int width() const;
            ……
        };
    
        void makeBigger(Rectangle& r)//增加r的面积
        {
            int oldHeight=r.height;
            r.setWidth(r.width()+10);//r宽度增加
            assert(r.height()==oldHeight);//判断r的高度是否改变
        }

    上面的assert结果肯定为真,因为makeBigger只是改变了r的宽度,高度并未改变。

        class Square:public Rectangle{……};
        Square s;
        ……
        asseret(s.width()==s.height());//对所有正方形都为真
        makeBigger(s);//因为是public继承是is-a关系,所以可以使用这个函数
        asseret(s.width()==s.height());//对正方形也应该为真

    那么现在肯定是有问题了。因为第一个assert时,长和宽多相等;之后增加了宽度,长度不变;到了第二个assert时,长和宽还相等。

    前面说过,以public继承,能够施行于base class对象身上的每件事,都可以施行于derived对象身上。在正放心和矩形的例子(还有一个类似的是条款38的sets和lists),这个结论行不通,所以一public继承塑模它们之间的关系不正确。所以我们应该记住:代码通过编译不表示就可以正确运行。

    is-a只是存在class继承关系中的一种,还有两个继承关系式has-a(有一个)和is-implemented-in-terms-of(根据某物实现出)。这些关系将在条款**38和条款**39讨论。在设计类时,应该了解这些classes之间的相互关系和相互差异,在去塑模类之间的关系。

    总结
    - “public”继承意味着is-a。适用于base classes身上的每一件事一定也适用于derived身上,因为每一个derived对象也是一个base class 对象。

    条款33:避免遮掩继承而来的名称

    这里说的名称,是和继承以及作用域有关。先看一个和作用域有关的例子:

     int x;//global
        void someFunc();
        {
            double x;//local
            std::cin>>x;//给local变量赋值
        }

    这个cin是给local变量x赋值,而不是global变量x,因为内层作用域名称会遮掩外围作用域名称。当编译器在someFunc作用域内遇到名称x时,它在local作用域内查找是否有这个变量定义,如果找不到就再去找其他作用域。这个例子中的变量x类型不同,local的是double类型,而global的是int类型;但是这个并不要紧,C++的名称遮掩规则(name-hiding rules)所做的唯一事情就是:遮掩名称,至于类型并不重要。

    现在来看一下继承。当一个derived class成员函数内指涉(refer to) base class内的某物(成员函数、成员变量、typedef等)时,编译器可以找到所指涉的东西,因为derived class继承了声明在base class内的所有东西。derived class的作用域被嵌套的base class作用域内。

         class Base{
            private:
                int x;
            public:
                virtual void mf1()=0;
                virtual void mf2();
                void mf3();
                ……
            };
            class Derived: public Base{
            public:
                virtual void mf1();
                void mf4();
                ……
            };

    作用域关系图
    这个例子中既有public,又有private。成员函数有pure virtual、impure virtual和non-virtual,这是为了强调我们讨论的是名称,和其他无关。这个例子是单一继承,了解单一继承很容易推断多重继承。假设在derived class的mf4内调用mf2

     void Derived::mf4()
        {
            mf2();
        }

    当编译器看到mf2时,要知道它指涉(refer to)什么东西。首先在local作用域内(即mf4覆盖的作用域)查找有没有名称为mf2的东西;如果找不到,再查找外围作用域(class Derived覆盖的作用域);如果还没找到,再往外围找(base class覆盖作用域),在这里找到了。如果base内还是没找到,之后继续在base那个namespace作用域内找,最后往global作用域找。

    下面把这个例子变得稍微复杂一点,重载mf1和mf3,且添加一个新版mf3到Derived中。

     class Base{
        private:
            int x;
        public:
            virtual void mf1()=0;
            virtual void mf1(int);
            virtual void mf2();
            void mf3();
            void mf3(double);
            ……
        };
        class Derived: public Base{
        public:
            virtual void mf1();
            void mf3();
            void mf4();
            ……
        };

    这里写图片描述
    因为以作用域为基础的“名称遮掩规则”,base class内所有名称为mf1和mf3的函数都被derived class内的mf1和mf3函数遮掩掉了。从名称查找观点来看,Base::mf1和Base::mf3都不再被Derived继承。

     Derived d;
        int x;
        d.mf1();//正确,调用Derived::mf1
        d.mf1(x);//错误,因为Derived::mf1遮掩了Base::mf1
        d.mf2();//正确,调用Base::mf2
        d.mf3();//正确,调用Derived::mf3
        d.mf3(x);//错误,因为Derived::mf3遮掩了Base::mf3

    条款**32中说过public继承是**is-a关系,如果使用public继承而又不继承那些重载函数,就是违反了is-a关系。要想上面的函数调用都正确,可是使用using声明

     class Base{
        private:
            int x;
        public:
            virtual void mf1()=0;
            virtual void mf1(int);
            virtual void mf2();
            void mf3();
            void mf3(double);
            ……
        };
        class Derived: public Base{
        public:
            //让Base class内名为mf1和mf3的所有东西在Derived作用域内都可见,且为public
            using Base::mf1;
            using Base::mf3;
            virtual void mf1();
            void mf3();
            void mf4();
            ……
        };

    这样,下面的调用都不会出错了。

     Derived d;
        int x;
        d.mf1();//正确,调用Derived::mf1
        d.mf1(x);//调用Base::mf1
        d.mf2();//正确,调用Base::mf2
        d.mf3();//正确,调用Derived::mf3
        d.mf3(x);//调用Base::mf3

    如果你继承base class,且加上重载函数;你又希望重新定义或覆写其中一部分,那么要把被遮掩的每个名称引入一个using声明。

    public继承暗示base和derived class之间是一种is-a关系,这也是上述using声明放在derived class的public作用域内的原因:base class内的public名称在publicly derived class内也应该是public。

    如果想要private继承Base,而Derived唯一想继承的是时Base内mf1无参数的那个版本,using声明在这派不上用场,因为using声明会使继承而来的某个名称所有函数在derived class都可以见。这样的实现需要一个不同的技术,一个简单的转交函数(forwarding function):

        class Base{
        public:
            virtual void mf1()=0;
            virtual void mf1(int);
        };
        class Derived: private Base{
        public:
            virtual void mf1()//转交函数(forwarding function)
            {Base::mf1();};//隐式成为inline
        };
        Derived d;
        int x;
        d.mf1();//调用Derived::mf1
        d.mf1(x);//错误,Base::mf1被遮掩了

    上面所述都是不含templates。当继承结合templates时,又会面临“继承名称被遮掩”,关于以“角括号定界”的东西,在**条款**43讨论。

    总结
    - derived classes内的名称会遮掩base classes内的名称。在public继承下从来没有人希望如此。
    - 为了让遮掩的名称在derived class内重见天日,可以使用using声明或转交函数(forwarding function)。

    展开全文
  • 条款13:以对象管理资源 条款14:在资源管理类中小心copying行为 条款15:在资源管理类中提供对原始资源的访问 条款16:成对使用new和delete时要采取相同形式 条款17:以独立语句将newed对象置于智能指针
  • CSDN用户服务条款

    千次阅读 2019-12-10 17:24:39
    CSDN特别提示您,在注册及使用CSDN网站及相应客户端服务前,请事先认真阅读本服务条款内容,特别是关于用户义务、用户责任及CSDN有限保证及免责的条款。CSDN网站及相应客户端的各类业务规则构成本服务条款的组成部分...
  • 《Effective C++》:条款52-条款55

    千次阅读 2015-03-27 22:34:11
    最后这三个条款属于杂项。条款53告诉我们不要忽略警告,虽然程序可以编译通过,但是要搞明白警告信息。条款54和条款55讲解C++的库,一个是TR1文档,一个是Boost。现在C++11标准已定,且有编译器支持。Boost库一些...
  • 《Effective C++》:条款38-条款39

    千次阅读 2015-03-08 21:32:21
    条款38通过复合塑模树has-a 或根据某物实现出 条款39明智而审慎的使用private继承
  • 条款26尽可能延后变量定义式的出现时间。这个条款来讲明,如何高效定义变量。 条款27尽量少做转型动作条款。这个条款讲明,类型转换中要注意的问题。
  • 这个几个条款都在讲实现中的细节问题   条款26:尽可能延后变量定义式的出现时间 核心思想:变量一旦定义了,就要有用。 书上讲了三个例子,一个说,一旦异常被抛出,前面定义的变量就...
  • Effective C++ 50条款

    2019-10-14 14:32:43
    Effective C++ 50条款 条款 1:尽量用 const 和 inline 而不用#define——尽量用编译器而不用预处理 #define max(a,b) ((a) > (b) ? (a) : (b)) 条款 2:尽量用而不用<stdio.h> 条款 3:尽量用 ...
  • 关于离职证明和竞业条款

    千次阅读 2016-01-28 20:51:21
    如果你刚刚从广州一家公司离职,然后到北京的新公司入职,结果你...而竞业条款就更加让人悲催了,一份月薪才几千元的职业也要你签竞业条款?你签还是不签,签了好像吃下了一只苍蝇,不签的话又暂时找不到更好的工作。
  • 《Effective C++》:条款28-条款29

    千次阅读 2015-02-19 19:47:26
    条款28避免返回handles指向对象内部成分:指的是不能返回对象内部数据/函数的引用、指针等。 条款29为异常安全而努力是值得的:指的是要有异常处理机制,避免发生异常时造成资源泄露等问题。
  • 条款10: 令operator=返回一个reference to *this Have assignment operators return a reference to *this    关于赋值,可以把它们写成连锁形式: int x, y, z; x = y = z = 15; // 赋值连锁形式 赋值采用...
  • 如何签订合同中的不可抗力条款

    千次阅读 2018-05-28 10:32:00
    如何签订合同中的不可抗力条款对于不可抗力的定义,《合同法》中第117条第2款做出了... 合同中约定的不可抗力条款一般应规定的内容有: 1、不可抗力事件的范围,即哪些属于不可抗力。具体来说,不可抗力包括自然灾...
  • C++ Gotchas 条款1及条款17

    千次阅读 2003-04-07 10:24:00
    一般都会使得源代码难于阅读和维护,并常常将维护人员引入歧途。考查下面这个简单的语句: a = b; // 将 b 赋值给 a 比起代码本身,这个注释并不能传达更清晰的语句含义,因此是没有用的。实际上,它比没有用还...
  • Effective C++ 条款46

    2015-06-08 10:48:26
    本节条款:需要类型转换时请为模板定义非成员函数这节知识是在条款24的基础上,讲述的有关非成员函数在模板类中(non-member function template)的作用。 我们先看一下条款24讲述的知识核心。条款24讲述了我们如何...
  • iOS开发 - iOS发布条款检查表

    千次阅读 2015-05-15 13:40:11
    序号 分类 条款编号 条款 案例 1 功能 2.1 崩溃的程序将会被拒绝 2 2.2 有错误的程序将会被拒绝 点击版本升级无反应/点击版本升级,在线版本和当前版本都是2.0.3 3 2.3 跟开发者宣传不符的程序将会被拒绝 4 2.4 无...
  • 这两个条款讲述了何时应该使用引用传递pass by reference,何时应该使用值传递pass by value。
  • 这三个条款讨论了封装性和类型转换。讲解了怎么实现更高的封装性以及实现所有参数类型转换。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,056
精华内容 12,822
关键字:

一般条款