C++----共用数据保护


————————————————————————————————————————————————————————————


今天已经3月2号了,恩,2017年已经过去3个月了。你的任务完成了吗?


————————————————————————————————————————————————————————————

一.,共用数据保护

变量或对象被const修饰后其值不能被更新。因此被const修饰的变量或对象必须要进行初始化

当需要数据在一定的范围内能够共享,又保证它不被任意修改。可以使用 const ,即把有关的数据定义为常量。变量或对象被 const修饰后其值不能被更新。因此被const修饰的变量或对象必须要进行初始化。

二.常对象

如果我们希望保证数据成员不能被修改的对象,可以定义为常对象。例如:Time t1(12,12,12); //t1是常对象,t1的所有数据成员的值不能被修改。

定义常对象的形式:

类名  const  对象名[(实参列表)];

const   类名  对象名[(实参列表)];

注意:

不能通过常对象调用普通成员函数,但是可以通过普通对象调用常成员函数常对象只能调用常成员函数。

例如:

const Time t;    //错误,常对象必须在建立时候赋初值
Time const t1(0,0,0);  //正确
t1.getTime();   //错误,企图调用常对象 t1 的非const 的成员函数
现在的编译器只检查函数的声明,只要发现了调用常对象的成员函数,如果该函数没有被定义为const则被报错。我们想引用常对象中的数据成员,只需要把该函数声明为 const 即可。

例如:

void getTime ()const; //把getTime是一个const型函数,即常成员函数
注意:

常成员函数可以访问常对象中的数据成员,但是不能修改常对象的数据成员的值。

有时候,编程需要一定要修改常对象中的某个数据成员的值,可以数据成员声明为 mutable,如:mutable int count ,把count声明为可变的数据成员,这样就可以用声明为const 的成员函数来修改它的值。

三.常成员对象

用const修饰的声明数据成员称为常数据成员。例如:const  int  hour ;//声明 hour 为常成员数据

说明:

1.任何函数都不能对常数据成员赋值。

2.构造函数对常数据成员进行初始化时也只能通过初始化列表进行。

3.常数据成员在初始化时必须赋值或称其必须初始化 

4.如果类有多个默认构造函数必须都初始化常数据成员。

(1)任何函数都不能对常成员对象赋值。

Time::Time(int h)
{
hour = h;  //非法,数据不能被赋值
}

(2)不能在构造函数中对常数据成员赋值,只能通过参数初始化列表赋值

Time::Time(int h):hour(h){}  

四.常成员函数

常成员函数形式:<类型标志符>函数名(参数表)const;

例如:void getTime() const; 

在声明和定义的时,需要有const 关键字,在调用的时,不需要加 const 。

常数据成员和常成员函数关系


说明:

(1)在一个类中,有些数据可以被改变,有一些数据不可以改变,则声明为 const 保证数据的不变形。非const成员函数可以引用这些数据成员的值,并且修改非const 数据成员的值。

(2)如果要求的数据都不能被修改,则可以将所有的数据声明为const 或者对象声明为 const ,然后用const函数引用数据成员。这样有“双保险”的作用,保证数据成员不能别修改。

(3)常对象只能调用const成员函数。常对象只能保证数据成员的值不被修改,不要误认为常对象的成员函数都是常成员函数。

(4)常成员函数不能调用另一个非const成员函数。


五.指向对象的常指针

将指向对象的指针变量声明为const 型,并使之初始化,这样的指针始终保持为其初值,不能改变,即指向始终不变。

Time t1(10,10,10), t2; 
Time * const pt = &t1; //规定 pt 的值是常值,指向对象 t1 ,此后不能改变其指向。
pt = &t2 ;//错误,不能改变其指向


指向对象的常指针形式:类名* const 指针变量名 = 对象地址。

注意:在定义指针的时候使之初始化,

Time * const pt; //指定pt为指向Time类的常指针变量
pt = &t1; //使之指向t1,错误,常指针不能被赋值
指向对象的常指针的值不能改变,始终指向同一个对象,但可以改变其所指向对象中的数据成员的值。


