C++ Primer 第12章 类 总结篇

12.1类的定义和声明

1. 类成员:数据,函数或类型别名

2.类内部定义的函数默认为inline。

3.构造函数初始化列表:

SalesItem(): param1(0), param2(0) {}


4.const成员函数:不能改变其所操作的对象的数据成员,必须同时出现在声明和定义中

double avgprice() const;

5.抽象接口、封装实现。访问标号。

6.在声明和定义处指定inline都是合法的。inline成员函数的定义必须在调用该函数的每个源文件是可见的

   不在类定义体内定义的inline成员函数,其定义通常应放在有类定义的同一头文件中。

7.前向声明,不完全类型。声明之后、定义之前,类Screen是一个不完全类型。  

不能定义该类型的对象,可以是指针及引用,或用于声明(不是定义)使用该类型作为形参类型或返回类型的函数。

类的前向声明一般用来编写相互依赖的类。

8.创建类的对象之前,使用引用或指针访问类的成员之前,都必须先定义类。

 

12.2隐含的this指针

1.显示使用this指针:成员函数返回调用该函数的对象的引用。

Screen& Screen::set(char c) { … return *this; }  this是一个指向非常量Screen的指针。

2. this是一个const指针,对于const成员函数,this指向对象为const,非const成员函数,this指向对象不是const。
3. const成员函数若返回指向类对象的引用,则必须也是const的类对象的引用。

4. 能用非const对象调用const的成员函数。反正不改变对象不会有什么影响。

    不能用const对象调用非const的成员函数。因为有可能改变对象内容。

5.基于成员函数是否为const,可以重载一个成员函数。

6.基于一个指针形参是否指向const类型,可以重载一个函数。

7. const对象只能使用const的成员。

   非const对象可以使用任一成员,但非const版本是一个更好的匹配。

8.可变数据成员:mutable,任何时候都可以改变,const对象或const成员函数。

12.3类作用域

1. 定义类型的成员,使用作用域操作符来访问,如Screen::index。

2. 形参表和函数体处于类作用域(可以不用完全限定名),函数返回类型的名字在类作用域之外。

    如果返回类型使用由类定义的类型,则必须使用完全限定名

3. 必须在类中先定义类型名字,才能将他们用作数据成员的类型,或者成员函数的返回类型或形参类型。

4. 名字必须在使用之前进行定义。一旦一个名字被用作类型名,该名字就不能被重复定义。

12.4构造函数

1.   构造函数不能声明为const。

2. 构造函数的初始化式只在构造函数的定义中而不是声明中指定。显示初始化。

3.构造函数分为2个阶段:类类型数据成员总是在初始化阶段初始化了。

   初始化阶段:有初始化列表就显示初始化,没有初始化列表就隐式初始化。

   计算阶段:由构造函数函数体中的所有语句组成。

4. 初始化阶段若没有显示初始化,类类型调用默认构造函数,内置类型根据对象的作用域:全局为0,局部不被初始化。

5.若类类型没有默认构造函数,就必须提供初始化式。

6.没有默认构造函数的类类型成员,以及const或引用类型的成员,必须在构造函数的初始化列表中进行初始化

7.可以初始化const对象或引用类型的对象,但不能对它们赋值。

8.成员被初始化的次序就是定义成员的次序。

9.我们更喜欢默认实参,因为它减少代码重复。

   将默认构造函数和接受一个参数的构造函数合并为一个有默认实参的构造函数。

10.只有当一个类没有定义构造函数时,编译器才会自动生成一个默认构造函数。

11.单形参构造函数容易导致隐式类型转换。

12.explicit防止隐式转换,只能用于类内部的构造函数声明上,类外部所做的定义不能再添加explicit。

 

12.5友元

1.   友元不是类的成员,但仍是类的“接口组成部分”。不受访问控制的影响。可出现在类的任何地方。

2. 友元允许非成员函数访问一个类色私有成员。friend。

3.友元的声明只能出现在类定义的内部。

4.友元可以是普通的非成员函数,或前面定义的其他类的成员函数,或整个类。

 

12.6static类成员

1.  static数据成员独立于该类的任意对象而存在。每个static数据成员与类关联,不与类的对象关联。

2. 对象没有与static数据成员对应的数据成员。每个static数据成员存在一个单独的对象,由该类型的全体对象共享。

3.对象,指针,类名均可调用static成员。

4.static关键字只出现在类定义体内部的声明处。定义不能再添加static关键字。

5.static函数没有this指针。

6.static成员函数不能被声明为const,不能被声明为虚函数。

7.static数据成员必须在类定义体的外部定义。不能在类定义体中定义(初始化)。

   static成员不是通过构造函数进行初始化,而在定义时进行初始化。

8.const static数据成员可以在类的定义体中初始化。

9.const static数据成员在类的定义体中初始化时,该数据成员仍必须在类的定义体之外进行定义。

   在类内部若已经提供了初始化式,那么在外部的定义就不必再指定初始值。

10.static数据成员的类型可以是该成员所属的类类型。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值