C++中const关键字用法详解及实例和源码下载(三)

来源:互联网 发布:网络侦探攻略 编辑:程序博客网 时间:2024/06/06 19:27

上面两篇博文地址:
C++中const关键字用法详解及实例和源码下载(一)
C++中const关键字用法详解及实例和源码下载(二)
继续紧接着上面两篇博文的内容讲述const关键字的用法。

  • 指向对象的常指针
    将指向对象的常指针变量声明为const型并将之初始化,这样的指针始终保持为其初值,不能改变,即其指向始终不变。
    一般形式为:
    类名 * const 指针变量名 = 对象地址;
    常常使用常指针作为函数的形参,目的是不允许在函数执行过程中改变指针变量的值,使其时钟指向原来的对象。
    实例代码:
#include<iostream>#include<string>using namespace std;class Test{public:    Test();    Test(int,string);    void display();private:    int age;    string name;};Test::Test(int a,string nam){    age = a;    name = nam;}void Test::display(){    cout<<"age="<<age<<",name="<<name<<endl;}int main(){    Test stu(10,"dd");    stu.display();    Test * const p = &stu;    p->display();    (*p).display();    return 0;}

实例代码中使用了指向对象的常指针的用法。大家可以试试,该常指针不能指向另一个对象,并且必须进行初始化操作。有一点要注意的是,可以改变它所指向的对象的数据成员的值

  • 指向常对象的指针变量
#include<iostream>#include<string>using namespace std;class Test1{public:    Test1(int,string);    void display() const;private:    int age;    string name;};Test1::Test1(int a,string nam){    age = a;    name = nam;}void Test1::display() const{    cout<<"age="<<age<<",name="<<name<<endl;}int main(){    Test1 test1(23,"ddee");    test1.display();    const Test1 * pp = &test1;    Test1 const * pp1 = &test1;    (*pp).display();    (*pp1).display();    pp->display();    pp1->display();    cout<<"=======分隔符========="<<endl;    Test1 const test2(25,"ffee");    test2.display();    const Test1 * pp2 = &test2;    pp2->display();    return 0;}

结果:
这里写图片描述
从结果可以看出:
定义指向常变量的指针变量的一般形式为:
1、const 类型 * 指针变量名 (或者)
类型 const * 指针变量名
2、如果一个变量已被声明为常变量,只能用指向常变量的指针变量指向它,而不能用一般的指针变量指向它。
3、指向常变量的指针除了可以指向常变量外,还可以指向未被声明为const的变量。此时不能通过指针变量改变变量的值。

下面再来看代码

#include<iostream>#include<string>using namespace std;class Test1{public:    Test1(int,string);    void display() const;    void setvalue(int) const;private:    int age;    string name;};Test1::Test1(int a,string nam){    age = a;    name = nam;}void Test1::display() const{    cout<<"age="<<age<<",name="<<name<<endl;}void Test1::setvalue(int a) const{    age = a;}int main(){    Test1 test1(23,"ddee");    test1.display();    const Test1 * pp = &test1;    Test1 const * pp1 = &test1;    (*pp).display();    (*pp1).display();    pp->display();    pp1->display();    cout<<"=======分隔符========="<<endl;    Test1 const test2(25,"ffee");    test2.display();    const Test1 * pp2 = &test2;    pp2->display();    //改变指针pp的值    cout<<"改变指针pp的值"<<endl;    pp = &test2;    pp->display();//  pp->setvalue(12);//  pp->display();    return 0;}

结果:
这里写图片描述
这段代码改变了pp的值,说明指向常对象的指针变量可以改变指向
值得注意的是,如果把代码中的注释部分取消,则是编译不通过的,说明指向常对象的指针变量不能改变它所指向的变量的值。

总结如下:
1、const 类型 * 指针变量名 (或者)
类型 const * 指针变量名
2、如果一个变量已被声明为常变量,只能用指向常变量的指针变量指向它,而不能用一般的指针变量指向它。
3、指向常变量的指针除了可以指向常变量外,还可以指向未被声明为const的变量。此时不能通过指针变量改变变量的值。
4、指向常对象的指针常用于函数的形参,目的是在保护形参指针所指向的对象,是它在函数执行过程中不被修改。
5、如果定义了一个指向常对象的指针变量,是不能通过他改变所指向对象的值的,但是指针变量本身的值是可以改变的。

  • 对象的常引用
    代码如下:
#include<iostream>#include<string>using namespace std;class Time{public:    Time(int,int,int);    void display();    int hour;    int min;    int sec;};Time::Time(int h,int m,int s){    hour = h;    min = m;    sec = s;}void Time::display(){    cout<<"hour="<<hour<<",min="<<min<<",sec="<<sec<<endl;}void fun(Time &t){    t.hour = 19;}int main(){    Time time(12,12,12);    time.display();    fun(time);    time.display();    return 0;}

结果:
这里写图片描述
这段代码是很常规的对象的引用的例子,利用对象的引用改变原来对象的值。
如果不希望函数中修改实参的值,可以把函数的形参修改为如下形式:

void fun(Time const &t){    t.hour = 19;}

再次进行编译,则会出错,因为函数fun中尝试修改的引用t所引用对象的值。
这样就保证了在函数中不能修改形参所引用对象的值。
在C++的面向对象的程序设计中,经常使用常指针和常引用做函数的形参。这样既保证数据安全,使数据不能随意修改,在调用函数时又不必建立实参的拷贝!!

博文链接:
C++中const关键字用法详解及实例和源码下载(一)
C++中const关键字用法详解及实例和源码下载(二)

源码下载

0 0