函数成员:
1. 形参:
A. 函数的形参可以是指针。在被调用函数中,对形参指针做修改并不影响实参的值,但是对形参指针所指向对象的修改将会影响实际的值。
B. 实参是大型对象时,复制对象所付出的的时间和存储空间代价往往过大。对于这种情况形参应该定义成为引用或指针类型。
C. 如果使用引用形参的唯一目的是避免复制参数,则应该将形参定义为const引用。
D. ??const引用和const指针??
E. 指向指针的引用
为了实现两个指针的交换。这里用*定义指针,用&定义引用。
void ptrswap(int *&v1, int *&v2)
{
int *tmp = v2;
v2 = v1;
v1 = tmp;
}
形参int *&v1的定义应该从右至左理解。v1是一个指针的引用。
F. 在成员函数中this形参指针的引入
形参this初始化为调用函数对象的地址。
bool same_isbn(const Sale_item &rhs) const
{
returnthis->isbn == rhs.isbn;
}
从这里看出用对象的指针使用成员使用“->”,而用对象的引用使用成员用“.”。
2. const成员函数
class Sale_item{
public:
double avg_price()const;
…
}
成员函数avg_price()的后面加上了const,这个const改变了隐含的形参this的类型,成为了一个指向const对象的指针,const成员函数不能修改调用该函数的对象。const必需同时出现在声明和定义中,若只出现在其中一处,就会出现一个编译错误。
3. 构造函数无返回类型,一般放在public部分,除非你要使用单例模式。
4. 构造函数的初始化列表为类的一个或多个数据成员制定初值。
类声明与定义
1. 将类定义放在头文件中,可以保证在每个使用类的文件中以同样的方式定义类。使用头文件保护符,来保证即使头文件在同一文件中被包含多次,类定义也只出现一次。例如
#ifndef SALESITEM_H
#def SALESITEM_H
//Definition of Sale_Item And related functions
#endif
2. 前向声明
类的前向声明是声明一个类而不定义它。这个类是不完全类型,不完全类型只能用于定义指向该类型的指针及引用,或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数。
a. 比如这个用Qt定义了一个对话框类:来自于《C++ GUI Qt 4编程》
finddialog.h
#ifndef FINDDIALOG_H
#define FINDDIALOG_H
#include<QDialog>
classQCheckBox;
classQLabel;
classQLineEdit;
classQPushButton;
classFindDialog:publicQDialog
{
Q_OBJECT
public:
FindDialog(QWidget*parent=0);
signals:
voidfindNext(constQString&str,Qt::CaseSensitivitycs);
voidfindPrevious(constQString&str,Qt::CaseSensitivitycs);
privateslots:
voidfindClicked();
voidenableFindButton(constQString&text);
private:
QLabel*label;
QLineEdit*lineEdit;
QCheckBox*caseCheckBox;
QCheckBox*backwardCheckBox;
QPushButton*findButton;
QPushButton*closeButton;
};
#endif //FINDDIALOG_H
对于类中的私有变量,我们使用了它们的类前置声明。这是可行的,因为它们都是指针,而且没有必要在头文件中就去访问它们,因而编译程序就无需这些类的完整定义。我们没有包含与这几个类相关的头文件,而是使用了一些前置声明,这可以使编译过程更快一些。
在实现类的成员函数的cpp文件如下:
finddialog.cpp
#include<QtGui>
#include"finddialog.h"
……
在finddialog.cpp中,需要包含<QtGui>。在<QtGui>头文件中为构成QtCore和QtGui组成部分的所有类进行了定义。在程序中包含这个头文件,就能够使我们省去在每个类中分别包含的麻烦。在finddialog.h文件中,本可以仅简单地添加一个<QtGui>包含即可,而不用包含<QDialog>和使用QCheckBox,QLabel,QLineEdit和QPushButton的前置声明。然而,在一个头文件中再包含一个这么大的头文件着实不是一种好的编程风格,尤其对比较大的工程项目更是如此。
b. 类的前向声明一般用来编写相互依赖的类,比如
classLinkScreen{
Screenwindow;
LinkScreen *next;
LinkScreen *prev;
}
可以利用这个特征来定义一些数据结构。