const 详解
- 常引用的写法只能是:
- const 类型 & 引用名
- 类型 const & 引用名
- 常成员函数const为什么要写在后面?《高质量C++/C编程指南》戏言,没位置只好写在后面。
- 常量
- 常量因为不允许赋值,所以必须在声明时进行初始化。
- const int model = 90; //ok;
- const int x;//error
- 在类中的数据成员(常量),不能在声明中对其初始化,也不能在构造函数中对其初始化,唯一的方法就是在类的构造函数初始化列表中对常量数据成员初始化。
- 对于如下情形:
- const int c1=1; c1在编译时就会对其求值。有点像会把程序中所有的遇到c1的地方替换成1,而且也不为c1分配空间。若有const int *p = &c1;此时就必须为c1分配空间了。
- const int c2 =m_f(3);编译器不能直接确定c2的值,需为c2分配空间。
- 编译器为const限制了使用方式,我们可以绕过编译器的限制而对const常量进行修改。
- const int i = 10;
int *pi = (int *)&i;
*pi = 30;
cout<<i<<endl; - 此时输出结果为10
- int f(){return 10}
const int i = f();
int *pi = (int*)&i;
*pi = 30;
cout<<i<<endl; - 此时输出结果为30。
- 差异在于第一段代码虽为其分配空间,但类似替换的效果使其输出为10.第二段代码绕过编译器,对常量进行了修改。
- const最常见的用途是作为数组的界和作为switch的分情况标号。
- const对象默认为文件的局部变量(同第5点的链接性)(static与extern水火不熔)
- 变量
- //file_1.cc
int counter;
//file_2.cc
extern int counter;
counter++; - 常量
- //file_1.cc//defines and initializes a const that is accessible to other files
extern const int i =f();
//file_2.cc//uses i from file_1.cc
extern const int i; - 指针和常量
- char s[] = "Gorm";
const char* pc = s; //a pointer to const charpc[3] = 'g'; //errorpc = p; //okchar * const cp = s ; //a cosnt pointer to charcp[3] = 'a'; //okcp = p; //errorconst char * const cpc =s ;//a const pointer to const char
cpc[3] = 'a'; //errorcpc = p; //error - 秘诀:从右向左看,看const和*的位置关系。
- 注:可以将一个变量地址赋给一个常量的指针,因为这样做不会造成任何损害。不能将常量的地址赋给一个未加限制的指针,因为这样将会允许修改该对象的值(这里说的不能是不要这么做,而不是编译器不允许这么做,这应该是编译器的一个bug了,忘记前面我们说的绕过编译器改常量值了吗?
) - 函数参数
- 对于非内部类型的参数,像void Func(A a)因拷贝效率低,应改写成void Func(const A& a )
- 对于内部类型的参数void Func(const int &x)由于拷贝跟引用代价相似
- const 成员函数(任何不修改数据成员的函数都应该声明为const类型)
- clss Stack
{
public:
void Push(int elem);
int Pop(void);
int GetCount(void) const;
private:
int m_num;
int m_data[100];
};
int Stack::GetCount(void) const
{
++m_num;//error,本函数为const
pop();//error,调用非const函数
return m_num;
} - const链接性
- 在默认情况下全局变量的链接性为外部的,但const全局变量的链接性为内部的。也就是说,在C++看来,全局const定义就像使用了static说明符一样,作用域只在本文件。
const int fingers = 10; //same as static const int fingers = 10;
int main(void)
{
...
- 假设将一组常量放在头文件中,并在同一个程序的多个文件中使用该头文件。那么,预处理器将头文件的内容包含到每个源文件后,所有的源文件都将包含类似下面这样的定义:
- const int fingers =10;
const char * warning = "Wak!"; - 内部链接性还意味着,每个文件都有自己的一组常量,而不是所有文件 共享一组常量。每个定义都是所属文件私有的,这就是能够将常量定义放在头文件中的原因。这样,只要在两个源代码文件中包括同一个头文件,则它们将获得同一组常量。
const 详解的更多相关文章
- const详解
详解C++中的const关键字
- C++中的指针(*)、引用(&)、const详解(一、定义变量)
一.前言 本人作为一个工作了5年的程序员,程序生涯最初是从c/c++开始的,但是始终不能很熟悉的理解c语言中的指针和c++中的引用,归其原因,一部分自己没有静下心来思考,一部分原因是其自身的复杂性. ...
- C++中的const详解
const的用法,特别是用在函数后面 在普通的非 const成员函数中,this的类型是一个指向类类型的 const指针.可以改变this所指向的值,但不能改变 this所保存的地址. 在 const ...
- C++ 中的 const 详解
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4235721.html 1.为什么使用 const int 而不使用 #define 在使用# ...
- C++ 常量类型 const 详解
1.什么是const? 常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的.(当然,我们可以偷梁换柱进行更新:) 2.为什么引入const? const 推出的初始目的 ...
- let与const详解
在ES6中,js首次引入了块级作用域的概念,而什么是块级作用域? 众所就知,在js当中存在预解析的概念,就是变量提升.并且只存在全局作用域和私有作用域.在全局定义的变量就是全局变量,而在函数内部定义的 ...
- [js高手之路] es6系列教程 - var, let, const详解
function show( flag ){ console.log( a ); if( flag ){ var a = 'ghostwu'; return a; } else { console.l ...
- ES6 let和const详解及使用细节
ES6之前javascript只有全局作用域和函数作用域,所以经常会遇到变量提升了或者使用闭包的时候出错的问题. 所有a[i]都会输出10: var arr=[]; for (var i=0;i< ...
- ES6中let和const详解
let和var一样也是用来定义变量,不同之处在于let是块级作用域,只在所定义的块级作用域中生效,一个花括号便是一个块级作用域 {var a="我是var定义的";let b=&q ...
- 函数新特性、内联函数、const详解
一.函数回顾与后置返回类型 函数定义中,形参如果在函数体内用不到的话,则可以不给形参变量名字,只给其类型. 函数声明时,可以只有形参类型,没有形参名 把函数返回类型放到函数名字之前,这种写法,叫前置返 ...
随机推荐
- 使用框架结构之frameset
首先,我希望在你的目录下,有4个网页,各自显示不同的内容. 如图所示: 1.html显示"火影忍者" 2.html显示"英雄联盟" 3.html显示" ...
- Eclipse安装tomcat插件
安装插件:Pivotal tc Server Integration for Eclipse右击server可以定位到web项目部署的目录http://marketplace.eclipse.org/ ...
- 操作的系统的PV操作
转自:https://blog.csdn.net/sunlovefly2012/article/details/9396201 在操作系统中,进程之间经常会存在互斥(都需要共享独占性资源时) 和同步( ...
- jenkins使用(2)-配置项目代码的3种方式
1.通过cmd命令直接进入项目代码的文件夹运行,注意路径中不要有中文 2.代码放到工作区:从本地复制项目代码到工作区目录下 代码结构的优化 3.代码连接git或svn,实时更新代码 svn检出 然后上 ...
- Nginx笔记总结十八:nginx统计响应的http状态码信息(ngx-http-status-code-counter)
编译:./configure --prefix=/usr/local/nginx --add-module=../ngx_http_status_code_counter-master make &a ...
- hibernate需要注意的点
1.需要用Hibernate做实体的类(@Entity)需要在配置文件中配置对应的包(例如:spring/appContext-hibernate.xml). 2.hibernateTemplate中 ...
- unittest(22)- p2p项目实战(7)-do_mysql
# 7. do_msql.py import mysql.connector from p2p_project_2020_1_21.tools import project_path from p2p ...
- Java WebSocket实现简易聊天室
一.Socket简介 Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求.Socket的英文原义是“孔”或“插座”,作为UNI ...
- poi报表导出4.1.0版本工具类 导出并下载
这一段时间,由于项目上线基于稳定,所以我这边在基于我们一期迭代的分支上优化一部分我们之前没有做的功能,报表导出.本身之前用的是3.5的版本,但是由于同事要写导入,写的代码只有4.1.0的版本支持,所以 ...
- 张益肇:AI 医疗,微软有哪些布局?
编者按:近几年来,医疗和人工智能碰撞出了相当多的火花,大量资金短期投入到医疗领域当中.然而在微软亚洲研究院副院长张益肇博士看来,人工智能医疗是一场持久战,大家一定要沉下心多调研.多思考.多学习. 人工 ...