zoukankan      html  css  js  c++  java
  • 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();
    }
  • 相关阅读:
    2014-11-27-0047-Java
    js去除数组中重复值
    一个数据表更新另外一个数据表(SQL)
    《js12种设计模式》
    《可编辑td》
    《JS 隔行换色》
    用Autohotkey让Kitty命令行变得更好用
    View epub and mobi File on Linux
    DrJava试用笔记
    Notes about BSD
  • 原文地址:https://www.cnblogs.com/shijingjing07/p/5569956.html
Copyright © 2011-2022 走看看