现在的位置: 首页 > 综合 > 正文

C++ Primer阅读心得九

2013年05月30日 ⁄ 综合 ⁄ 共 1841字 ⁄ 字号 评论关闭

 1.数据抽象与封装:数据抽象是一种依赖于接口和实现分离的编程技术,用户只需要了解接口就可以使用,而不用去关心实现细节。封装是将低层次的元素组合起来形成新的、高层次实体的技术,函数是一些简单语句的封装。C++的类通过访问控制符提供数据抽象和封装,public标识了类的接口定义了数据抽象,private封装了类的实现细节。在类的定义中,同一个访问控制符可以出现多次,其作用范围从出现到下一个控制符或者类定义的结尾为止。

2.类单独成为一个作用域,同一个作用域的成员(数据或者成员)可以直接访问,在类内部定义的类型别名只能在类内部使用,对于类外部定义的成员函数:参数列表和函数体内部处在类作用域中,返回值则不处在类作用域中,如果使用需要额外声明。成员函数只能重载成员函数,不能重载类之外的函数,因为作用域不同。

3.不完全类型:只声明或者没有完成定义(在定义中)的类被称为不完全类型,不完全类型只能用来定义引用或指针。例:

class screen;  //不完全类型

class screen
{
   ...
   screen
* ps;  //在这里,screen也是不完全类型,因为没有定义完
   ...
}
;

4.类定义之后并不分配内存空间,只有使用这个类定义了一个对象之后才分配内存。

5.类定义之后可以跟一个对象定义列表,所以类定义要以分号结尾,由于类定义通常放置在头文件中,所以其后通常不定义对象而直接以分号结尾。

6.const成员函数与this指针:this指针是const指针(指向不可变),在const成员函数中this将变为const this,也就是一个指向const对象的const指针(const T *const this),如果返回这个this或者*this,这将会影响该函数的应用范围,所以应当重载一个非const成员函数版本以方便使用。

7.可变数据成员:将一个数据成员标记为mutable,则这个数据成员就成为了可变数据成员,在const成员函数中也可以修改该数据成员。

8.类作用域中的名字查找优先在类定义域中进行,而后是在包围该类作用域的大定义域中查找,注意这些查找都是前向查找。所以在类外部定义的成员函数的参数和返回值,有时虽然可能名称相同但却是不同的类型。例:

typedef double TYPE;

class test
{
    typedef 
int TYPE;
    TYPE test(TYPE);
}
;

TYPE test::test(TYPE a)  
//error, 声明时返回int,在这里返回double,这是因为返回值不属于类定义域造成的
{
    ...
}

9.不可以将构造函数定义为const成员函数,因为这是矛盾的。

10.构造函数分两个阶段进行:1)初始化数据成员;2)运行函数体中的代码。我们可以使用初始化列表来控制初始化阶段,指定数据成员初始化的值。通常情况下,我们既可以使用初始化列表完成构造,也可以在构造函数内部编写代码完成构造;这两种的区别在于,使用初始化列表属于对数据成员的直接初始化,而编写代码数据成员先由编译器默认初始化再赋值为程序员给定的值。

11.如果类的数据成员没有默认构造函数或者不支持赋值操作,那么这个类必须使用初始化列表完成构造;具体来说:1)const数据成员;2)引用数据成员;3)数据成员不能默认初始化(无默认构造函数或父类无默认构造函数);4)数据成员不能赋值(例如iostream)

12.初始化列表中一个数据成员的()里必须提供初始化(构造函数)所需的足够参数,参数可以是一个表达式。

13.类中成员数据的初始化顺序是按照声明的顺序来的,先声明的先初始化。

14.全部具有默认实参的构造函数等同于默认构造函数,一旦类定义了任意一个构造函数,编译器就不再为类提供合成的默认构造函数了。

15.可以将类、类的成员函数或者普通函数声明为一个类的友元,特许它们访问自己的全部成员(包括私有成员)。

16.static成员属于类本身,并不属于任何一个类的对象。static数据成员不可以在类定义中初始化,只能在类定义外面初始化,而const static数据成员只能在类定义时初始化。static成员函数只能访问static数据对象和其他static成员函数,不可以访问非static得数据对象和成员函数,因为在static中无法知道它们能不能使用(类对象可能未初始化),同理static成员函数中也没有this指针。

抱歉!评论已关闭.