存档

‘C++Primer学习笔记’ 分类的存档

C++Primer学习笔记2_构造函数初始化式

2009年12月25日 mousefire 没有评论

  正如Lippman所说,构造函数初始化列表是许多相当有经验的C++程序员都没有掌握的一个特性。虽然在学习MFC的时候,经常看到这种形式的初始化,但是总觉得格式不漂亮,也没有深究为什么Microsoft的程序员们喜欢这样做,直到今天。且看下面这两段代码:

  1. Sales_item(const std::string &book=""):isbn(book),units_sold(0),revenue(0.0){}
  2. Sales_item(const std::string &book="")
  3. {
  4.     isbn=book;
  5.     units_sold=0;
  6.     revenue=0.0;
  7. }

  第一段代码使用了初始化式,执行构造函数时,直接执行初始化,而第二段代码中,虽然没有显式的初始化式,但是在执行构造函数之前,要初始化isbn成员,由默认的string构造函数执行,在执行构造函数的函数体时,isbn成员已经有值了。这两个构造函数虽然执行结果相同,但是不使用初始化式等于在程序执行时多了一步。这种效率上的损失还不是最糟糕的,在以下情况下,甚至必须要使用初始化列表进行初始化:

1.成员是没有默认构造函数的类

2.成员是const对象

3.成员是引用类型的对象

  要注意的另外一点是:成员初始化的次序并不是它们出现在初始化列表中的次序,而是定义成员的次序.

C++Primer学习笔记1_类作用域

2009年12月24日 mousefire 没有评论

  这一章东西很杂,也很容易混淆。

一、类作用域包括以下内容

1、类定义体

2、在类外定义的成员函数的定义(不包括返回类型)

二、类作用域中的名字查找

1.类成员的声明中用到的名字

(1)检查出现在名字使用之前的类成员的声明。

(2)如果第1步查找不成功,则检查包含类定义的作用域中出现在类定义前的声明。

2.类定义体中的成员函数的函数体中用到的名字

(1)检查成员函数局部作用域中的声明。

(2)检查对所有类成员的声明。

(3)检查在此成员函数定义之前的作用域中出现的声明。

3.定义在外部的成员函数的函数体中用到的名字

  在2的基础上,还会寻找在成员函数定义之前出现的全局作用域声明

分类: C++Primer学习笔记 标签: