Const int size = 512;

在编译的时候,编译器会把用到该变量的地方全部替换成对应的值。

const&可以绑定字面值,所以当用常量引用绑定一个常量时,是否可以看成那个值在编译阶段已经被替换了
 
如果程序有多个文件,则用了const对象的文件必须要能访问到const的初始值才行,所以每个文件中都要
有它的定义才行。为了避免同一个变量的重复定义,const对象只在文件内有效。
 
如果现在多个文件中共享const,必需在变量前面添加extern限定符。只定义一次
在file_1.cc:
extern const int size = fcn();

在file_1.h:(和.cc中的定义的size是同一个)

extern const int size;

const引用和const指针:

int main()
{
//T&必须要类型为T的左值进行初始化
//本质:const在谁后面谁就不可修改,const在最前面则将其后移一位即可,二者等效
//1.const T&
int val1 = 100;
int &ta = 100; //error 必需为左值
int &tb = a + 1; //error
const int &ptr1 = val1; //会先赋值给一个临时量,然后再赋值给ta. 不能通过ta修改a,但能通过a修改a
ptr1++;
cout << ptr1 << endl;
system("pause");
//2.const T*
double val2 = 3.1415926;
const double *ptr2 = &val2;
cout << *ptr2 << endl;
(*ptr) += 1; //本来必需指针类型和对象类型一致 , 但是一个指向常量的指针可以指向一个非常量对象,但是无法修改val
system("pause");
//3.T*const
double val3 = 3.14;
double *const ptr3 = &val3;
const double val4 = 3.14;
const double *const ptr4 = &val4; //指针类型和对象类型要一致
ptr3 = &val1; //error 常量指针一旦指向一个地址就再也不能改变了
cout << *ptr3 << endl;
system("pause");
//4.const T* and T* const
/*
指向常量和常量指针的区别
允许一个常量引用()绑定非常量对象,字面值,表达式,区分常量指针和指向常量的指针,注意识别指针的引用
*/
int val5 = 2012;
int *ptr5 = &val5;
const int *ptr6 = ptr5; //同2
/*const int *&zh = &tval;*/
const int *&ptr7 = ptr5; //why?T&必须要类型为T的左值进行初始化. 但是不是说允许一个常量引用绑定非常量对象,字面值,表达式
int * const &ptr8 = ptr5; //注意const不能放在*之前,否则就是修饰指针所指的对象了(这样就不是常量对象了)
const int *&ptr9 = ptr6;
system("pause"); //5.&val不是一个左值
int* Ptr = &val5;
int* &Ptr1 = Ptr;
int* &Ptr2 = &val5; //&val5不能作为一个左值,即进行++操作等。
int* const &Ptr3 = &val5; //可以用常量指针处理,就成了常量对象的引用
//6.const对象不分配内存?可能是因为编译阶段的替代
const int val = 2012; // val不分配存储空间
int& valr = val; // error,val不能做左值
const int& valr = val; // ok,也是通过中间变量处理
//7.可以将const转换成指向常量的指针 or 用常量对象引用
const int val = 2012;
const int* p = &val;
const int* &pr = p; // ok,p是左值
const int* const& pr1 = &val; // ok,通过中间变量初始化
int* const& pr2 = &val; // error,引用的类型不符合,一个是const int*,另一个是int* /*
8.difference between constexpr and const
constexpr定义一个指针的时候,只会修饰指针
*/
constexpr int tval = 2000;
int tval1 = 1000;
constexpr int* p = &tval1;
const int* Cptr = &tval;
constexpr int* Cxptr = &val;
constexpr const int *cCxptr = &tval;
cout << *p << " " << *cCxptr << endl;
system("pause");
return 0; /*9.*/
typedef char* cptr;
const cptr ptr = 0; //const修饰cptr,所以是一个常量指针
//error:you will think it as (const char* ptr),but the const decorate pointer.
}
/*
对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。例如:
const classA operator*(const classA& a1,const classA& a2);
operator*的返回结果必须是一个const对象。如果不是,这样的变态代码也不会编译出错:
classA a, b, c;
(a * b) = c; // 对a*b的结果赋值
操作(a * b) = c显然不符合编程者的初衷,也没有任何意义
*/

  

为什么auto忽略顶层const

假如某个函数返回类型 const T
const T SomeFunction();
你很可能希望有一个可变的变量接收这个值:
auto t = SomeFunction();
t.Modify();

初始化过程中忽略顶层const:

const int a = 100;
int b = a; //忽略顶层const
 

