简单聊一下const

问题索引:

1.为什么要存在这种东西?

2.它有什么样的作用?

3.与define 有什么联系?

4.C与C++中的const有什么区别?

5. C++ 11 中又有了些什么新的东西?

解:

1.为什么要存在这种东西?就是为了避免程序员在编程时,手残修改关键部分的值(其实想一想内核为什么会分内核态和用户态,类中为什么要有public和private也就明白了)

2.它有什么样的作用?其实说的简单点就是保护被修饰的东西,防止意外的修改

3.与define 有什么联系?他们的底层实现是如何的?其实这是一个最不好回答的问题。我就简单的从内存方面来叙述一下

联系:

define – 不分配内存,给出的是立即数,只是简单的替换。有多少次使用就进行多少次拷贝替换,在内存中会有多个拷贝,消耗内存大

const – 在静态存储区中分配空间,在程序运行过程中内存中只有一个拷贝

更多的戳这里和那里:这里
那里

4.C与C++中的const有什么区别?

C中的const

1.C中的const修饰的是只读变量,还是变量,只是不可写

2.有两种改变变量的值:(1)直接赋值的形式(2)通过指针

const  m= 10;   //m 的值不能在程序中被修改(但可以通过指针改变它)
const char *p; //*p不能变,即通过指针无法改变变量的值
char const *p;  //同上,只是形式不同而已
char *const p;  //p不能变,即**指针p的指向**被固定,也就是说,指针这个变量只能存储指向变量的值。
const char *const p; //*p 和p同时不能变 

举例验证:

1.代码:

#include<stdio.h>
int main(void)
{
    /*const 19;  //修饰了常量*/
    const int m = 10;
//    m= 11;  //1.c:13:6: 错误:向只读变量‘m’赋值
    int *p_m = &m ; //1.c:14:16: 警告:initialization discards ‘const’ qualifier from pointer target type
    *p_m = 999999;
    printf("m ==  %d \n",m);   //通过指针就可以改变它的值
    return 0;
}

这里写图片描述

2.代码:

#include<stdio.h>
int main(void)
{
    /*int m= 10;
    const int *p ;
    p=&m; 
//    *p= 1111; //1.c:14:7: 错误:向只读位置‘*p’赋值
    m= 22222;  //直接赋值的形式可以改变它的值
    printf("const int *p的情况:  m == %d \n",m);*/



    int n = 50;
    int temp = 0;
    int *const  p=&n ;
    p=&temp ; //1.c:26:6: 错误:向只读变量‘p’赋值     
    return 0;
}

注意只读变量‘p’与只读位置‘*p’ 的差别!!!!

记法:左定值,右定向。

解释:const 在(变量)的左边,即:const int *p .就不能通过(*变量)来改变它的值。const 在(变量)的右边,即: int *const p .就不能改变指针的指向。**

C++中的const

1. const对象必须初始化 ,比如:const int k ;就是错误的

2.默认状态下,const对象仅在本文件内有效。如果要在其他文件中也要使用该对象,需要使用extern来声明

3.常量引用(不是一个对象):C++一般不允许改变引用所绑定的对象(其实引用就是给这个对象起了一个新名字,其实就是一个硬链接)但是绑定的这个对象是不是const型就没有什么太大的关系了,如果是const,那就它所参与的运算不能改变它的值,如果不是,那就可以改变它的值。但是引用与对象之间的关系又不会被改变~_~

4.指针是一个对象,它又可以指向另一个对象,那么指针可以是常量,指针指向的对象也可以是常量。顶层const就是指针本身是一个常量,底层const表示指针指向的对象是一个常量。

链接学习:这里写链接内容

这里写链接内容

5.C++ 11 中又有了些什么新的东西?

1.常量表达式:值不会改变,在编译过程中就能得出结果的表达式

2.constexpr :规定该类型就可以告诉编译器去验证变量的值是不是一个常量表达式。声明为该类型的变量一定时一个常量,必须用常量表达式来初始化。

初学者,先学完,再回头,找细节!

posted @ 2017-11-02 23:05  Tattoo_Welkin  阅读(232)  评论(0编辑  收藏  举报