2010年6月24日
摘要: 名字查找在编译时发生。对象、引用或指针的静态类型决定了对象能够完成的行为。甚至当静态类型和动态类型可能不同的时候,就像使用基类类型的引用或指针时可能会发生的,静态类型仍然决定着可以使用什么成员。 回忆一下,局部作用域中声明的函数不会重载全局作用域中定义的函数,同样,派生类中定义的函数也不重载基类中定义的成员。通过派生类对象调用函数时,实参必须与派生类中定义的版本相匹配,只有在派生类根本没有定义该... 阅读全文
posted @ 2010-06-24 16:06 cppfans 阅读(173) 评论(0) 推荐(0) 编辑
摘要: 构造函数初始化列表为类的基类和成员提供初始值,它并不指定初始化的执行次序。首先初始化基类,然后根据声明次序初始化派生类的成员。 析构函数的工作与复制构造函数和赋值操作符不同:派生类析构函数不负责撤销基类对象的成员。编译器总是显式调用派生类对象基类部分的析构函数。每个析构函数只负责清除自己的成员。对象的撤销顺序与构造顺序相反:首先运行派生析构函数,然后按继承层次依次向上调用各基类析构函数。 如果... 阅读全文
posted @ 2010-06-24 15:40 cppfans 阅读(112) 评论(0) 推荐(0) 编辑
摘要: C++ 中的函数调用默认不使用动态绑定。要触发动态绑定,满足两个条件:第一,只有指定为虚函数的成员函数才能进行动态绑定,成员函数默认为非虚函数,非虚函数不进行动态绑定;第二,必须通过基类类型的引用或指针进行函数调用。 在某些情况下,希望覆盖虚函数机制并强制函数调用使用虚函数的特定版本,这里可以使用作用域操作符:这段代码强制将 net_price 调用确定为 Item_base 中定义的版本,该调... 阅读全文
posted @ 2010-06-24 14:59 cppfans 阅读(101) 评论(0) 推荐(0) 编辑
  2010年6月23日
摘要: 在C++中,通过基类的引用(或指针)调用虚函数时,发生动态绑定。引用(或指针)既可以指向基类对象也可以指向派生类对象,这一事实是动态绑定的关键。用引用(或指针)调用的虚函数在运行时确定,被调用的函数是引用(或指针)所指对象的实际类型所定义的。 派生类只能通过派生类对象访问其基类的 protected 成员,派生类对其基类类型对象的 protected 成员没有特殊访问权限。 例如,假定 Bulk... 阅读全文
posted @ 2010-06-23 16:20 cppfans 阅读(101) 评论(0) 推荐(0) 编辑
摘要: C++ 语言不要求自增操作符或自减操作符一定作为类的成员,但是,因为这些操作符改变操作对象的状态,所以更倾向于将它们作为成员。 为了与内置类型一致,前缀式操作符应返回被增量或减量对象的引用。 同时定义前缀式操作符和后缀式操作符存在一个问题:它们的形参数目和类型相同,普通重载不能区别所定义的前缀式操作符还是后缀式操作符。为了解决这一问题,后缀式操作符函数接受一个额外的(即,无用的)int 型形参... 阅读全文
posted @ 2010-06-23 15:38 cppfans 阅读(114) 评论(0) 推荐(0) 编辑
  2010年6月17日
摘要: 为了与 IO 标准库一致,操作符应接受 ostream& 作为第一个形参,对类类型 const 对象的引用作为第二个形参,并返回对 ostream 形参的引用。 一般而言,输出操作符应输出对象的内容,进行最小限度的格式化,它们不应该输出换行符。 与输出操作符类似,输入操作符的第一个形参是一个引用,指向它要读的流,并且返回的也是对同一个流的引用。它的第二个形参是对要读入的对象的非 con... 阅读全文
posted @ 2010-06-17 11:14 cppfans 阅读(105) 评论(0) 推荐(0) 编辑
  2010年6月15日
摘要: 尽管大多数对象可以通过运行适当的构造函数进行初始化,但是直接初始化简单的非抽象类的数据成员仍是可能的。对于没有定义构造函数并且其全体数据成员均为 public 的类,可以采用与初始化数组元素相同的方式初始化其成员(根据数据成员的声明次序来使用初始化式。):struct Data { int ival; char *ptr; }; // val1.ival = 0; val1.ptr = 0 Dat... 阅读全文
posted @ 2010-06-15 19:51 cppfans 阅读(90) 评论(0) 推荐(0) 编辑
  2010年6月10日
摘要: 在Perl中对每个数据类型须使用不同的前缀:标量用$,数组用@,哈希表用%。甚至在一些并非数据格式的项前也使用了前缀:子程序的名字使用&,而通配量(代表与变量有关的所有数据类型)使用*。除了使用前缀的项之外,在Perl中还可以给3中不需要前缀的项命名:文件句柄,格式名称,以及目录句柄。Perl从这些量使用的工作环境中知道它们是什么类型。在Perl中还可以使用标号标记代码的位置,它们同样不需... 阅读全文
posted @ 2010-06-10 10:24 cppfans 阅读(145) 评论(0) 推荐(0) 编辑
  2010年6月5日
摘要: 对于 switch 结构,只能在它的最后一个 case 标号或 default 标号后面定义变量 在循环条件中定义的变量在每次循环里都要经历创建和撤销的过程。 应该将不需要修改的引用形参定义为 const 引用。普通的非 const 引用形参在使用时不太灵活。这样的形参既不能用 const 对象初始化,也不能用字面值或产生右值的表达式实参初始化。 既可以在函数声明也可以在函数定义中指定默认实... 阅读全文
posted @ 2010-06-05 17:17 cppfans 阅读(101) 评论(0) 推荐(0) 编辑
摘要: 默认情况下,输出cerr不缓冲 默认情况下,写到clog是带缓冲的 默认情况下,cout是带缓冲的 内置类型变量是否自动初始化取决于变量定义的位置。在函数体外定义的变量都初始化成0,在函数体里定义的内置类型变量不进行自动初始化。 const对象默认为文件的局部变量,非const变量默认为extern。要使const变量能够在其他的文件中访问,必须显式地指定它为extern。 因为头文件包... 阅读全文
posted @ 2010-06-05 17:03 cppfans 阅读(131) 评论(0) 推荐(0) 编辑