一. 自引用指针 this
C++为成员函数提供了一个名为this的指针,这个指针成为自引用指针。每当创建一个对象时,系统就把this指针初始化为指向该对象,即this指针的值是当前调用成员函数的对象的起始地址。每当调用一个成员函数时,系统就自动把this指针作为一个隐含的参数传给该函数。不同的对象调用同一个成员函数时,从C++的编译器将根据成员函数的this指针所指向的对象来确定引用哪一个对象的数据成员。
二. 对象数组与对象指针
三. 向函数传递对象
- 使用对象作为函数参数:对象可以作为参数传递给函数,其方法与传递其他类型的数据相同,是通过“传值调用”的方法传递给函数。
- 使用对象指针作为函数参数:对象指针可以作为函数的参数,使用对象指针作为函数参数可以实现“传值调用”,即在函数调用时使实参对象和形参对象指针变量指向同一块内存地址,在函数调用过程中,形参对象所指对象值的改变也同样影响着实参对象的值。
- 使用对象引用作为函数参数:使用对象引用作为函数参数不但具有用对象指针做函数参数的优点,而且用对象引用做函数参数将更简单,更直接。
四. 静态成员
用某一个或几个数据成员为所有的对象所共有,实现一个类的多个对象之间的数据共享。
1. 静态数据成员
在一个类中,将一个数据成员说明为static,这种成员被称为静态数据成员。与一般的数据成员不同,无论建立多少个类的对象,都只有一个静态数据成员的拷贝。从而实现了同一个类的不同对象之间的数据共享。
static 数据类型 数据成员名;
初始化格式:
数据类型 类名::静态数据成员名 = 初始值;
用对象访问静态数据成员的格式如下:
对象名.静态数据成员名;
对象指针->静态数据成员名;
2. 静态成员函数
静态成员函数属于整个类,是该类所有对象共享的成员函数,而不属于类中的某个对象。与静态成员函数不同,静态成员函数的作用不是为了对象之间的沟通,而是为了处理静态数据成员。
定义的格式如下:
static 返回类型 静态成员函数名(参数表);
调用公有静态成员函数的一般格式:
类名::静态成员函数名(实参表);
对象.静态成员函数名(实参表);
对象指针->静态成员函数名(实参表);
五. 友元
1. 友元函数
友元函数既可以是不属于任何类的非成员函数,也可以是另一个类的成员函数。友元函数不是当前类的成员函数,但它可以访问该类所有的成员,包括私有成员,保护成员和公有成员。
在类中声明友元函数时,需在其函数名前加上关键字friend。此声明可以放在保护部分和私有部分。友元函数可以定义在类内部,也可以定义在类外部。
【例】
#include<iostream>
using namespace std;
class Date
{
private:
int day;
int month;
int year;
public:
Date(int d, int m, int y)
{
day = d;
month = m;
year = y;
}
friend void showDate(Date&);
};
void showDate(Date& d)
{
cout << d.year << "." << d.month << "." << d.day << endl;
}
int main()
{
Date date(22, 11, 2007);
showDate(date);
return 0;
}
输出结果:
2007.11.22
注意:
- 友元函数虽然可以访问类对象的私有成员,但它毕竟不是成员函数。因此,在类的外部定义友元函数时,不必像成员函数那样,在函数名前上 “ 类名:: ”。
- 因为友元函数不是类的成员,所有它不能直接访问对象的数据成员,也不能通过this指针访问该对象的数据成员。
- 友元函数提供了不同类的成员函数之间,类的成员函数与一般函数之间进行数据共享的机制。
2. 友元类
声明友元类的一般形式:
friend 类名;
例如
class Y{
...
};
class X{
...
friend Y; // 声明类Y为类X的友元类;
...
};
当一个类被说明为另一个类的友元类时,它所有的成员函数都成为另一个类的友元函数,这就意味着作为友元的类中的所有成员函数都可以访问另一个类中的所有成员(包括私有成员)。