class screen { public: typedef string ::size_type index; private: string contents; index cursor; index height,width; get(); };
在类内部,声明成员函数是必须的,而定义函数则是可选的,在类内部定义的函数默认为inline。
将关键const加在形参之后就可以将成员函数声明为常量:
double ag() const;
const成员不能改变其所操作的对象的数据成员。
使用类型别名简化类
class screen { public: typedef string ::size_type index; private: string contents; index cursor; index height,width; };
类所定义的类型名遵循任何其他成员的标准访问控制,将index的定义放在类的public部分,是因为希望用户使用这个名字,定义index来隐藏screen的实现细节。将这个类型设为public类型就是允许用户使用这个名字。
定义一个类时,也就是定义了一种类型。一旦定义了类,就可以定义该类型的对象。定义对象时,将为其分配存储空间,但(一般而言)定义类型时不进行存储分配。
定义了一个新类型,但没有存储分配,当我们定义一个对象
screen item;
时,编译器分配了足够容纳一个item对象的存储空间,item指的就是那个存储空间,每个对象具有自己的类数据成员的副本,修改item的数据成员不会改变任何其他screen对象的数据成员,
定义了一个类类型之后,可以按一下两种方式使用。
1.将类的名字直接用作类型名。
2.指定关键字class或struct,后面跟着类的名字。
screen item1与class screen item1 等价。
两种引用类类型的方法是等价的,第二种方法是从c继承而来的,在c++中仍然有效,第一种更简洁,有c++语言引入,使得类类型更容易使用。
为什么类的定义以分号结束。
因为在类定义之后可以接一个对象定义列表。定义必须以分号结束。
class screen { .........};
class screen {..........}accum,trans;
通常,将对象定义成类定义的一部分是个坏主意,这样做,会使所发生的操作难以理解,对读者而言,将两个不同的实体(类,变量)组合在一个语句中,也是令人迷惑不解的。
成员函数具有一个附加的隐含形参,即指向该类对象的一个指针,这个隐含形参的命名为this,与调用成员函数的对象绑定在一起。成员函数不能定义this形参,而又编译器隐含的定义。
在普通的非const成员函数中,this的类型是一个指向了类类型的const指针,可以改变其指向的值,但不能改变所指向的地址。而在const成员函数中,this类型是一个指向const类类型对象的const指针。即不能改变this所指向的对象,也不能改变其指向的地址。
注意:非const对象可以调用const成员,但const对象只能const成员。const screen item;item.get();//产生错误。因为const对象调用非const成员函数。
构造函数不能声明为const。
必须对任何const或引用类型成员以及没有默认构造函数的类类型的任何成员使用初始化器进行初始化。
一个类哪怕只定义了一个构造函数,编译器也不会再生成默认构造函数。注意是编译器不再生成默认构造函数,并不是说我们不能创建默认构造函数。。。。。
事实上,如果定义了其他构造函数,则提供一个默认构造函数几乎总是对的,通常在默认构造函数中给成员提供的初始值应该指出该对象是空的。
隐式类类型转换:
c++语言定义了内置类型之间的几个自动转换,也可以定义如何将其他类型的对象隐式转换为我们的类类型。或将我们的类类型的对象隐式转换成其他类型。为了定义类类型的隐式转换,需要定义合适的构造函数。使用explicit关键字可以防止隐式转换。
友元机制允许一个类将对其非公有成员的访问权授予指定的函数或类。它只能在类定义的内部声明。友元的声明可以出现在类中的任何地方:友元不是授予友元关系的那个类的成员。所以他们不受其声明出现部分访问控制的影响。
通常,将友元声明成组的放在类定义的开始或结尾时个好主意。
友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。
友元函数
友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样。下面举一例子说明友元函数的应用。
#include #include class Point { public: Point(double xx, double yy) { x=xx; y=yy; } void Getxy(); friend double Distance(Point &a, Point &b); private: double x, y; }; double Distance(Point &a, Point &b) { double dx = a.x - b.x; double dy = a.y - b.y; return sqrt(dx*dx+dy*dy); } void main() { Point p1(3.0, 4.0), p2(6.0, 8.0); double d = Distance(p1, p2); cout<<"Distance is"<<endl; }
说明:在该程序中的Point类中说明了一个友元函数Distance(),它在说明时前边加friend关键字,标识它不是成员函数,而是友元函数。它的定义方法与普通函数定义一样,而不同于成员函数的定义,因为它不需要指出所属的类。但是,它可以引用类中的私有成员,函数体中
a.x,b.x,a.y,b.y都是类的私有成员,它们是通过对象引用的。在调用友元函数时,也是同普通函数的调用一样,不要像成员函数那样调用。本例中,p1.Getxy()和p2.Getxy()这是成员函数的调用,要用对象来表示。而Distance(p1,
p2)是友元函数的调用,它直接调用,不需要对象表示,它的参数是对象。(该程序的功能是已知两点坐标,求出两点的距离。)
友元类
友元除了前面讲过的函数以外,友元还可以是类,即一个类可以作另一个类的友元。当一个类作为另一个类的友元时,这就意味着这个类的所有成员函数都是另一个类的友元函数。