1986年《英雄本色》的大受欢迎,不仅令导演吴宇森咸鱼翻生,成为香港黑帮枪战片的一代宗师;更使得周润发成功洗脱”票房毒药”的恶名,变成电影片商眼中的”票房救星”,而周润发笑傲影坛的辉煌时代亦从此时正式开始。
[img]http://blog.sina.com.cn/pic/5572f33e020001z0[/img]
其实在《英雄本色》之前,周润发就已是倍受欢迎的大众偶像,不过当时观众对他的喜爱却并非源于电影,而是他在电视荧屏上的表现。原来周润发十八岁考入香港无线台演员训练班后,只隔两年,便凭电视剧《狂潮》成功上位,之后的《笑傲江湖》和《上海滩》等剧更奠定了周润发在无线台的当红小生地位。
在电视剧领域取得成功后,周润发与其他明星一样,开始走影视双栖的道路。他早在1976年便参与电影演出,80年代初主演过许鞍华的《胡越的故事》、《倾城之恋》,于仁泰的《巡城马》、区丁平的《花城》等名片,亦曾凭借梁普智的《等待黎明》获得台湾金马和亚太影展的双料影帝。只可惜香港本是注重商业的现实社会,周润发演技虽然早已赢得圈内口碑,但主演的影片却多是票房失利之作,由此竟被冠之以”票房毒药”的恶名–这种状况一直到《英雄本色》的出现才得到彻底转变。
[img]http://blog.sina.com.cn/pic/5572f33e020001z1[/img]
《英雄本色》令周润发真正在电影圈大红大紫,观众对周润发的狂热追捧使得之后他主演的任何电影都有不俗的票房,周润发在片商眼中也成了”神仙发”。而他除了继续拍摄一些类似《英雄本色》的黑帮枪战片(如《江湖情》、《江湖龙虎斗》)的同时,还主演了包括赌片(《赌神》)、喜剧片《大丈夫日记》、鬼片(《鬼新娘》)、时装功夫片(《老虎出更》)、人物传记片(《郁达夫传奇》)、暴力写实片(《监狱风云》在内的几乎所有类型片,涉猎之广,对于一位影坛巨星来讲,实属罕见。至于周润发演技之传神精湛更是有目共睹。他塑造的黑帮老大、职业杀手、情场浪子、正义警察等形象栩栩如生,极具角色魅力。尤其值得一提的是,周润发在《秋天的童话》、《阿郎的故事》等片中对社会底层人物的拿捏更是出神入化,令人信服,这些自然源于他自幼家贫、辍学后曾尝试过多种底层工作的丰富人生经验。
据统计,周润发从1986年《英雄本色》到1992年暂别影坛的《侠盗高飞》,共拍摄了37部电影,其中有32部都取得过千万的票房佳绩,而且荣获了三次香港金像奖最佳男主角,一届台湾金马奖影帝,若论产量之丰、质量之高、受欢迎之众,在那6年间,无人能敌发仔!
[img]http://blog.sina.com.cn/pic/5572f33e020001z6[/img]
待到1994年,周润发复出影坛,主演刘镇伟导演的《花旗少林》,满城争睹发仔风采,轻易拿下3700万票房。年底强档出击的《赌神2》再显王者之风,票房狂收5200万,成为香港影史上第一部突破5000万的电影。
1995年,早已闻名国际影坛的周润发在与韦家辉共同完成了颇具黑色个人风格的《老板的故事》之后,终于离开华语影坛,步好友吴宇森后尘,远赴好莱坞发展。其间拍了《血仍未冷》、《再战边缘》、《安娜与国王》三部电影,虽然演技仍受好评,但票房却不如人意,倒是2000年主演的美国投资的华语影片《卧虎藏龙》不仅叫好叫座,更令导演李安和主演周润发、杨紫琼等人再次受到好莱坞青睐。因此,尽管2003年周润发拍摄的好莱坞动作片《防弹武僧》由于水准太低,导致票房惨不忍睹。但媒体普遍认为不关他事,发哥身价居然不降反升,堪称奇事。
[img]http://blog.sina.com.cn/pic/5572f33e020001z2[/img]
[url=http://blog.sina.com.cn/pic/5572f33e020001z3][/url]
在2003年香港电影金像奖颁奖典礼上,好久不见的周润发最后出现,呼吁大家团结起来、齐心协力共度难关,重振港片雄风–而面对这位香港电影辉煌时代的象征人物,其实更多观众的希望是,发哥,你是否该回来了……
所幸发哥不负众望,最近重回华语电影,客串许鞍华的《姨妈》,主演张艺谋的《黄金甲》,等待吴宇森的《赤壁》和杜琪峰的新片。或许,有人说年过五旬的他如今须花体胖,不复昔日”小马哥”的神采,加之香港电影一直低迷,周润发也不过是”一个王朝的背影”,能有多大作为?事实或许如此,但发哥至少在此危急存亡之际回来了,无论成败如何,周润发所展示的都是一个”王者”应有的风采。仅此足矣。
[img]http://blog.sina.com.cn/pic/5572f33e020001z3[/img]
————————————–
[b]《龙虎风云》(1987)[/b]
[b][/b]
[b]导演:林岭东
主演:周润发、李修贤、孙越、吴家丽[/b]
[img]http://blog.sina.com.cn/pic/5572f33e020001yy[/img]
林岭东的《龙虎风云》公映时间只比吴宇森的《英雄本色》晚一年,但它在当时引发的轰动绝不比《英雄本色》逊色。不过,在这部为林岭东夺得香港电影金像奖最佳导演奖的经典影片中,给人印象深刻的却并不是那些精心营造的暴力枪战场面,而是周润发对”警察卧底”这一边缘人物的传神演绎的震惊。
影片的开始便是徐锦江扮演的卧底身份暴露而被黑帮砍死,就已在揭示做”卧底”的悲惨命运,等到后来卧底周润发又一次奉命打入犯罪分子当中时,他的心态已开始变化–都是一样的人,相处久了难免会产生感情,周润发已经在为出卖上一个对自己极好的老大而自责了,这次又碰上了李修贤这个打死他都不信他是卧底的义气汉子,他该怎么办?于是,等到周润发中了自己人(警察)的冷枪倒在李修贤的怀中,李修贤却说什么也不丢下自己的”兄弟”逃走,此时周润发终于说出”我其实是警察”,而李修贤还没来得及做出任何反应之际,周润发便已死去。在影片的最后,我们会看到除了周润发的好友兼上司孙越在惋惜他的死去时,李修贤的眼神也分明在怀念他这个”兄弟”……从这里我们看到的是和中国传统的英雄义气相通的,和吴宇森的《英雄本色》共同的但更深刻的情感!
虽然同样注重兄弟义气的刻画,但林岭东少了吴宇森的浪漫写意,却多了黑色写实。他亦因刻画”边缘人物”而扬名世界影坛,后来西片《落水狗》、《忠奸人》都或多或少受到影响。
[img]http://blog.sina.com.cn/pic/5572f33e020001yz[/img]
—————————————-
[b]《监狱风云》(1987)[/b]
[b][/b]
[b]导演:林岭东
主演:周润发、梁家辉、张耀扬、黄光亮、何家驹[/b]
[b][/b]
[img]http://blog.sina.com.cn/pic/5572f33e020001z4[/img]
当年新艺城以出品喜剧著称,老板麦嘉、石天本身就是著名谐星,对笑片亦情有独钟。不过至80年代后期,喜剧虽然仍是主流,但随着《英雄本色》带出英雄黑帮片的潮流,麦嘉亦审世度势,重用林岭东拍摄警匪片《龙虎风云》叫好叫座后,信心大增,放手让他去搞冷僻的监狱黑幕题材。林岭东果然不负厚望,《监狱风云》一出,立刻以戏剧性的情节冲突和黑色暴力的写实风格引起轰动,并招致《女子监狱》、《狱中龙》、《狱凤》等跟风之作。
《监狱风云》的剧本出自林岭东之兄南燕之手,由于首次编剧,难免心潮澎湃不知遏止,将一部戏写得虽然亮点颇多,却枝蔓过杂
Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/five1kr/www/www/blog/wp-content/plugins/simple-tags/inc/client.php on line 1310
Warning: shuffle() expects parameter 1 to be array, null given in /home/five1kr/www/www/blog/wp-content/plugins/simple-tags/inc/client.php on line 1311
Warning: Invalid argument supplied for foreach() in /home/five1kr/www/www/blog/wp-content/plugins/simple-tags/inc/client.php on line 1312
★Pastry是一套peer-to-peer网络协议,Pastry有如下基本特性:
1. 每个节点都有一个随机生成的128位nodeid.当收到一条含128位key的消息时,节点能高效地将消息发送到在当前节点中,数值上nodeid最接近key的节点.在Pastry网络中里,发送步骤的复杂度应该是O(log N),在每个Pastry节点中,路由表要维护节点数量的复杂度是O(log N).在消息传递经过的每个Pastry节点时,会通知回调函数,应用程序可以对这条消息做一些处理.
2. 每个Pastry节点监视和它nodeid值最接近的L个节点(这个集合叫作leaf set,其中比当前节点nodeid大及小的节点各占L/2),应用程序可以通过回调知道leaf set中新节点的加入,节点的失效,节点的恢复.
3. 在互联网上的位置很重要,Pastry探寻消息传递的最小距离,比如以ping的延时作为判断的依据. Pastry网络是分散的,灵活的,自组织的;当出现新节点,死节点,节点失败时它会自动配置.
★几个重要的参数:
b:一般取1,2,3,4.内部处理128位id时用的进制为(2的b次方).
L: leaf set的容量,一般取(2的b次方)或(2的b+1次方).
M: neighborhood set的容量,一般取(2的b次方)或(2的b+1次方).
为表达方便,N代表网络中存活的节点数.
★节点需要维护的三种数据,如图1:
1. leaf set:
容量为L,用于保存在数值上最接近nodeid的节点,其中smaller和larger各占一半.
2. routing table
Log以(2的b次方)为底N的对数行,每行(2的b次方)-1条数据.第n行表示nodeid与当前节点的前n位相同,且第n+1位与当前节点的不相同.图1中阴影部分表示当前节点nodeid的相应段,把每行的阴影读下来就是当前节点的nodeid.
3. neighborhood set
保存节点的直接邻居(如ping值最小的M个节点),它不是用来路由消息的,而是为配置网络服务的.
图1:
R代表第l(下标)行第i(上标)列.
L代表在leaf set中第i(下标)个最接近当前nodeid的节点.
D(下标l)代表keyD的第l位数值.
Shl(A,B)代表A和B共享的前缀的长度.
★数据的初始化:
当X通过A加入到Pastry时,由于A与X理应是相近的,所以X的neighborhood set初始化为A的.
假设经过A,B,C..最终到达与nodeid数值上最近的点Z. 因为Z与X的leaf set相近,所以用Z的leaf set初始化X的,最后再通过询问L中最大nodeid和最小nodeid以得到X的L应有的节点.
根据routing table自身的定义以及消息路由的算法,假设X的routin table有i行,那么第0行取A的第0行,第1行取B的第1行….如此到Z.如果X的第1位和A的第1位相同,那么直接将A的第0行赋于X的第0行;如果不同,则将A第0行的阴影替换成A, X第0行的阴影位于X第一位的列上,以此类推.
★心得:
Pastry网络是以nodeid在数值上相近作基础的,脱离了实际的网络,而以数理上的id作为路由的算法的依据 .其它像Kademila,Chord也是采用数理上的方法路由,比如Kademila使用异或计算数理上的距离.
Pastry能在无协调的网络中完成消息的路由,而且非常高效,理论路由步数为Log以(2的b次方)为底N的对数,可以看出b决定着全网的性能,b越大当然越高效,但也会使routing table变大,routing table变大不仅占用更多内存,更意味着传递消息时需要探测更多节点,处理更复杂的问题.因此需要根据网络的特性选择一个b值,如果在以PC机组成的Internet上,可以选择4,如果在小型设备的局部网络上,选择2就足够了.哈,我喜欢有弹性的设计.
每个节点可以选择自己的leaf set数量和neighborhood set数量.如果设备的性能比较低(如嵌入式系统),可以选择少一点的值,如果设备的性能比较高当然选择更大的了,这样消息可以传递的更快些,又是弹性设计.
按照Pastry的设计,数据可以存在离数据的key最近的k个节点上(k的大小可以自己定),这样看来Pastry不适合做数据的存储,一是因为现在的网络能力,二是因为现在存储能力,三是因为它查找东西的方法.想像一下,网民甲将电影<<黑客帝国>>放到网上,碰巧"黑客帝国"字符串的hash key和你的id相近,那么通过调用Pastry API就会把这部电影放到你的电脑上(倒霉啊!!),更惨的是如果网民乙搜索"骇客帝国",由于hash肯定与"黑客帝国"不同,所以他根本不知道你这里有这部电影,真是耽误事.
所以Pastry更适合传递消息,比如在一个复杂的无线网络环境中,你根本无法掌控各种设备混乱的通信,这时如果你知道A的nodeid,你完全不用操心就可以给他发消息.但是如此一来,Pastry的机制就要略改一下了,nodeid不再随机,而是像MAC一样固定,确保在未知环境下,网络可以可靠的路由.
参考资料:Pastry: Scalable, distributed object location and routing for large-scale peer-to-peer systems,A. Rowstron and P. Druschel
转载请注明出处
http://blog.csdn.net/cnss
Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/five1kr/www/www/blog/wp-content/plugins/simple-tags/inc/client.php on line 1310
Warning: shuffle() expects parameter 1 to be array, null given in /home/five1kr/www/www/blog/wp-content/plugins/simple-tags/inc/client.php on line 1311
Warning: Invalid argument supplied for foreach() in /home/five1kr/www/www/blog/wp-content/plugins/simple-tags/inc/client.php on line 1312
一、4P 的内涵与应用
在市场营销组合中, 4P 分别是产品( product) , 价格( price) , 地点( place) , 促销( promotion) 。产品的组合, 主要包括产品的实体、服务、品牌、包装。它是指企业提供给目标市场的货物、服务的集合, 包括产品的效用、质量、外观、式样、品牌、包装和规格, 还包括服务和保证等因素。定价的组合, 主要包括基本价格、折扣价格、付款时间、借贷条件等。它是指企业出售产品所追求的经济回报。地点通常称为分销的组合, 它主要包括分销渠道、储存设施、运输设施、存货控制, 它代表企业为使其产品进入和达到目标市场所组织, 实施的各种活动, 包括途径、环节、场所、仓储和运输等。促销组合是指企业利用各种信息载体与目标市场进行沟通的传播活动, 包括广告、人员推销、营业推广与公共关系等等。以上4P ( 产品、价格、地点、促销) 是市场营销过程中可以控制的因素, 也是企业进行市场营销活动的主要手段, 对它们的具体运用, 形成了企业的市场营销战略。
企业要满足顾客, 实现经营目标, 不能孤立地只是考虑某一因素和手段, 必须从目标市场需求和市场营销环境的特点出发, 根据企业的资源和优势, 综合运用各种市场营销手段,形成统一的、配套的市场营销战略, 使之发挥整体效应, 争取最佳效果。从4P 的组合特点分析:
( 1) 具有可控性。构成市场营销组合的各种手段, 是企业可以调节、控制和运用的因素, 如企业根据目标市场情况, 能够自主决定生产什么产品, 制定什么价格, 选择什么销售渠道, 采用什么促销方式。
( 2) 动态性。市场营销组合不是固定不变的静态组合,而是变化无穷的动态组合。企业受到内部条件、外部环境变化的影响, 必须能动地做出相应的反应。
(3) 具有整体性。市场营销组合的各种手段及组成因素, 不是简单的相加或拼凑集合, 而应成为一个有机的整体, 在统一目标指导下, 彼此配合, 相互补充, 能够求得大于局部功能之和的整体效应。
二、4C的内涵与应用
营销学家菲利普·科特勒认为, 企业所有部门为服务于顾客利益而共同工作时, 其结果就是整合营销。其意义就是强调各种要素之间的关联性, 要求它们成为统一的有机体。具体地讲, 整合营销更要求各种营销要素的作用力统一方向, 形成合力, 共同为企业的营销目标服务。4C 的营销观念: 4C 分别是: 消费者( consumer) 、成本( cost) 、便利( convenience) 、沟通( communication) 。4C 强化了以消费者需求为中心的营销组合, 其内涵与应用是:
(1) 消费者( consumer) , 指消费者的需要和欲望( The needs and wants of consumer) 。企业要把重视顾客放在第一位, 强调创造顾客比开发产品更重要, 满足消费者的需求和欲望比产品功能更重要, 不能仅仅卖企业想制造的产品, 而是要提供顾客确实想买的产品。
(2) 成本( cost) , 指消费者获得满足的成本( Cost and value to satisfy consumer needs and wants) , 或是消费者满足自己的需要和欲望所肯付出的成本价格。这里的营销价格因素延伸为生产经营过程的全部成本。包括: 企业的生产成本,即生产适合消费者需要的产品成本; 消费者购物成本, 不仅指购物的货币支出, 还有时间耗费, 体力和精力耗费以及风险承担。新的定价模式要求: 消费者支持的价格—适当的利润= 成本上限。因此, 企业要想在消费者支持的价格限度内增加利润, 就必须降低成本。
(3) 便利( convenience) , 指购买的方便性( Convenience to buy) 。比之传统的营销渠道, 新的观念更重视服务环节,在销售过程中, 强调为顾客提供便利, 让顾客既购买到商品, 也购买到便利。企业要深入了解不同的消费者有哪些不同的购买方式和偏好, 把便利原则贯穿于营销活动的全过程, 售前做好服务, 及时向消费者提供关于产品的性能、质量、价格、使用方法和效果的准确信息。售后应重视信息反馈和追踪调查, 及时处理和答复顾客意见, 对有问题的商品主动退换, 对使用故障积极提供维修方便, 大件商品甚至终身保修。
(4) 沟通( communication) , 指与用户沟通( Communication with consumer) 。企业可以尝试多种营销策划与营销组合, 如果未能收到理想的效果, 说明企业与产品尚未完全被消费者接受。这时, 不能依靠加强单向劝导顾客, 要着眼于加强双向沟通, 增进相互的理解, 实现真正的适销对路, 培养忠诚的顾客。
三、4S 的内涵与应用
4S 分别是: 满意( satisfaction) , 服务微笑服务待客, 速度( speed) , 诚意( sincerity) 。
4S 的行销战略强调从消费者需求出发, 打破企业传统的市场占有率推销模式, 建立起一种全新的“消费者占有”的行销导向。要求企业对产品、服务、品牌不断进行定期定量以及综合性消费者满意指数和消费者满意级度的测评与改进, 以服务品质最优化, 使消费者满意度最大化, 进而达到消费者忠诚的“指名度”, 同时强化了企业的抵御市场风险,经营管理创新和持续稳定增效的“三大能力”。
4S 的行销战略意义是:
1. 满意( satisfaction) 。指顾客满意强调企业以顾客需求为导向, 以顾客满意为中心, 企业要站在顾客立场上考虑和解决问题, 要把顾客的需要和满意放在一切考虑因素之首,要以他人利益为重的真诚, 古人云: “感人心者, 莫先乎情”。要想赢得顾客的人, 必先投之以情, 用真情服务感化顾客, 以有情服务赢得无情的竞争。
2. 服务微笑服务待客( SERVICE) 。指随时以笑脸相迎客人, 因为微笑是诚意最好的象征, 服务包括以下几个内容:
E—即精通业务上的工作, 企业营销人员, 为顾客提供更多的商品信息, 经常与顾客联络, 询问他们是否需要次日送货或更紧急的要求, 此举会使顾客感谢你的提醒所带来的便利; R—即对顾客态度亲切友善, 实行“温馨人情”的用户管理策略, 用体贴入微的服务来感动用户; V—将每位顾客都视为特殊和重要的人物, 顾客是我们的主人, 不是我们的佣人, 顾客是上帝, 我们只有与之友好相处, 才能生存发展; I —即要邀请每一位顾客下次再度光临, 企业要以最好的服务、优质的产品、适中的价格来吸引顾客多次光临;C—要为顾客营造一个温馨的服务环境, 要求企业文化建设加大力度, 从厂容厂貌以及大型商场的环境氛围更要建成现代化的超一流的环保市场, 舒适、温馨、超时代水平; E—行销人员用眼神表达对顾客的关心, 用眼睛去观察, 用头脑去分析, 真正做到对顾客体贴入微关怀的服务。
3. 速度( speed) , 指不让顾客久等, 而能迅速的接待、办理。
4. 诚意( sincerity) , 指以具体化的微笑与速度行动来服务客人。
总之, 4S 要求企业行销人员, 实行“温馨人情”的用户管理策略, 用体贴入微的服务来感动用户, 向用户提供“售前服务”敬献诚心, 向用户提供“现场服务”表示爱心, 向用户提供“事后服务”以送谢心。
四、4PCS 的有机结合与应用
( 一) 从市场营销管理及其哲学的观念分析。传统的市场营销管理模式讲的是企业生产什么样的产品, 采用什么样的推销和促销方式。最终的目标是通过扩大消费者需求获取利润。而现代的市场营销管理哲学是指企业对其营销活动及管理的基本指导思想。它是一种观念———4PCS 的观念, 一种态度或一种企业思维方式, 其核心是正确处理企业、顾客和社会三者之间的利益关系。其观念是:
1. 以企业为中心的市场营销管理观念, 它包括: ⑴生产观念( producting concept) 认为消费者总是喜欢可以随处买到价格低廉的产品, 企业应当集中精力提高生产效率和扩大分销范围, 增加产量, 降低成本。⑵产品观念( product concept) 认为消费者喜欢高质量、多功能和具有某些特色的产品。因此要求企业必须生产优质产品, 并不断精益求精。⑶推销的观念( selling concept) 或营销观念, 认为消费者通常有一种购买惰性或抗衡心理, 若听其自然, 消费者就不会大量购买本企业产品, 因而企业必须积极的推销, 采取多种形式的促销方式, 对消费者进行无孔不入的促销信息“轰炸”,迫使人们不得不买。
2. 以消费者为中心的观念, 又称市场营销观念( Marketing concept) 。要求企业一切计划与策略应以消费者为中心, 正确确定目标市场的需要与欲望, 比竞争者更有效地提供目标市场所要求的满足。要求企业营销管理贯彻“顾客至上”的原则, 将管理重心放在善于发现和了解目标顾客的需要, 并千方百计去满足它, 使顾客满意, 从而实现企业目标。
3. 社会营销观念( Societal Marketing concept) 。随着全球环境破坏、资源短缺、人口爆炸等问题日益严重, 要求企业顾及消费者整体与长远利益即社会利益的呼声越来越高。市场营销学界提出了一系列的新观念。如人类观念( Human concept) 、理智消费观念( Intelligent consumption concept) 、生态准则观念( Ecological Imperative concept) 。其共同点认为企业生产经营不仅要考虑消费者需要, 而且要考虑消费者和整个社会的长远利益———被称为社会营销观念。此观念要求企业任务在于确定目标市场的需要、欲望和利益, 比竞争者更有效地使顾客满意, 同时维护与增进消费者和社会福利。
(二) 从市场行销战略及经营方法上分析。传统的经营模式是建立简单的流通在渠道上, 企业从生产至销售到消费者手中是一条简单的流通渠道。企业只为生产而销售, 对消费者的满意、利益及服务只是应服。而现代的行销观念在建立在4PCS 的基础上。
首先要求企业要全面树立以顾客为中心的价值观, 更适合现代市场的营销观念; 它倡导“做生意就是要创造顾客,留顾客”发展“连锁顾客”。
第二以顾客需求为导向, 通过顾客的满意系统的运行,赢得忠诚满意的顾客群。
第三企业必须透露出一种以他人利益为重的真诚, 可信。这在我国企业界普遍低下的状况中, 尤为重要。古人云:“感人心者, 莫先乎情”。要想赢得顾客的心, 必先投之以情, 用真情服务感化顾客, 以有情服务赢得无情的竞争。
第四, 企业在实际的运作的要点上, 强调的是以顾客满意为中心, 要站在顾客的立场上考虑和解决问题, 要把顾客的需要和满意放在一切考虑的因素之首。
总之, 4PCS 的有机结合的应用, 要求企业的全部生产、经营活动都要从满足顾客需要出发, 以提供满足顾客需要的产品或服务为企业责任和义务; 以顾客满意为企业经营目的。
[参考文献]
[1] 严世华. CS 经营法[ M] . 北京: 经济管理出版社, 2003.
[2] 吴健安. 市场营销学[M] . 北京: 高等教育出版社, 2003.
【本文来源】:华东经济管理 2004年8月
Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/five1kr/www/www/blog/wp-content/plugins/simple-tags/inc/client.php on line 1310
Warning: shuffle() expects parameter 1 to be array, null given in /home/five1kr/www/www/blog/wp-content/plugins/simple-tags/inc/client.php on line 1311
Warning: Invalid argument supplied for foreach() in /home/five1kr/www/www/blog/wp-content/plugins/simple-tags/inc/client.php on line 1312
http://blog.csdn.net/flycam/archive/2005/12/20/556816.aspx
【规则1-2-1】为了防止头文件被重复引用,应当用ifndef/define/endif结构产生预处理块。
l 【规则1-2-2】用 #include <filename.h> 格式来引用标准库的头文件(编译器将从标准库目录开始搜索)。
l 【规则1-2-3】用 #include “filename.h” 格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)。
2 【建议1-2-1】头文件中只存放“声明”而不存放“定义
——————————–
4.3.1 布尔变量与零值比较
l 【规则4-3-1】不可将布尔变量直接与TRUE、FALSE或者1、0进行比较。
根据布尔类型的语义,零值为“假”(记为FALSE),任何非零值都是“真”(记为TRUE)。TRUE的值究竟是什么并没有统一的标准。例如Visual C++ 将TRUE定义为1,而Visual Basic则将TRUE定义为-1。
假设布尔变量名字为flag,它与零值比较的标准if语句如下:
if (flag) // 表示flag为真
if (!flag) // 表示flag为假
其它的用法都属于不良风格,例如:
4.3.2 整型变量与零值比较
l 【规则4-3-2】应当将整型变量用“==”或“!=”直接与0比较。
假设整型变量的名字为value,它与零值比较的标准if语句如下:
if (value == 0)
if (value != 0)
4.3.3 浮点变量与零值比较
l 【规则4-3-3】不可将浮点变量用“==”或“!=”与任何数字比较。
千万要留意,无论是float还是double类型的变量,都有精度限制。所以一定要避免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。
假设浮点变量的名字为x,应当将
if (x == 0.0) // 隐含错误的比较
转化为
if ((x>=-EPSINON) && (x<=EPSINON))
其中EPSINON是允许的误差(即精度)。
4.3.4 指针变量与零值比较
l 【规则4-3-4】应当将指针变量用“==”或“!=”与NULL比较。
指针变量的零值是“空”(记为NULL)。尽管NULL的值与0相同,但是两者意义不同。假设指针变量的名字为p,它与零值比较的标准if语句如下:
if (p == NULL) // p与NULL显式比较,强调p是指针变量
if (p != NULL)
————————-
循环语句的效率
————————–
const数据成员的初始化只能在类构造函数的初始化表中进行,例如
class A
{…
A(int size); // 构造函数
const int SIZE ;
};
A::A(int size) : SIZE(size) // 构造函数的初始化表
{
…
}
A a(100); // 对象 a 的SIZE值为100
A b(200); // 对象 b 的SIZE值为200
———————————
规则6-1-3】如果参数是指针,且仅作输入用,则应在类型前加const,以防止该指针在函数体内被意外修改。
例如:
void StringCopy(char *strDestination,const char *strSource);
【规则6-1-4】如果输入参数以值传递的方式传递对象,则宜改用“const &”方式来传递,这样可以省去临时对象的构造和析构过程,从而提高效率。
————————————-
7.1内存分配方式
内存分配方式有三种:
(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
(3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
————————————–
u 内存分配未成功,却使用了它。
编程新手常犯这种错误,因为他们没有意识到内存分配会不成功。常用解决办法是,在使用内存之前检查指针是否为NULL。如果指针p是函数的参数,那么在函数的入口处用assert(p!=NULL)进行检查。如果是用malloc或new来申请内存,应该用if(p==NULL) 或if(p!=NULL)进行防错处理。
——————————
C++/C程序中,指针和数组在不少地方可以相互替换着用,让人产生一种错觉,以为两者是等价的。
数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。
指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。指针远比数组灵活,但也更危险
示例7-3-1中,字符数组a的容量是6个字符,其内容为hello\0。a的内容可以改变,如a[0]= ‘X’。指针p指向常量字符串“world”(位于静态存储区,内容为world\0),常量字符串的内容是不可以被修改的。从语法上看,编译器并不觉得语句p[0]= ‘X’有什么不妥,但是该语句企图修改常量字符串的内容而导致运行错误。
7.3.2 内容复制与比较
不能对数组名进行直接复制与比较。示例7-3-2中,若想把数组a的内容复制给数组b,不能用语句 b = a ,否则将产生编译错误。应该用标准库函数strcpy进行复制。同理,比较b和a的内容是否相同,不能用if(b==a) 来判断,应该用标准库函数strcmp进行比较。
语句p = a 并不能把a的内容复制指针p,而是把a的地址赋给了p。要想复制a的内容,可以先用库函数malloc为p申请一块容量为strlen(a)+1个字符的内存,再用strcpy进行字符串复制。同理,语句if(p==a) 比较的不是内容而是地址,应该用库函数strcmp来比较。
// 数组…
char a[] = "hello";
char b[10];
strcpy(b, a); // 不能用 b = a;
if(strcmp(b, a) == 0) // 不能用 if (b == a)
…
// 指针…
int len = strlen(a);
char *p = (char *)malloc(sizeof(char)*(len+1));
strcpy(p,a); // 不要用 p = a;
if(strcmp(p, a) == 0) // 不要用 if (p == a)
————————————
针p指向a,但是sizeof(p)的值却是4。这是因为sizeof(p)得到的是一个指针变量的字节数,相当于sizeof(char*),而不是p所指的内存容量
void Func(char a[100])
{
cout<< sizeof(a) << endl; // 4字节而不是100字节
}
———————————–
毛病出在函数GetMemory中。编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是 _p,编译器使 _p = p。如果函数体内的程序修改了_p的内容,就导致参数p的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_p申请了新的内存,只是把_p所指的内存地址改变了,但是p丝毫未变。所以函数GetMemory并不能输出任何东西。事实上,每执行一次GetMemory就会泄露一块内存,因为没有用free释放内存
———————————–
用函数返回值来传递动态内存这种方法虽然好用,但是常常有人把return语句用错了。这里强调不要用return语句返回指向“栈内存”的指针,因为该内存在函数结束时自动消亡,见示例7-4-4。
char *GetString(void)
{
char p[] = "hello world";
return p; // 编译器将提出警告
}
————————————-
用调试器跟踪示例7-5,发现指针p被free以后其地址仍然不变(非NULL),只是该地址对应的内存是垃圾,p成了“野指针”。如果此时不把p设置为NULL,会让人误以为p是个合法的指针。
——————————-
alloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
函数malloc的原型如下:
void * malloc(size_t size);
用malloc申请一块长度为length的整数类型的内存,程序如下:
int *p = (int *) malloc(sizeof(int) * length);
我们应当把注意力集中在两个要素上:“类型转换”和“sizeof”。
u malloc返回值的类型是void *,所以在调用malloc时要显式地进行类型转换,将void * 转换成所需要的指针类型。
u malloc函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数。我们通常记不住int, float等数据类型的变量的确切字节数。例如int变量在16位系统下是2个字节,在32位下是4个字节;而float变量在16位系统下是4个字节,在32位下也是4个字节。
free(p)能正确地释放内存。如果p是NULL指针,那么free对p无论操作多少次都不会出问题。如果p不是NULL指针,那么free对p连续操作两次就会导致程序运行错误。
———————————–
运算符new使用起来要比函数malloc简单得多,例如:
int *p1 = (int *)malloc(sizeof(int) * length);
int *p2 = new int[length];
这是因为new内置了sizeof、类型转换和类型安全检查功能。对于非内部数据类型的对象而言,new在创建动态对象的同时完成了初始化工作。如果对象有多个构造函数,那么new的语句也可以有多种形式。例如
在用delete释放对象数组时,留意不要丢了符号‘[]’。例如
delete []objects; // 正确的用法
delete objects; // 错误的用法
后者相当于delete objects[0],漏掉了另外99个对象。
——————————————
如果C++程序要调用已经被编译后的C函数,该怎么办?
假设某个C函数的声明如下:
void foo(int x, int y);
该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字用来支持函数重载和类型安全连接。由于编译后的名字不同,C++程序不能直接调用C函数。C++提供了一个C连接交换指定符号extern“C”来解决这个问题。例如:
extern “C”
{
void foo(int x, int y);
… // 其它函数
}
或者写成
extern “C”
{
#include “myheader.h”
… // 其它C头文件
}
这就告诉C++编译译器,函数foo是个C连接,应该到库中找名字_foo而不是找_foo_int_int。C++编译器开发商已经对C标准库的头文件作了extern“C”处理,所以我们可以用#include 直接引用这些头文件。
———————————————-
对于任意一个类A,如果不想编写上述函数,C++编译器将自动为A产生四个缺省的函数,如
A(void); // 缺省的无参数构造函数
A(const A &a); // 缺省的拷贝构造函数
~A(void); // 缺省的析构函数
A & operate =(const A &a); // 缺省的赋值函数
———————————————–
构造从类层次的最根处开始,在每一层中,首先调用基类的构造函数,然后调用成员对象的构造函数。析构则严格按照与构造相反的次序执行,该次序是唯一的,否则编译器将无法自动执行析构过程。
一个有趣的现象是,成员对象初始化的次序完全不受它们在初始化表中次序的影响,只由成员对象在类中声明的次序决定。这是因为类的声明是唯一的,而类的构造函数可以有多个,因此会有多个不同次序的初始化表。如果成员对象按照初始化表的次序进行构造,这将导致析构函数无法得到唯一的逆序
————————————————
u 如果输入参数采用“指针传递”,那么加const修饰可以防止意外地改动该指针,起到保护作用。
例如StringCopy函数:
void StringCopy(char *strDestination, const char *strSource);
对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const引用传递”,目的是提高效率。例如将void Func(A a) 改为void Func(const A &a)。
对于内部数据类型的输入参数,不要将“值传递”的方式改为“const引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如void Func(int x) 不应该改为void Func(const int &x)。
————————————————–
u 如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。
例如函数
const char * GetString(void);
如下语句将出现编译错误:
char *str = GetString();
正确的用法是
const char *str = GetString();
u 如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const修饰没有任何价值。
例如不要把函数int GetInt(void) 写成const int GetInt(void)。
同理不要把函数A GetA(void) 写成const A GetA(void),其中A为用户自定义的数据类型
—————————————————-
任何不会修改数据成员的函数都应该声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其它非const成员函数,编译器将指出错误,这无疑会提高程序的健壮性。
以下程序中,类stack的成员函数GetCount仅用于计数,从逻辑上讲GetCount应当为const函数。编译器将指出GetCount函数中的错误。
class Stack
{
public:
void Push(int elem);
int Pop(void);
int GetCount(void) const; // const成员函数
private:
int m_num;
int m_data[100];
};
int Stack::GetCount(void) const
{
++ m_num; // 编译错误,企图修改数据成员m_num
Pop(); // 编译错误,企图调用非const函数
return m_num;
}
const成员函数的声明看起来怪怪的:const关键字只能放在函数声明的尾部,大概是因为其它地方都已经被占用了。
———————————————-
#ifndef GRAPHICS_H // 防止graphics.h被重复定义
#define GRAPHICS_H
#include <math.h>// 引用标准库的头文件…
#include “myheader.h” // 引用非标准库的头文件…
void Function1(…); // 全局函数声明…
class Box // 类结构声明{…};
#endif
——————————————-








