C++_04_const用法

const修饰普通变量
  const修饰普通变量时要初始化赋值

#include<iostream>

using namespace std;

/*
    const修饰常量
    ---修饰成员变量时,必须在构造函数的参数列表中初始化
    ---修饰成员函数时,加在函数后面,并且该函数无法修改成员属性
*/
//const修饰普通变量时要初始化赋值


int main(int argc, char const *argv[])
{
    int x = 1;

    const int a = 10;           
    int const b = 20;
    //定义两个整形常量,以上两种写法作用一致,没有区别

    const int *c = &a;           
    //const修饰指针指向的值为常整形,
    //指针的地址可以修改,但锁指向的数据不能修改

    int * const d = &x;
    //const修饰的是指针本身,为常指针
    //即指针变量(地址)不能修改,但是指针指向的数据可以修改

    const int * const e = &a;
    //const同时修饰指针和指针指向的数据,两针皆不可修改
    
    cout << "-------------------初值---------------------" << endl;
    cout << "x = " << x << "                  " << "&x = " << &x << endl;
    cout << "a = " << a << "                 " << "&a = " << &a << endl;
    cout << "b = " << b << "                 " << "&b = " << &b << endl;
    cout << "c = " << c << "     (a的地址)" << " *c = " << *c << endl;
    cout << "d = " << d << "     (x的地址)" << " *d = " << *d << endl;
    cout << "e = " << e << "     (a的地址)" << " *e = " << *e << endl;

//    a = 200;
//    b = 300;
    int m = 80; 
    c = &m;   
/*  *c = 400;    */

//    d = &m;
     *d = 500;

//    e = &m;
 /*   *e = 600;   */

    cout << "-------------------赋值---------------------" << endl;
    cout << "x = " << x << "                " << "&x = " << &x << endl;
    cout << "a = " << a << "                 " << "&a = " << &a << endl;
    cout << "b = " << b << "                 " << "&b = " << &b << endl;
    cout << "c = " << c << "     (a的地址)" << " *c = " << *c << endl;
    cout << "d = " << d << "     (x的地址)" << " *d = " << *d << endl;
    cout << "e = " << e << "     (a的地址)" << " *e = " << *e << endl;

    
    return 0;
}

const修饰成员变量

  在C++类中的成员变量,只能使用初始化参数列表进行初始化赋值

#include<iostream>

using namespace std;
class A
{
    public:
        A() //构造函数声明
        {
        }
    int a;
    char c;

};

A::A():a(6),c('e')  //构造函数定义,参数列表初始化
{

}

const修饰类对象

const修饰成员函数
  1、const成员函数可以访问const和非const成员变量,但是不能修改任何成员变量的值
  2、非const成员函数不能访问const成员变量,只能访问和修改非const成员变量
  3、const 成员函数是不能调用类中非 const 成员函数的。(const成员函数在只能调用const成员函数)

const构造函数初始化

const在C语言和C++中的比较:

  在C中const是“冒牌货”
    在C中  const int a = 10; 
           不是真的说a被定义为一个常量(冒牌货),a依旧可以通过指针修改其数据值
         C语言中const变量是只读变量,有自己的存储空间

    在C++中  const int a = 10; 
         const 定义的才是常量,不可修改。
         可能分配存储空间,也可能不分配存储空间(C++中编译器将const修饰的变量放置在符号表中,在这个表中,不论是变量名、地址、数据本身都是不允许被改变的——就是完完全全的常量,当需要去地址的时候,会单独再分配一块空间,用指针存取(拷贝)变量的地址,这个地址对应的新空间数据和原来的数据没有一点点关系,不会影响到原来的数据值,如下图:)
         当const常量为全局,并且需要在其它文件中使用或者当使用&操作符取const常量的地址的时候,才分配内存空间,但也只是取地址,依旧不能修改内存中存放的2数据本身
         当使用&操作符,取const常量的地址时,会分配存储空间
         当const int &a = 10; const修饰引用时,也会分配存储空间

  正因为单独给const常量分配内存,导致有机会通过地址修改数据值,这样和常量初衷矛盾;
  正常情况下,C语言const会分配单独内存空间,但C++一般不会首先这样做。当C++需要分配内存空间的时候(编译过程中若发现对const使用了extern或者&操作符,则给对应的常量分配存储空间),也只能通过&获取地址,但不能更改存储空间的数据本身

 

const和#define比较

  const和#define相同之处
    C++中的const常量类似于宏定义         const int c = 5; ≈ #define c 5

  const和#define的区别   
    const常量是由编译器处理的(编译期间),提供类型检查和作用域检查
    宏定义由预处理器处理(编译预处理),单纯的文本替换

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值