您的位置:首页 > 编程语言 > C语言/C++

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

2015-03-23 20:23 861 查看
上面两篇博文地址:

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关键字用法详解及实例和源码下载(二)

源码下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: