- 介绍指向常对象的指针,可以参考我写的博文,const使用(const int *p,int const *p,和int * const p二)。
- 如果一个对象被声明为常对象,只能用指向常对象的指针变量去指向它,而不能用一般的(指向非const型对象的)指针变量去指向它。
- 如果定义了一个指向常对象的指针变量,并使它指向一个非const的对象,则其指向的对象是不能通过该指针变量来改变的。
如一下:
Time t1(10,12,13);//定义Time类对象t1,它是非const类对象。
const Time*p=&t1;//定义p是指向常对象的指针变量,并指向t1
t1.hour = 18;//合法,t1不是常变量
(*p).hour = 18;//非法,不能通过指针变量改变t1的值。
如果希望在任何情况下都不能改变t1的值,则应该把它定义为const型,如:const Time t1(10,12,15);
函数形参为指向常对象的指针,实参可以是:1:为const型对象的指针. 2:为非const型对象的指针。两者都只能引用该常对象,无法修改该常对象对应的数据的值(前提:数据成员是公有的话)
函数形参为指向非常对象的指针,实参可以是:非常对象的地址。也可以修改该常对象的数据成员的值。(前提:数据成员是公有的话),但不能引用const型对,,象,会报错。
#include<iostream>
using namespace std;
class Time
{
public:
int hour;
int minute;
int second;
public:
Time(int h, int min, int s) :hour(h), minute(min), second(s)
{}
};
int main()
{
//void fun(const Time *);
void fun1(const Time *);
void fun2(Time *);
const Time t1(10,13,56);
Time t2(10, 13, 56);
/*fun(&t1);*/
fun1(&t2);
fun2(&t2);
return 0;
}
//形参指向const型对象的指针和实参是const型变量的地址,只能引用,该函数无法修改常对象的值
//void fun(const Time*p)
//{
// p->hour = 18;//报错
// cout << p->hour << endl;
//}
//形参指向const型对象的指针和实参是非const型变量的地址,只能引用,该函数无法修改常对象的值
void fun1(const Time* p)
{
//p->hour = 18;//报错,
cout << p->hour << endl;
}
//形参指向非const型对象的指针和实参是非const型变量的地址,该函数可以修改常对象的值
void fun2(Time*p)
{
p->hour = 17;
cout << p->hour << endl;
}
以上程序按说一般数据成员都时私有的,我只是为了便于操作,其实原本可以定义一个公有函数,进行试数操作,通过外部函数来操作公有函数来改变对象的值进行验证。
总结:当希望在调用函数时对象的值不被修改,就应当把形参定义为指向常对象的指针变量,同时用对象的地址做实参(对象可以是const或非const)。
如果定义了一个指向常对象的指针变量,是不能通过它来改变所指向的对象的值的,但是指针变量本身的值是可以改变的。如:const Time *p = &t1; //定义指向常对象的指针变量p,并指向对象t1
p= &t2;//p改为指向t2,合法。
分析:因为const Time *p 中的const修饰的是Time ,所以该常对象的值不能修改,但是该指向常对象的指针的指向是可以改变的,这点类似于我前面所写的关于指向变量的常指针和指向常变量的指针。