例6-13 访问对象的公有成员函数的不同方式
//例6_13 访问对象的公有成员函数的不同方式.cpp(P216) #include
class Point {//类的定义 public://外部接口
Point(int x = 0, int y = 0) : x(x), y(y) { } //构造函数 int getX() const { return x; }//返回x int getY() const { return y; }//返回y
private://私有数据 int x, y; };
int main() {//主函数 数
cout << a.getX() << endl; //(3)使用对象名访问成员函数 cout << p1->getX() << endl;//(4)使用对象指针访问成员函数 Point a(4,5);//定义对象A
Point *p1 = &a;//定义对象指针并初始化
int (Point::*funcPtr)() const = &Point::getX;//定义成员函数指针并初始化
cout << (a.*funcPtr)() << endl;//(1)使用成员函数指针和对象名访问成员函数 cout << (p1->*funcPtr)() << endl;//(2)使用成员函数指针和对象指针访问成员函
return 0; }
运行结果:四种不同的访问方式结果都一样
4. 指向类的静态成员的指针
对于类的静态成员的访问是不依赖对象的,因此可以用普通指针存放静态成员的地址,通过普通指针来指向和访问它。下面的例子是将例5-4稍作修改后形成的程序。 例6-14 通过指针访问类的静态数据成员
//例6_14 通过指针访问类的静态数据成员.cpp(P216) #include
class Point {//Point类定义
public: //外部接口
Point(int x = 0, int y = 0) : x(x), y(y) {//构造函数 count++; }
Point(const Point &p) : x(p.x), y(p.y) {//拷贝构造函数 count++; }
~Point() { count--; }
int getX() const { return x; } int getY() const { return y; }
static int count;//静态数据成员声明,用于记录点的个数
private://私有数据成员
int x, y;
};
int Point::count = 0;//静态数据成员定义和初始化,使用类名限定
int main() {//主函数实现
int *ptr = &Point::count;//定义一个int型指针,指向类的静态成员
Point a(4, 5);//定义对象a
cout << \ << a.getX() << \ << a.getY();
cout << \ << *ptr << endl;//直接通过指针访问静态数据成员
Point b(a); //定义对象b
cout << \ << b.getX() << \ << b.getY();
cout << \ << *ptr << endl;//直接通过指针访问静态数据成员
return 0; }
运行结果:
例6-15 通过指针访问类的静态数据成员
//例6_15 通过指针访问类的静态数据成员.cpp(P217) #include
class Point {//Point类定义
public://外部接口
Point(int x = 0, int y = 0) : x(x), y(y) {//构造函数 count++; }
Point(const Point &p) : x(p.x), y(p.y) {//拷贝构造函数 count++; }
~Point() { count--; }
int getX() const { return x; } int getY() const { return y; }
static void showCount() {//输出静态数据成员
cout << \ << count << endl; }
};
private://私有数据成员
int x, y;
static int count;//静态数据成员声明,用于记录点的个数
int Point::count = 0;//静态数据成员定义和初始化,使用类名限定
int main() {//主函数实现
void (*funcPtr)() = Point::showCount;//定义一个指向函数的指针,指向类的静
态成员函数
Point b(a); //定义对象B
cout << \ << b.getX() << \ << b.getY(); funcPtr(); //输出对象个数,直接通过指针访问静态函数成员 Point a(4, 5);//定义对象A
cout << \ << a.getX() << \ << a.getY(); funcPtr();//输出对象个数,直接通过指针访问静态函数成员
return 0; }
运行结果:
指向类的非静态成员的指针和指向类的静态成员的指针其实并不常用。 6.3 动态内存分配 6.3.1 动态分配与释放内存 动态申请内存操作符 new
● new 类型名T(初始化参数列表)
● 功能:在程序执行期间,申请用于存放T类型对象的内存空间,并依初值列表赋以初值。 ● 结果值:成功:T类型的指针,指向新分配的内存;失败:抛出异常。 释放内存操作符delete ● delete 指针p
● 功能:释放指针p所指向的内存。p必须是new操作的返回值。 例6-16 动态创建对象举例
//例6_16 动态创建对象举例.cpp(P220)
#include
class Point { public:
Point() : x(0), y(0) {
cout<<\< Point(int x, int y) : x(x), y(y) { cout<< \< ~Point() { cout<<\< private: int x, y; }; int main() { cout << \ << endl; Point *ptr1 = new Point;//动态创建对象,没有给出参数列表,因此调用缺省构造 函数 delete ptr1;//删除对象,自动调用析构函数 cout << \ << endl;