C++Primer学习——const的更多相关文章

  1. C++ Primer学习笔记(三) C++中函数是一种类型!!!

    C++中函数是一种类型!C++中函数是一种类型!C++中函数是一种类型! 函数名就是变量!函数名就是变量!函数名就是变量! (---20160618最新消息,函数名不是变量名...囧) (---201 ...

  2. C++ Primer学习笔记(二)

    题外话:一工作起来就没有大段的时间学习了,如何充分利用碎片时间是个好问题. 接  C++ Primer学习笔记(一)   27.与 vector 类型相比,数组的显著缺陷在于:数组的长度是固定的,无法 ...

  3. 转载:看c++ primer 学习心得

    学习C++ Primer时遇到的问题及解释 chenm91 感觉: l          啰嗦有时会掩盖主题:这本书确实有些啰嗦,比如在讲函数重载的时候,讲了太长一大段(有两节是打了*号的,看还是不看 ...

  4. C++ primer学习记录(个人猜想未测试版本)

    学习版本:第五版. 本博文主要记录个人曾经并不知晓知识细节. 因为linux下的编译环境还未进行学习.所以实际代码测试将在今后完成. 红色:需确认. 蓝色:重点. 1)const对象设定为仅在文件内有 ...

  5. C++ Primer 学习笔记_35_STL实践与分析(9)--map种类(在)

    STL实践与分析 --map类型(上) 引: map是键-值对的集合. map类型通常能够理解为关联数组:能够通过使用键作为下标来获取一个值,正如内置数组类型一样:而关联的本质在于元素的值与某个特定的 ...

  6. c++ primer 学习杂记2【派生类到基类转换的可访问性】

    参考: http://blog.csdn.net/rehongchen/article/details/7930853 http://blog.csdn.net/ming_road/article/d ...

  7. C++ Primer学习笔记(一)

    始终对C++念念不忘,看过 一个32岁入门的70后程序员给我的启示  之后,心情激荡,更是一发不可收拾. 认真地说,我不是一个执着的人,见异思迁,好读书而不求甚解,兼之情绪化(~~ 某些方面),于是怒 ...

  8. C++ Primer学习笔记二

    vector<int> a(10,0); for(vector<int>::iterator itor=a.begin();itor!=a.end();itor++) *ito ...

  9. C++primer学习笔记(四)——Chapter 6

    6.1  Function Basics 一.函数的构造 type functionName( parameters list) statement 1.首先格式如上,一个函数一定要有返回值的类型ty ...

随机推荐

  1. alpha冲刺总结随笔

    前言:前面乱乱糟糟整了一路,到最后终于可以稳定下来了.安安心心做个总结,然后把之后要做的事情都理清楚好了. 新学长似乎是个正经[并不]大腿. 看起来也不用都是一个人或者跟陈华学长两个人对半开了[突然摸 ...

  2. 学号:201621123032 《Java程序设计》第9周学习总结(

    1:本周学习总结 1.1:以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容 2:书面作业 2.1: List中指定元素的删除(题集题目) 2.1.1:实验总结.并回答:列举至少2种在List ...

  3. Flask 扩展 Flask-RESTful

    Flask路由可以指定HTTP请求方法,并在请求函数中根据不同的请求方法,执行不同的逻辑.这样实现一个Restful的请求已经相当简单了 Flask还有更简便的方法,就是其Flask-RESTful扩 ...

  4. org.hibernate.hibernate.connection.release_mode

    org.hibernate.connection包的主要封装了通过JDBC来连接数据库的操作,用户可以以数据源的方式,或者通过特定数据库驱动的方式,甚至是自己定义连接类的方式来完成数据库的连接操作,包 ...

  5. CentOS7安装配置iptables防火墙

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/50779761 CentOS7默认的防火墙不是iptables,而是firewall ...

  6. bzoj千题计划274:bzoj3779: 重组病毒

    http://www.lydsy.com/JudgeOnline/problem.php?id=3779 有一棵树,初始每个节点有不同的颜色 操作1:根节点到x的路径上的点 染上一种没有出现过的颜色 ...

  7. Document Object Model

    什么是DOM W3C制定的书写HTML分析器的标准接口规范 全称 Document Object Model 文档对象模型DOM为HTML文档提供的一个API(接口) 可以操作HTML文档 <! ...

  8. zTree根据json选中节点,并且设置其他节点不可选

    首先,在适配目录树时,使用checkbox形式,配置代码如下: var settingCatalog = { check:{ enable: true }, data:{ simpleData:{ e ...

  9. python生成单词壁纸

    1.首先上结果: 其实就是一段简单的代码.加上英语单词表加上几张背景图生成许多类似的图片再设置成桌面背景,十分钟一换.有心的人闲的时候随手就能换换桌面背背单词.最不济也能混个脸熟. 3.上代码 #-* ...

  10. Spring Security 入门(1-4-2)Spring Security - 认证过程之AuthenticationProvider的扩展补充说明

    1.用户信息从数据库获取 通常我们的用户信息都不会向第一节示例中那样简单的写在配置文件中,而是从其它存储位置获取,比如数据库.根据之前的介绍我们知道用户信息是通过 UserDetailsService ...