如下程序:
#include <iostream>
#include <string>
using namespace std;
class M; //向编译系统声明,M类在整个源程序内已经定义
class Student
{
public:
static int number;
string name;
M & rm; //M类的对象引用rm作为student类的公有数据成员;
M *pm; //M类的对象指针pm作为student类的共有成员;
public:
Student() { }
void set(string str)
{
name = str;
number++; // 调用静态数据成员
}
void print()
{
cout << name <<" : The number of the students is " << number << " numbers." << endl; // 调用静态数据成员
}
};
class M{
public:
int score;
M(int v){ score=v;} //M类的有参构造函数
M(){ score=0} //M类的无参构造函数
int getValue(void){return score;}
}
int Student::number = 0; // 静态数据成员初始化方式
int main(int argc, char** argv)
{
M m1(6);
Student* s1;
s1 = new Student();
s1->set("111");
Student s2;
s2.set("222");
s1->print();
s2.print();
s2.pm=&m1;//对象s2的对象指针成员pm指向m1。请注意s2是Student类的对象,pm是M类的对象指针作为Student类的成员,m1是M类对象
cout<<s2.pm->score<<endl;//s2对象访问数据成员score的方式,只有将m1的地址赋给了对象s2的对象指针成员pm之后,并且score是M类的公有数据成员时才能顺利打开这条访问的消息通路
return 0;
}
类对象和指针的作用都是为了调用类的成员变量和成员函数用的,当希望明确使用该类的时候最好使用对象,当希望利用C++的多态性,实现动态绑定,则需要使用指针或引用(如父类指针可以指向子类对象,并且没有调用构造函数),类的对象则不行。
一、关于定义:
对于类student ,定义了一个对象 和一个指针。类的对象在定义时利用构造函数在内存中分配一块内存(包括一些成员变量所赋的值);类的指针是一个内存地址值,他指向内存中存放的类对象(包括一些成员变量所赋的值)。很关键一点,在定义对象实例时分配内存;在定义类指针时则未分配对象所需内存(在未用new操作符时)。
二、关于应用:
1.访问成员: 对象用"."操作符; 指针用" ->"操作符.
2.生命期: 若是成员变量,则是类的析构函数来释放空间;若是函数中的临时变量,则作用域是该函数体内。而指针,则需利用delete在相应的地方释放分配的内存块. 注意:用new,一定要delete
3.内存分配:类的对象在栈空间中分配,是个局部的临时变量。类的指针在堆空间中分配,是个永久变量,除非你释放它。
4.虚函数的调用:当基类有虚函数,Func是它的一个虚函数,则调用Func时: 类对象调用的是它自己的Func; 类指针调用的是分配给它空间类的Func。
5.一个类的对象不能作为该类的成员,但一个类的对象指针或者对象应用却可以作为自身类的成员,从而构成递归类。
总结指针或引用的优点有:
第一,实现多态;
第二,在函数调用,传指针参数。不管你的对象或结构参数多么庞大,用指针,传过去的就是4个字节,如果用对象,参数传递占用的资源就很大。