C++Primer第七章:类(学习摘录)

1:成员函数的声明必须在类内部,但是定义可以在内部也可以在外部。
2:隐式参数 this
当我们调用一个成员函数时,用请求该函数的对象地址初始化this。例如:
total.isbn()
则编译器负责把total的地址传递给isbn的隐式形参this,可以等价的认为

//伪代码,用于说明调用成员函数的实际执行过程
Sales_data::isbn(&total)

任何对类成员的直接访问都被看做this的隐式引用。this总是指向“当前调用成员函数的对象”,因此this是常量指针,不允许改变this中保存的地址。
3:const成员函数/常量成员函数
格式: 返回值类型 函数名(形参列表) const {函数体} //const跟在形参列表后面
作用:可以被常量对象、常量对象的引用或指针调用。
const的作用是修改this指针的类型,由 Sales_data *const类型变成
const Sales_data *const。
4:编译器分两步处理类:首先编译成员的声明,然后才轮到成员函数体。因此成员函数体可以随意使用类中的其他成员而无需在意这些成员出现的顺序。
5:在类外定义成员函数:

// 成员函数的名字必须包含所属的类名,如果是常量成员函数,后面应该跟const
double Sales_data::avg_price() const
{}

6:因为I0类属于不能被拷贝的类型,因此我们只能铜鼓引用来传递他们。
7:类通过一个或几个特殊的成员函数来控制其对象的初始化过程,这些函数叫做构造函数。构造函数的任务是初始化类对象的数据成员,无论何时只要类的对象被创建,就会执行构造函数。
构造函数特征:
- 构造函数的名字和类名相同;
- 构造函数没有返回类型;
- 类可以包括多个构造函数,但是他们接受的形参应该不同,类似于函数重载;
- 当没有构造函数时,编译器会自动创建一个合成的默认构造函数来控制初始化过程,(只有类没有声明任何构造函数时,编译器才自动生成默认构造函数);
- 对于一个普通的类来说,必须定义它自己的默认构造函数;一旦我们定义了一些其他的构造函数,那么除非我们再定义一个默认构造函数,否则类将没有默认构造函数;
- 自定义的默认构造函数,不接受任何实参。Sales_data();
类初始化时,最好对所有成员都设置初始值,可以使用类内初始值,构造函数初始值列表、构造函数内部赋值。

8:构造函数初始值列表的形式如下:
Sales_data():bookN(s),unit_sold(a),revenue(b) {}
在函数参数列表后以冒号:开始,在函数体{}前结束,使用逗号,隔开

9:访问控制说明符public、private
public:说明符之后的成员在整个程序内可被访问;
private:说明符的成员只能被类的成员函数访问。
说明符在类内出现的次数没有严格规定,作用范围是说明符出现至下一个说明符出现或到达类结尾。
关键字struct和class的不同在于,使用struct,则定义在第一个访问说明符之前的成员是public的,相反,使用class,则是private的。

10:内联函数inline
内联函数的介绍与优缺点:http://blog.csdn.net/lanyzh0909/article/details/8424705
在类内定义的成员函数被自动定义为内联的。也可以在其他函数前面加inline关键字表示内联函数。

12:类的定义分两步处理:
- 首先,编译成员的声明
- 直到类全部可见后才编译函数体
这种两阶段的处理方式只适用于成员函数中使用的名字。声明中使用的名字,包括返回类型或者参数列表中使用的名字,都必须在使用前确保可见。

typedef double Money;
string bal;
class Account{
public:
    Money balance() {return bal;}
private:
    Money bal;
}
/*当编译器看到balance函数的声明语句时,首先在Account类的范围内寻找对Money的声明。
编译器只考虑Account中使用Money前出现的声明,因为没找到匹配的成员,所以编译器会接着道Account的外层作用域中查找。
在这个例子中,编译器会找到Money的typedef语句,该类型被用作balance函数的返回类型以及数据成员bal的类型。
另一方面,balance函数体在整个类可见后才被处理,因此,该函数的return语句返回名为bal的成员,而非外层作用域的string对象。*/

13:成员函数中使用的名字按照如下方式解析:
- 首先,在成员函数内查找该名字的声明。和前面一样,只有在函数使用之前出现的声明才被考虑;
- 如果在成员函数内没有找到,则在类内继续查找,这时类的所有成员都可被考虑;
- 如果类内也没有找到该名字的声明,在成员函数定义之前的作用域内继续查找。
//成员函数可以在类外定义,所以成员函数定义之前的作用域可以更大。

14:如果成员是const或者引用的话,必须使用构造函数初始值列表初始化,不可以使用赋值。
一旦开始执行构造函数体,初始化就完成了。
成员的初始化顺序与它们在类定义中出现的顺序一致

15:委托构造函数:一个委托构造函数使用它所属类的其他构造函数执行自己的初始化过程,或者说把自己的一些(或者全部)职责委托给了其他构造函数。
当一个构造函数委托给另一个构造函数时,受委托的构造函数的初始值列表和函数体被依次执行,然后控制权才交还给委托者的函数体。
可以连续委托,A委托B,而B是委托C的。

16:类的静态成员
- 有时候类需要它的一些成员与类本身直接相关,而不是与类的各个对象保持关联。
- 类的静态成员存在于任何对象之外,对象中不包括任何与静态数据成员有关的数据。
- 静态成员函数也不与任何对象绑定在一起,它们不包含this指针。
- 通过在成员的声明之前加上static在类内声明静态成员,静态成员可以是public或private的。
-

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值