`
libran
  • 浏览: 187634 次
  • 性别: Icon_minigender_1
  • 来自: 天津
文章分类
社区版块
存档分类
最新评论

C++ Primer读书笔记

阅读更多
 
注:本文www.Eachfun.com
         (整理说明:本资料是我在网上无意间找到的,读起来感觉不错,但由于原文是每章一个网页的格式,读起来不是很习惯,而且也不方便保存,所以我花了2个多小时的时间将所有网页的内容综合整理了一下,但最后才发现,文章的顺序颠倒了,所以各位如果愿意阅读本文的话,请从后面向前读,每个红色“标题”代表一章,如有不便还请各位见谅,或到原文网站阅览)
标题:函数再
函数是C++提出来的概念,但是在C中却未必没有。比如“1+3”“1.0+3.0”然都是加法,做的却不是同的操作:编译器要因操作数的不同而用不同的加法操作。只是C言中除了内部量可以参与运算以外,没有这么高深的概念。构体也只是内存数据的组织方法,而不整个构体的理。所以,在C编译器明明做了似于重的事情,却可以像雷做好事不留名
  C++展出了,并且予了很高的期望,象也能像内置象一参与一切运算。那,就拿加法运算来编译器如何知道类对象的加法该调用哪一个详细的操作代?于是,即使不出普通函数的重,至少运算符是要重的。
  林博士在《高C++/C程指南》中函数的必要性提了另一个理由:的构造函数名称必名相同,而常要定多个不同的构造函数。那就只好重了。
  于普通程序,我完全可以不用考这么深。重函数至少还带来了另一个好:不用记忆多个不同的函数名了,也不用函数起名而汁了。不书还给出了一个建:并不是任何候都有必要重函数的,有的候不同的函数名可以直来好多信息,用重只是牲了名称中的信息。
 
标题::重函数的概念
引用:出在相同作用域中的两个(可以是两个以上——猫注)函数,如果具有相同的名字而形参表不同,函数。
  本节开头第一句出了重函数的定:重函数必符合两个条件:一是出在相同的作用域中、二是函数名字相同而形参表不同。
  其中第一个条件一般人往往是不去想的,其函数名相同而作用域不同的函数大大存在,比如在MFC中就有。它是完全不相干的函数。
  第二个条件可以详说一下:函数名字相同当然不在下,是函数被称的根源。之于形参表不同,可能表在形参个数不同、可能表在形参型不同、可能表在形参序不同。
  如果要可以不是重函数的情况。
  一、如果既在同一作用域下、名称也相同、形参表也相同,后者被视为前者的重声明。——函数可以重声明,因函数的声明并不生目,但是函数的定不允
  二、如果既在同一作用域下、名称也相同、形参表也相同,但是返回不同,后者被视为错误的声明。函数不可以只凭返回来区分,因为调用函数的候只凭名称和形参来选择函数,而不凭返回。再究其原因,一是因函数的返回可以被弃;二来即使不弃,将返回值赋予另一个量之前没必要检查我需要什么样的返回,而能否赋值也与函数本身无
  三、有些候看起来形参表不同,实际上是完全相同的,本第229页讲了四组这样的例子:
Record lookup(const Account &acct);
Record lookup(const Account &);//
在于有没有形参命名
typedef Phone Telno;
Record lookup(const Phone&);
Record lookup(const Telno&);//
只是给类型取了个
Record lookup(const Phone&, const Name&);
Record lookup(const Phone&, const Name& = "");//
在于形参提供了默认值
Record lookup(Phone);
Record lookup(const Phone);//
在于是否const  
  其中第三可能会生函数的形参个数不同的假像,其可缺省的形参并没有减少形参的个数。第四有点不容易搞清:因有的候可以凭是否const来重,比如引用传递和指针传递
 
标题::文件的组织
一个程序往往由多个源文件成,些代究竟应该放在哪个源文件里、哪些代可以放在同一个源文件里、哪些代必需分放。是一个管理面的问题
  它是管理面的问题,是因为这些代组织往往没有惟一的准。但是它们还是有一定的律的。
  首先,件的维护是一个复杂的系工程。代组织应该有利于维护应该尽量把直接相的内容放在同一文件、不相的内容放在不同的文件里。如果些代码还和疏,那就要分不同的文件来存放了。
  其次,件的代是一个格的组织体系。不同的内容之可能是并列的,也可能有必要的先后系。于是在“#include”候要注意序。
  最后,也是最重要的一点,有些代在同一工程中可以重用(或必重用),有些代在同一个工程中只能出一次。可以重用的有的声明、函数的声明、量的声明等,不可以重用的是体、函数的体、量的定等。那,把可以重用的内容放在h文件中,把不可以重用的放在cpp文件中是一个好法。
  拿的声明和例,如果把一个的所有内容一古放在同一个文件中,将可能出现问题。因在其它用到类实例的地方都必须让类的声明,所以我往往在文件部加个“#include”体也被编译多次,在时产生冲突。
  在前文中曾提到,内函数是惟一允(也是必)在编译时让函数体可的的函数。所以内函数可以放在h文件中。C++规则中有一句正好与此照:在的声明中直接写出的函数被认为是内函数。
  Visual C++给类的文件起默,文件名往往与名一致。如果名由“C”开头文件会是除去开头“C”字以外的其它文字。如“CMyClass”,它的代存放在以下两个文件中:“MyClass.h”“MyClass.cpp”中。原因是VC++议类名以C开头,至于在文件名中不出现开头“C”,可能是出于微习惯
 
标题:的构造函数
引用:构造函数是特殊的成函数。
  笔:构造函数的确是一特殊的成函数。它的特殊性至少表在以下几个方面:一是它的用不用程序操心,只要类对象被建它就会被用,而且它不允被程序员显式地用。二是它是必需的,如果程序员偷懒编译器将自动创简单的构造函数。三是它的名字不用程序多考,直接与名相同。四是它没有返回
  下面详说这几个特性:
  一、它类对象被动调用,象可能有以下方法:程序中用声明量的句直接声明建,或者在程序中用new关键动态创建。方法都可以象,也都可以象数。只要有一个象被建,构造函数就被用一次。
  如果程序式地用构造函数那是不行的。正因如此,构造函数中有一特定的部分叫初始化列表,通它程序可以用基或成的构造函数。必竟设计千差万,如果某个的基或(和)成有多个构造函数,那该类指定用哪一个构造函数,否则类的功能将大打折扣。用构造函数不是程序的事,程序应该管也管不了。初始化列表解决问题而生,所以只有构造函数才有初始化列表,其它函数不能有。
  上面到的大打折扣究竟是怎的折扣呢?如果不能指定基和成用哪一个构造函数,那就只好让编译器去挑了,构造出来的象往往不符合要求,只好用基和成的其它函数,比如赋值函数或其它行参数定的函数——当然,基和成包含这样的函数。这样就浪源。
  二、包含构造函数——确切地是必包含无参数构造函数和拷构造函数——原因是因用是自的。如果两个函数根本就没有,你如何用?所以,C++也不含糊,你要是得写,它就帮你写一个简单的。简单就意味着至少要失一些功能,如果类设计得比较复杂(比如包含指操作)可能引起灾性事故。
  三、函数名与名一致。构造函数的名称是必特殊的,即使个特殊不表在与名相同,也必找到另一个规则实现。因要自动调些函数,你就必须让知道哪些函数是构造函数。
  第四个特性直接改C/C++言的一条规则C定,如果函数没有明指出返回型,那C认为返回int型。C言之所以可以有规则,一是因返回int的函数很多,二是因即使没有返回,也必指明void。当制定规则的人无法料到,C++中居然会出void都不是的返回的函数,void然表示不返回任何,必竟与构造函数的没有返回是两事。于是,C++定:在定或声明函数,没有式指定返回型中不合法的。当然的构造函数除外。
  构造函数的出有它的可行院厝恍浴?尚行允怯捎++包含成函数,既然可以包含普通的成函数,那包含特殊的函数自然也不在下。必然性是由于象往往必须经过特定的初始化。C++到来之前,C言中的数据型只是内置型。于内置象,如果忘了初始化,大不了象失去作用,但是不会致大的问题。比如一个int,无内存如何随机,它的取都不会超int能表达的范行运算也不会生危(溢出不能算危,即使初始化的数据也不能保不溢出,而且溢出只是一种逻辑问题)。但是在的这么简单了,忘了初始化往往将来运行错误。于其次都要考数据的初始化,不如把个初始化写成一的函数,动调用来得既安全又方便
 
 
标题:的成函数
C言中的构体最大的区就是可以函数,而构体只是一个内存。所以,要提就不得不提成函数。
  的成函数与普通函数(全局函数)相比,最根本的区实现的封装性。封装性的第一个表访问权限:都是函数,但是你能访问哪个不能访问哪个却可以定。第二个表是直,通过类(或指)来用函数,人的直就是提供的功能。你好像“Bird.Fly();”一目了然。
  在理解this以前要想底理解成函数是有困的,我就曾以例中保存了函数的副本。要不然,同一个的不同个函数有不同的效果呢?原来,在函数所有的形参之外,有一个不用你操心的参数this,它是一个指的目就是函数的用者。这么就明白了。
  函数形参表后加入const就成了“const函数这样的函数保用者自身不被修改。如CStringGetLength()函数,你只能取它的度,不能修改它的内容或度。加入const的作用倒不是怕用者修改,而是防止写函数的人不小心改象。因百密有一疏,万一在某个不修改数据的函数中改了数据(比如将“==”写成“=”),或者万一用了另一个非const的成函数都将可能引起错误。在写函数前就先加上const可以记编译器来帮你检查
  const加在形参表的后面得有些怪怪的,造成怪怪的原因就是因函数的形参表中没有this,也就没有能用const来修西了。林锐说大概是因其它地方都已被占用了并不是根本原因。
 
标题::内函数
函数应该了改善C言中的宏替的不足而生的吧。因宏替预编译中直接展的,展开过程中将生意想不到的果。典型的有“#define MAX(a, b) (a) > (b) ? (a) : (b)”“result = MAX(i, j)+2;”将被展开为“result = (i) > (j) ? (i) : (j) + 2;”然外面再加一括号可以解决以上问题,但是“result = MAX(i++, j);”被展后将
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics