类学习四

本节介绍关于conste在类中的应用

                                      2016.3.21

一、常对象

1、定义:
类名 const 对象名(实参表);OR
const 类名 对象名(实参表);
**注意事项:
1、声明为常对象的对象,只能调用常成员函数(即类中的成员函数声明也是带const的成员函数)和常数据成员,也只有常成员函数可以引用常对象的数据成员。换句话说:

1、要想调用常对象的常数据成员,必须要成为常成员函数;
2、常对象要想调用成员函数,必须要使那个函数变成常成员函数;
3、常数据成员可以被常成员函数引用,也可以被普通的成员函数调用

为什么不让他调用普通的成员函数?
答:有可能会造成普通成员函数将常对象的数据成员的值修改掉
那么:
为什么编译系统不专检查代码,看看是否被修改?
答:因为函数的定义和函数的声明很可能不在同一个源程序文件中,而编译是以源程序文件为单位的,所以无法检测出矛盾。

二、常对象成员

常数据成员

注意很关键的一点:
1、常数据成员只能通过构造函数的参数初始化表来进行初始化,其余的方法都不行。
2、见上面常对象的注意事项的第三条

const int hour;
Time::Time(int h)
{
hour=h;
}

这样也是错的!!!!!
必须是:
Time::Time(int h) : hour(h) { };

常成员函数

声明:
void get_time() const //const在最后

三、指向对象的常指针

Time t1(10,2,4),t2;
Time *const prt1;
prt1=&t1;   //以后prt1都是指向t1的,在任何时候指针都不变
prt1=&t2;   //这句话就是错误的,prt1只能指向t1,是t1私有的,不能再指向别人
//一生一世一双人(prt1和t1是一对,只要生命依旧,则一直在一起,不能被分开,分开就会死亡)

//平常见得代码一般不这样写,这样写比较复杂

写法二:

Time *const prt1=&t1;

为什么要用常对象指针?
答:想将这个指针只用来与一个对象固定,而且一般常用长指针作为函数的形参,目的是:不允许在函数执行过程中改变指针变量的值,使其始终指向原来的对象。

四、指向常对象的指针

注意“三“讲的是类类型的长指针,而“四”讲的是指针类型的,只不过是指向常对象的。
1、定义:
const char *ptr;
const 类型名 *指针变量名;
2、注意:
1、常变量只能用指向常变量的指针指向他(即指针必须是const的)。

const char c[]="boy";//const型的char数组
const char *p;//p是指向const型的char变量的指针变量
p=c;
//-------------后面两句是错误的--------------
char *p1;
p1=c;

**2、指向常变量的指针变量不是仅仅只能指向常变量,也可以指向一般的变量,但是指向后这个变量的值不能更改。

char c[]="boy";//const型的char数组
const char *pr;//pr是指向char变量的常变量的指针变量
p=c;
c="girl"    //这句话是错误的,c的值不能再更改

五、对象的常引用

一个变量的引用就是这个变量的别名,都是指向同一个内存单元的。

形参即是实参的拷贝,即把实参的地址传递给形参,这样引用名就指向了实参。
把引用声明为const即为常引用。

#include <iostream>
using namespace std;
class Time
{
public:
    Time(int, int, int);
    int hour;
    void get_time();
private:
    int minute,second;
};
Time::Time(int h, int m, int s)
{
    hour = h;
    minute = m;
    second = s;
}
void Time::get_time()
{
    cout << hour<<":"<<minute<<":"<<second<<endl ;
}

void fun(Time &t)   //形参是Time类对象的引用
{
    t.hour=18;
    cout<<t.hour<<endl;
}

void fun1(const Time &t)
{
    t.hour=18;   //这句话是错的,如果变成了常引用,则对象t的值是不允许改变的。只能是实参time对象的值
    cout<<t.hour<<endl;
}

int main()
{
    Time time(10,23,22);
    //实参是Time类的对象time,通过引用来修改time.hour的值
    fun(t1);
    fun1(t1);
    return 0;
}

习惯:经常用常指针,常引用作为函数的参数。

五、对象的动态建立和释放

对象的空间释放在默认的情况下只能是所在函结束时,析构函数析构掉,释放空间。

做到随心所欲的释放和申请用new和delete
new Time;就是动态申请内存空间给一个Time类的新对象,但是这个对象没有对象名,所以可以用类指针指向他,即指针相当于这个对象。这样就可以通过指针访问新建的对象了。

这是习惯,new对象是不写对象名的,都是用指针代替。主要用于动态的数据结构,比如链表。访问链表中的节点不需要对象名,因为上个节点存放下一个节点的地址。

如下:

Time *ptr;
ptr=new Time;

访问对象:
cout<hour<

如何判断new的对象是否申请空间成功??

答:规定的是new返回的是0指针值(即NULL),只要检测返回值是否为0,就可判断分配内存是否成功。

这个对象不用了就把它撤销,用delete

delete ptr;//撤销这个指针就是撤销了这个对象,释放了占用的内存空间。

注意:析构在delete之前被调用。

今天就写到这里,给闺蜜通过电话,然后看看代码。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值