六.指向常对象的指针变量
定义指向常变量的指针变量一般形式:
const 类型名 *指针变量

例如:const char * ptr; //定义一个指向常变量的的指针变量

区别:指向对象的常指针和指向常对象的指针变量

形式:常指针:类型名* const  指针变量,const在指针变量前面,规定指针变量的值是常值

        指针变量:const 类型名 *指针变量,const和类型名紧邻,表示指针变量指向的类型变量是常变量。

注意:

(1)一个变量声明为常变量,只能用指向常变量的指针指向它,不能用一般的指针(非常变量指针)指向它

const  char c =‘b’; //定义常变量
const char* pt ; //定义p1为指向const 型的char 变量的指针变量。
pt = &c; //p1指向常变量
char* p2 =&c; //非法,不能用非常变量指针指向常变量

(2)指向常变量的指针变量除了可以指向常变量外,也可以指向非const变量,此外不能通过此指针变量改变该变量的值。

char c='a';	 //定义字符变量c1,非const变量
const char *p;		 //定义指向常变量的指针变量
p = &c; 	//p指向字符变量c
*p = 'b' ;	//非法,不能通过p改变变量c的值

(3)如果函数的形参是指向非const型变量的指针,实参只能用指向非const变量的指针,而不能用指向const变量的指针,因为形参是指向非const型指针变量,按理说,在执行过程中,它指向的变量的值可以改变,实参是const变量,它指向的变量的值不可以改变,但是形参的值和实参的值指向同一变量,这就发生矛盾。

指针变量做形参时形参和实参的对应关系


指向常对象的指针变量的和指向常变量的指针变量类似。

(1)一个对象声明为常对象,只能用指向指向常对象的指针变量去指向它,而不能用一般的(非const)指针变量指向它。

(2)如果定义一个指向常对象的指针变量,并用它指向一个非const的对象,则其指向的对象是不能通过指针来改变的。

Time t1(0,0,0);	//建立非const的对象t1
const Time * pt = &t1; 	//定义pt是指向常对象的指针变量,并且指向t1
t1.hour = 10; 	 //合法
(*p).hour =10; 	//非法,不能通过指针变量改变t1的值

如果希望在任何情况下t1的值都不能被改变,则应该定义为const型,如:const Time t1(10,10,10);

Time* const p;   //指向对象的常指针变量

const Time *p ; // 指向常对象的指针变量

(3)指向常对象的指针变量常用于函数的形参,目的是保护形参指针所指向的对象,使它在函数执行过程中不被修改。

int main()
{
  void fun(const Time*p); //形参是指向常对象的指针变量
Time t1(0,0,0);		//建立非const对象
fun(&t1);	//实参是对象t1的地址
return 0;
}
void fun(const Time* p)
{
p->hour = 19;  //非法
cout<<p->hour<<endl;
}

形参是指向Time类的常对象的指针变量,实参可以是const后者非const 对象的地址。但是形参性质决定不允许改变p指向的对象的值。

重要提示:

(1)当希望调用函数时,对象的值不能被修改,就应当把形参的值定义为指向对象的指针变量。同时用对象的地址作实参(可以是constt或者是非const)

(2)如果对象不仅在调用的过程中不能被改变,整个程序的过程中都不能被改变,则应该把它定义为const型

(3)定义一个指向常对象的指针变量,是不能通过它改变改变所指向的对象的值,但是指针变量本身的值是可以改变的。

const Time* p =&t1;  //定义指向常对象的指针变量p,指向对象 t1

p2 = &t2 ; //合法。同样不能通过指针变量 p 改变t2的值。


七.对象的常引用

#include <iostream>
using namespace std;

class Time
{
public:
    Time(int h, int m, int s):hour(h),mintue(m),sec(s){}
    int hour;
    int mintue;
    int sec;
};
void fun(Time& t)
{
    t.hour =18;
}
int main()
{
    Time t1(0,0,0);
    fun(t1);
    cout<<t1.hour<<endl;
    return 0;
}
输出结果是18










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值