C++ const使用详解

1.const常量和宏常量
const int max=100;
#define max 100;
const常量相对宏常量有两个有点:
1)有类型安全检查
2)占用内存空间少

2.const变量在内存中的位置
我们在C程序的内存布局中,已经通过示例进行了说明

#include <stdio.h>
const int a = 10; ////全部常量a
int main()
{
    const int b = 20; //局部常量b
    int* pa = (int*)&a;//报错,因为全部常量放在只读数据段
    int* pb = (int*)&b;//修改成功,因为局部常量放在栈上
    *pa = 30;
    *pb = 30;
    return 0;
}

3.const常成员变量的初始化
在某个对象生存期内是常量。

class Test
{
public:
    const int a;
    Test(int i):a(i){}
}

const常量只能通过初始化列表的方式进行初始化

4.const修饰对象
该对象不能修改。只能访问成员变量,不能修改。只能调用常成员函数
关于常成员函数,我们在后面介绍。
如下例所示:

#include<iostream>
class Test
{
public:
    int a;
    void fun0(){}
    void fun1() const{}
};
int main()
{
    Test test;
    const Test& a_test = test;
    std::cout<<a_test.a<<std::endl;//正常,访问公共成员a
    a_test.fun0();//报错,对象包含与成员函数不兼容的类型限定符
    a_test.fun1();//正常
    return 0;
}

5.const修饰指针
我们看一下下面四种写法:

1) const int* a = 10;
2) int const *a = 10;
3) int* const a = 10;
4) const int* const a = 10;

我们需要知道的是,
const在*左,表示指针指向的内容为常量,这也是我们平时说的常量指针
const在*右,表示指针本身为常量,这也是我们平时说的指针常量
因此,1),2)表示指针a指向的内容不能修改
3)表示指针a本身不能修改
4)表示指针a和a指向的内容都不能修改

6.const修饰成员函数,函数参数,返回值
1)修饰成员函数

void fun1() const;

成员函数名后加上const,即表明该函数为常成员函数。
常成员函数的const隐式修饰this指针,即对象不可修改,
所以,常成员函数只能访问成员变量,而不能修改。只能调用其他常成员函数
如下例所示:

int g_a;
void g_fun(){}
class Test
{
public:
    void fun0(){}
    void fun1() const{} 
    void fun2() const
    {
        a = 10;//报错,“必须是可修改的左值”
        fun0();//报错,对象包含与成员函数不兼容的类型限定符
        fun1();//正常,可调用其他常成员函数
        
        g_a = 10;//正常
        g_fun();//正常
    }
private:
    int a;
}

2)修饰函数参数

void fun0(const Test* p_test);
void fun1(const Test& test);

在传入的参数前,加上const,表明传入的参数不可修改。

3)修饰函数返回值

const Test fun0();
const Test* fun1();

当使用const Test* fun1();返回指针时,该返回值只能赋给const修饰的同类型指针。
如下例所示:

class Test
{
public:
    void fun0(){}
    const Test fun1(){
        return *this;
    }
    const Test* fun2(){
        return this;
    }
};
int main()
{
    Test test;
    Test r = test.fun1();
    const Test* rp = test.fun2();
}

 

posted on 2016-06-08 14:28  迪米特  阅读(1256)  评论(1编辑  收藏  举报

导航