码迷,mamicode.com
首页 > 编程语言 > 详细

c++ const关键字

时间:2015-05-16 20:00:24      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:

通常,不用const来区别数据的类型,在声明过程中,const关键字起到的是修饰限定的作用。

 

1 符号常量(通常,在赋初值后,其值不能改变;而常量在定义时必须赋初值)

 

int i;
const int k = 3; //标识符k代表的内存单元中存放的int型的数据,关键字const限定,不能通过该标识符k来修改所代表的内存单元中的int值

 

i和k代表的内存单元存放的都是int型数据,只是const限定的k为常量;符号常量,在声明时必须赋初值,赋初值后其值不能改变

下面尝试通过声明一个指针变量t引用k所代表的内存单元,希望通过指针t来改变常量k的值,但结果很奇怪,t指向的内存单元就是常量k的内存单元,但值却是2个不同的值

 

int main()
{
    // const限定声明的量k为常量,通过k不能改变其所表示的值
    const int k = 3;

    int *t;
    t = (int *) &k;
    *t = 7;

    cout<<&k<<endl; //0018FF14
    cout<<t<<endl;    //0018FF14

    cout<<k<<endl;  //3
    cout<<*t<<endl;    //7

    return 0;
};

 

 

2. 数组可以被声明为常量(指的是数组中的每个元素都被当作都被当作常量对待)

const char cc[] = "hello"; //在声明时必须赋初值,初始化后,数组元素的值不能改变

 

3 常成员函数、常数据成员

使用const修饰的成员函数 -- 常成员函数

使用const限定的成员函数,为常成员函数,在常成员函数中,不能修改目的对象的数据成员值(通常说的,不能改变对象的状态,mutable关键字修饰的数据成员,不算对象的状态)

在常成员函数中,不能调用非const成员函数(普通成员函数),因为普通成员函数存在的目的就是修改对象的状态

使用const修饰的数据成员 -- 常数据成员(对象实例中的常量部分 -- 每个对象中都拥有各自的副本,与static限定的静态数据成员相区分,静态数据成员 -- 在整个类中只有一个数据副本,为该类的所有对象共同使用、维护)

在数据成员的类型前加const关键字来表征,const限制了对该数据成员的修改,其意思是:该数据成员在构造函数初始化列表中赋初值后,在任何地方都不能对其值进行修改,以后只需做读取该常数据成员的的值即可 --- 此处正契合常量在类中的使用习惯

类的数据成员也可以定义为常量

 

#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std;

class ConstTest
{
private:
    int a;
    const int b; //常数据成员
    mutable int c;

public:
    ConstTest(int a, int b, int c) : b(b) //常数据成员的初始化,只能在构造函数的初始化列表中进行
    {
        this->a = a;
        //this->b = b; //错误,error C2166: l-value specifies const object, 等号左边的值是常对象,而常对象在赋初值后其值不能改变
        this->c = c;
    }

    void incre()
    {
        a++;
    }

    //在常成员函数中,不能修改目的对象的数据成员
    void fun() const
    {
        c++;
        cout<<"a="<<a<<", b="<<b<<", c="<<c<<endl;
    }
};


int _tmain(int argc, _TCHAR* argv[])
{
    ConstTest c_test(3, 5, 9);
    c_test.fun();    //a=3, b=5, c=10
    c_test.incre();
    c_test.fun();    //a=4, b=5, c=11

    return 0;
}

 

4 常引用

在引用声明时,使用const修饰,则被声明的引用就是常引用;通过声明的常引用不能对所引用的对象进行修改。

    int a = 3;
    // const限定声明的引用k为常引用,通过引用k不能改变其所引用的对象的值
    const int &k = a;

    //k = 9;  //error C2166: l-value specifies const object


    const int b = 5;
    const int &t = b;
    //t = 9;  //error C2166: l-value specifies const object

 

常引用,可以绑定到普通对象,也可以绑定到常对象,但常引用把绑定到的对象都当作常对象来使用。这意味着,对于引用基本数据类型的常引用,不能对其赋值,也不能修改其值;对于引用类类型的常引用,不能修改所引用对象的数据成员的值(也包括不能调用它的普通成员函数)

即,通过常引用,只能调用被绑定对象的常成员函数,不能调用它的普通成员函数,当然更不能修改被绑定对象的数据成员  -- 一个目的就是,常引用不能改变其引用对象的状态,因为常引用已经把其所引用的对象当作常对象来看待了。而常对象,是这样的对象:它的数据成员值在对象的整个生存期间内不能被改变,通过常对象不能调用普通成员函数,常对象对外可以的接口就是 --- 常成员函数

 

普通引用,只能引用(绑定到)普通对象,要引用常对象需强制类型转换(调用默认的赋值构造函数完成,此处不确定)

 

c++ const关键字

标签:

原文地址:http://www.cnblogs.com/asnjudy/p/4508267.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!