成员函数
-
成员函数是定义为类的一部分的函数,有时也被称为方法。
-
类的成员函数可以把定义和原型写在类的内部,就像类定义中的其他变量一样。类成员函数是类的一个成员,它可以操作类的任意对象,可以访问对象中的所有成员。
-
类的成员函数的定义可以在类的内部,也可以在类的外部。
成员函数定义在类的内部
class Box
{
public:
double length; // 长度
double breadth; // 宽度
double height; // 高度
double getVolume(void)
{
return length * breadth * height;
}
};
成员函数定义在类的外部
class Box
{
public:
double length; // 长度
double breadth; // 宽度
double height; // 高度
//成员函数的声明
double getVolume(void);// 返回体积
};
double Box::getVolume(void)
{
return length * breadth * height;
}
构造函数和析构函数
构造函数
-
类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。
-
构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void。构造函数可用于为某些成员变量设置初始值。
不带参数的构造函数示例:
class Book{
public:
Book(); //这是构造函数
}
Book::Book(void)
{
std::cout << "The object is created." << std::endl;
}
带参数的构造函数示例:
class Book{
public:
int bookNum;
Book(int num);
}
Book::Book(int num)
{
bookNum = num; //初始化bookNum
std::cout << "The object is created. bookNum = " << bookNum << std::endl;
}
int main()
{
Book book(10); //定义一个Book类,并初始化bookNum
}
使用初始化列表来初始化字段
Book::Book(int num):bookNum(num)
{
//等同于bookNum = num
std::cout << "The object is created. bookNum = " << bookNum << std::endl;
}
析构函数
-
类的析构函数是类的一种特殊的成员函数,它会在每次删除所创建的对象时执行。
-
析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀,它不会返回任何值,也不能带有任何参数。析构函数有助于在跳出程序(比如关闭文件、释放内存等)前释放资源。
析构函数示例:
class Book{
public:
Book(); //这是构造函数
~Book();//这是析构函数
}
Book::Book(void)
{
std::cout << "The object is created." << std::endl;
}
Book::~Book(void)
{
//也可以调用相关函数来释放内存,停止服务等等。
std::cout << "The object is deleted." << std::endl;
}
虚函数
- 虚函数主要用于基类与派生类。基类中声明,在派生类中具体实现。
- 虚函数 是在基类中使用关键字 virtual 声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。
- 在程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接,或后期绑定。
纯虚函数
在基类中定义虚函数,以便在派生类中重新定义该函数更好地适用于对象,但是您在基类中又不能对虚函数给出有意义的实现,这个时候就会用到纯虚函数。
纯虚函数示例:
class Shape {
protected:
int width, height;
public:
Shape( int a=0, int b=0)
{
width = a;
height = b;
}
// pure virtual function
virtual int area() = 0;
};
友元函数
-
类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。
-
友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员都是友元。
-
如果要声明函数为一个类的友元,需要在类定义中该函数原型前使用关键字 friend。
友元函数使用示例:
#include <iostream>
using namespace std;
class Box
{
double width;
public:
friend void printWidth( Box box );
void setWidth( double wid );
};
// 成员函数定义
void Box::setWidth( double wid )
{
width = wid;
}
// 请注意:printWidth() 不是任何类的成员函数
void printWidth( Box box )
{
/* 因为 printWidth() 是 Box 的友元,它可以直接访问该类的任何成员 */
cout << "Width of box : " << box.width <<endl;
}
// 程序的主函数
int main( )
{
Box box;
// 使用成员函数设置宽度
box.setWidth(10.0);
// 使用友元函数输出宽度
printWidth( box );
return 0;
}
内联函数
- 将一个函数指定为内联函数,通常是将它在每个调用点上“内联地”展开。
- 如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方。
- 对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编译器需要重新更换一次所有的代码,否则将会继续使用旧的函数。
- 如果想把一个函数定义为内联函数,则需要在函数名前面放置关键字 inline,在调用函数之前需要对函数进行定义。
- 一般来说,内联机制用于优化规模较小,流程直接,频繁调用的函数。很多编译器都不支持内联递归函数。
- 在类定义中的定义的函数都是内联函数,即使没有使用 inline 说明符。
内联函数示例:
inline int Max(int x, int y)
{
return (x > y)? x : y;
}
——————
2021.11.03
软件园