C++常对象,常变量,常成员函数详解(含添加内容)

 既要使数据能在一定范围内共享,又要保证它不被任意修改,可使用const。

·        用const修饰的声明数据成员称为常数据成员

·        用const修饰的声明成员函数称为常成员函数

·        用const修饰的定义对象称为常对象

变量或对象被const修饰后其值不能被更新。因此被const修饰的变量或对象必须要进行初始化。
(一)用const修饰的声明数据成员称为常数据成员 

   有两种声明形式:

const int  cctwl;
int const  cctwl;
不能省略数据类型,可以添加 public private等访问控制符。 

说明:

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

2. 构造函数对常数据成员进行初始化时也只能通过初始化列表进行。(只有此一种方法)

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

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

通过下面例子来理解常数据成员以上4点。

这样也可以给常数据成员num赋值啊,而且可以不同的对象赋不同的值。


A、请指出下面程序的错误

错误一:不能对常数据成员在类中初始化、要通过类的构造函数,只有静态常量才能这样初始化。
错误二:没有合适的默认构造函数可用。因为有常量cctwl没有初始化必须初始化所有常数据成员。

更正后结果如下:

B、多个构造函数下的常数据成员

请指出下面程序的错误:


错误一:每个构造函数都要初始化常数据成员,应改为

(亲测,这样是可以的)
(二)用const修饰的声明声明成员函数称为常成员函数

声明:<类型标志符>函数名(参数表)const;

说明: 

1. const是函数类型的一部分,在实现部分也要带该关键字。

2. const关键字可以用于对重载函数的区分。

3. 常成员函数不能更新任何数据成员,也不能调用该类中没有用const修饰的成员函数,只能常成员函数常数据成员

A、通过例子来理解const是函数类型的一部分,在实现部分也要带该关键字。

但是我测试的下面的程序可以运行啊,下面的错误在哪?似乎正确的,可能作者改过来之后的)

B、通过例子来理解const关键字的重载


C、通过例子来理解常成员函数不能更新任何数据成员

D、通过例子来理解

1、常成员函数可以被其他成员函数调用。
2
、但是不能调用其他非常成员函数。
3、可以调用其他常成员函数。

(三)用const修饰的定义对象称为常对象

常对象是指对象的数据成员的值在对象被调用时不能被改变。常对象必须进行初始化,且不能被更新。不能通过常对象调用普通成员函数,但是可以通过普通对象调用常成员函数。常对象只能调用常成员函数

常对象的声明如下: 

     const  <类名>  <对象名>

     <类名>  const  <对象名>

两种声明完全一样没有任何区别。

1、通过下面例子来理解常对象:

A、请指出下面程序的错误


PS:

·        常成员函数可以引用const数据成员,也可以引用非const的数据成员;

·        const数据成员可以被const成员函数引用,也可以被非const的成员函数引用;

·        常成员函数不能调用另一个非const成员函数。

记住定义为const后,其值不能改变即可。对于常对象、常成员函数,肯定也不能调用能改变其他值得函数。(自己添加)

既要使数据能在一定范围内共享,又要保证它不被任意修改,这时可以使用const。对于const  int *pa,指的是不能通过改变*pa的值来改变pa指向的变量的值,但可以通过改变pa指向的变量的值来改变*pa的值。设置为常引用,还是可以改变实际的值。(但不可用*pab来改变a的值)

指向对象的常指针,其指向始终不变。

指向常变量的指针变量:const 类型名 *指针变量名;(把变量换成对象,即指向常对象的指针变量同下)

1、如果一个变量已被声明为常变量,只能用指向常变量的指针变量指向它,而不能用一般的(指向非const型变量的)指针变量指向它。

2、指向常变量的指针变量除了可以指向常变量外,还可以指向未被声明为const的变量。此时不能通过此指针变量改变该变量的值

3、如果函数的形参是指向非const型变量的指针,实参只能用指向非const变量的指针,而不能用指向const变量的指针

在C++面向对象程序设计中,经常用常指针和常引用作函数参数。这样既能保证数据安全,使数据不能被随意修改,在调用函数时又不必建立实参的拷贝。用常指针和常引用作函数参数,可以提高程序运行效率。



评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值