一个C++程序来区分指向对象的常指针和常对象的指针
#include <iostream>
using namespace std;
class Time
{
public:
Time(int);
Time(int,int,int,int);
~Time();
void get_time();
void set_time(int,int,int);
void show_time() const; <span style="color:#ff0000;">//常成员函数的const是函数的一部分,在声明和定义都是要有const关键字。</span>
int total;
private:
int hour;
int minute;
int sec;
const int num; <span style="color:#ff0000;">//常数据成员只能通过构造函数的参数初始化表初始化。</span>
};
Time::Time(int n)
:num(n) <span style="color:#ff0000;">//初始化常成员函数</span>
{
}
Time::Time(int h,int m,int s,int n)
:hour(h)
, minute(m)
, sec(s)
, num(n) <span style="color:#ff0000;">//初始化常成员函数</span>
{
}
Time::~Time()
{
}
void Time::get_time()
{
cout << hour << ":" << minute << ":" << sec << endl;
}
void Time::set_time(int h,int m,int s)
{
hour = h;
minute = m;
sec = s;
}
void Time::show_time() const <span style="color:#ff0000;">//常成员函数定义是要有const关键字,单调用时不必加。</span>
{
<span style="color:#ff0000;">//常成员函数可以引用非常数据成员和const数据成员,但不可以改变其值
// minute += 1; //错误,不能改变其值</span>
cout << hour << ":" << minute << ":" << sec << endl;
}
int main()
{
<span style="color:#ff0000;">/*指向对象的常指针*/</span>
Time t1(10, 28, 38, 88),t2(888);
Time* const p1 = &t1; <span style="color:#ff0000;">//指向对象的常指针,必须同时初始化</span>
// p1=&t2 <span style="color:#ff0000;">//错误,p1不能改变指向,也就是指针变量的值不能改变。</span>
p1->get_time();
p1->set_time(23, 38, 28); <span style="color:#ff0000;">//可以改变其所指向对象的值。</span>
p1->get_time();
<span style="color:#ff0000;">/*指向常对象的指针*/</span>
const Time* p2 ; <span style="color:#ff0000;">//指向常对象的指针,可以不初始化,区分p1</span>
p2 = &t1;
// p2->get_time(); <span style="color:#ff0000;">//常对象只能调用常对象成员函数,区分p1</span>
p2->show_time();
p2 = &t2; <span style="color:#ff0000;">//合法,p2可以改变指向,区分p1</span>
// p2->set_time(8, 18, 28); <span style="color:#ff0000;">//错误,不能通过p2改变其所指向对象的值,区分p1</span>
t2.set_time(8, 18, 28); <span style="color:#ff0000;">//合法的。</span>
p2->show_time();
return 0;
}