const用法及与constexpr区别总结
1、用const修饰函数的参数
参数是值传递
由于函数将自动产生临时变量复制该参数,该参数无需保护,没必要用
const参数是指针传递或者引用传递
const修饰的指针或引用所指向的值不可变。如果该参数只是起“被读取”的作用,最好用const修饰保护。
对于复合数据类型,最好使用引用传递,因为值传递的过程中要进行临时对象的构造,复制,析构,这些都会造成时间和空间的浪费。
class list {
string name;
public:
void show(const list& l) {
cout << name;
}
}
2、用const修饰函数的返回值
如果函数的返回值用const修饰,接受这个返回值的变量也只能用const修饰。
const int sum(int a, int b) {return a+b;}
int s = sum(1,1); //error
const s = sum(1,1); //编译通过
3、const 成员函数
任何不会修改数据成员的函数都应该声明为const 类型。如果在编写const 成员函数时,不慎修改了数据成员,或者调用了其它非const 成员函数,编译器将指出错误,这无疑会提高程序的健壮性。
class list {
string name;
public:
void show(list& l) const {
cout << name;
}
}
4 、const对象
const修饰的对象只能访问const函数和const成员变量
class list {
string name;
public:
void show(list& l) const {
cout << name;
}
void show2(list& l) {
cout << name;
}
}
const list l;
l.show2(); //error
l.show(); //编译通过
const 对象只在当前文件有效,例如a.cc中定义:const int MAX = 999;,这时在b.cc中声明:extern const int MAX;,编译链接后会显示undefined reference to 'MAX'。解决办法是定义前边也加上extern。
5 、与constexpr区别
对于修饰Object来说
const并未区分出编译期常量(编译时就可以确定的常量表达式)和运行期常量constexpr限定在编译期常量,也就是说,编译器看见constexpr就可以在编译期计算,所以应该尽量将一个变量声明为constexpre
对于修饰函数来说
constexpr修饰的函数,返回值不一定是编译期常量#include <iostream>
#include <array>
using namespace std; constexpr int foo(int i)
{
return i + 5;
} int main()
{
int i = 10;
std::array<int, foo(5)> arr; // OK foo(i); // Call is Ok // But...
std::array<int, foo(i)> arr1; // Error }
所以,对于constexpr需要两方面看待。
constexpr修饰的函数,简单的来说,如果其传入的参数可以在编译时期计算出来,那么这个函数就会产生编译时期的值。但是,传入的参数如果不能在编译时期计算出来,那么constexpr修饰的函数就和普通函数一样了。不过,我们不必因此而写两个版本,所以如果函数体适用于constexpr函数的条件,可以尽量加上constexpr。
而检测constexpr函数是否产生编译时期值的方法很简单,就是利用std::array需要编译期常值才能编译通过的小技巧。这样的话,即可检测你所写的函数是否真的产生编译期常值了。
6、指向常量的指针(pointer to const)、常量指针指针(const pointer) 与 constexpr指针
指向常量的指针,又叫底层指针
作用:不能通过指针修改值,无论指向的值是否是const, 指针本身可以改变指向。
int a =1;
const int b = 1;
const int* p;
p = &a;
*p = 2;//错误
p = &b;
*p = 2; //错误
常量指针,又叫顶层指针
作用:不能修改指针的指向,指针本身是常量,所以必须在声明时初始化。
int a = 1;
int b = 1;
int* const p = &a;
p = &b; //报错
constexpr指针
- 作用和常量指针(顶层指针)一样
注意!类型别名与常量指针
typedef int* ip;
int a = 1;
const ip p; //不能理解成 const int *p! 他等价于 int* const p; 也就是顶层指针,顶层指针必须初始化,所以这句是会报错的
const ip p = &a; //正确
7、const引用
int const& a; 和 const int& a; 作用一样,可以不加区分。
参考:https://www.zhihu.com/question/35614219/answer/63798713
https://www.jianshu.com/p/34a2a79ea947
《C++ primer》2.4节
const用法及与constexpr区别总结的更多相关文章
- 【转】话说C语言const用法
原文:话说C语言const用法 const在C语言中算是一个比较新的描述符,我们称之为常量修饰符,意即其所修饰的对象为常量(immutable). 我们来分情况看语法上它该如何被使用. 1.函数体内修 ...
- const 用法全面总结
C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助. Const 是C++中常用的类型修饰符,常类型是指使用类 ...
- const用法详解(转)
http://www.cnblogs.com/StudyRush/archive/2010/10/06/1844690.html 面向对象是C++的重要特性. 但是c++在c的基础上新增加的几点优化也 ...
- const 在C++中的区别
一.Const作用 如下表所示: No. 作用 说明 参考代码 1 可以定义const常量 const int Max = 100; 2 便于进行类型检查 const常量有数据类型,而宏常量没有 ...
- JavaScript中const、var和let区别浅析
在JavaScript中有三种声明变量的方式:var.let.const.下文给大家介绍js中三种定义变量的方式const, var, let的区别. 1.const定义的变量不可以修改,而且必须初始 ...
- c++ const用法小结
const用法 1,定义全局变量的内存分配问题 #define Pi_1 3.14 //使用#define宏 const double Pi_2 = 3.14 //使用const ...
- 实例讲述PHP面向对象的特性;;;php中const与define的使用区别
php中const与define的使用区别 1.const:类成员变量定义,一旦定义且不能改变其值. define:定义全局常量,在任何地方都可以访问.2.define:不能在类中定义,而const可 ...
- const用法
一.const作用 二.const用法 1.修饰一般常量 修饰符const可以用在类型说明符前,也可以用在类型说明符后. 例如: ; ; 2.修饰常数组 修饰符const可以用在类型说明符前,也 ...
- 浅谈HTTP中GET、POST用法以及它们的区别
浅谈HTTP中GET.POST用法以及它们的区别 HTTP定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符.我们可以这样认为: 一 ...
- static 与单例模式、auto_ptr与单例模式、const 用法小结、mutable修饰符
一.static 与单例模式 单例模式也就是简单的一种设计模式,它需要: 保证一个类只有一个实例,并提供一个全局访问点 禁止拷贝 C++ Code 1 2 3 4 5 6 7 8 9 10 11 ...
随机推荐
- 【排序】什么都能排的C语言qsort排序详解【超详细的宝藏级别教程】深度理解qsort排序
[排序]什么都能排的C语言qsort排序详解[超详细的宝藏级别教程]深度理解qsort排序 作者: @小小Programmer 这是我的主页:@小小Programmer 在食用这篇博客之前,博主在这里 ...
- 教你用JavaScript实现实时字符计数器
案例介绍 欢迎来到我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript编程实战案例,做一个实时字符计数器.用户在指定位置打字,程序实时显示字符数量. 案例演示 在编辑框内输入 ...
- 双层nn逻辑回归BP过程的另外一种解释
双层nn逻辑回归 吴恩达的双层nn逻辑回归的一些符号说明比较复杂导致视频难以理解,这里简单做一个说明 注意:阅读下面内容需要具备基本的矩阵求导知识 下面是手推过程,有空在进行修改
- 优雅地使用pt-archiver进行数据归档(转)
一.引言 最近由于业务需求,需要将公有云RDS(业务库)的大表数据归档至私有云MySQL(历史库),以缩减公有云RDS的体积和成本. 那么问题来了,数据归档的方式有n种,选择哪种呢?经过一番折腾,发现 ...
- 使用DeskPins工具钉住窗口
需求 我们经常一边看着PDF或视频教程,一边又打开一个文本编辑器/word/markdown编辑器在做一些笔记.问题是有时候呀需要来回切换(alt+tab)窗口,时间长了其实费时费力,这是一名工程师无 ...
- QT - Day 6
跟着视频教程创建了翻金币的项目,花了好几个晚上才学习完. 视频地址:最新QT从入门到实战 感谢视频的教学,真是受益匪浅. 后面的代码参考了老师的模板以及文档的抒写格式. 发布到随笔中的目的一方面为了完 ...
- leetcode 将有序数组转换为二叉搜索树
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树. 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树. 示例 ...
- 【Azure 环境】向Azure Key Vault中导入证书有输入密码,那么导出pfx证书的时候,为什么没有密码呢?
问题描述 将pfx证书导入Key Vault的证书时,这个PFX需要输入正确的密码导入成功.但是当需要导出时,生成的pfx证书则不需要密码.这是正常的情况吗? 问题解答 是的,这是Azure Key ...
- 【Azure 事件中心】Flink消费Event Hub中事件, 使用Azure默认示例代码,始终获取新产生的事件,如何消费旧事件呢?
问题描述 根据Azure Event Hub示例文档,[将 Apache Flink 与适用于 Apache Kafka 的 Azure 事件中心配合使用],配置好 consumer.config 文 ...
- 【Azure Redis 缓存】Redisson 连接 Azure Redis出现间歇性 java.net.UnknownHostException 异常
问题描述 在Java项目中,使用Redisson作为连接Redis的客户端,间歇性的出现了DNS Monitor throwable 错误. DNSMonitor throwable="ja ...