再学C++ Primer(9)-类

来源:互联网 发布:监控ip修改软件 编辑:程序博客网 时间:2024/05/19 02:19
将关键字const加在形参表之后,就可以将成员函数声明为常量,const成员不能改变其所操作的对象的数据成员,const必须同时出现在声明和定义中.

数据抽象和封装的两个重要优点:
1)避免类内部出现无意的,可能破坏对象状态的用户级错误。
2)随时间推移可以根据需求改变或缺陷报告来完善类实现而无需改变用户级代码。

构造函数初始化式
初始化列表
Sales_item::Sales_item(const string &book):isbn(book),units_sold,revenue(0.0){}
等价于
Sales_item::Sales_item(const string &book)
{
isbn=book;units_sold=0;revenue=0.0;
}

初始化数据成员与对数据成员赋值的含义是什么?有什么区别?
首先把数据成员按类型分类并分情况说明:
1.内置数据类型,复合类型(指针,引用)
在成员初始化列表和构造函数体内进行,在性能和结果上都是一样的
2.用户定义类型(类类型)
结果上相同,但是性能上存在很大的差别。因为类类型的数据成员对象在进入函数体前已经构造完成,也就是说在成员初始化列表处进行构造对象的工作,调用构造函数,在进入函数体之后,进行的是对已经构造好的类对象的赋值,又调用个拷贝赋值操作符才能完成(如果并未提供,则使用编译器提供的默认按成员赋值行为)

没有默认构造函数的类类型的成员,以及const或引用类型的成员,不管是哪种类型,都必须在构造函数初始化列表中。

没有初始化内置或复合类型的构造函数,将使那些成员处于未定义的状态。除了作为赋值的目标外,以任何方式使用一个未定义的成员都是错误的。

当构造函数被声明为explicit时,编译器将不使用它作为转换操作符。除非有明显的理由想要定义隐式转换,否则单形参构造函数应该为explicit。将狗仔函数设置为explicit可以避免错误,并且当装换有用时,用户可以显式地构造对象。

友元:允许一个类将对其非公有成员的访问授权予制定的函数或类。

友元可以是普通的非成员函数或前面定义的其他类的成员函数,或是整个类。将一个类设为友元,友元类的所有成员函数都可以访问授予友元关系的那个类的非公有成员。

static成员的优点
1)static成员的名字在类的作用域中,因此可以避免与其他类的成员或全局对象名字对象。
2)可以实施封装,static成员可以使私有成员,全局对象不可以是私有成员。
3)通过阅读程序容易看出static成员是与特定类关联的,这种可见性可清晰地显示程序员的意图。
static成员是类的组成部分而不是任何对象的组成部分,因此无this指针,不能被声明为const,也不能被声明为虚函数。
在类定义体外部引用类的static成员时,必须指定成员是哪个类中定义的。
static关键字只能用于类定义内部的声明中。