const引用和constexpr
1.const指针
eg:
(1) int const * p = nullptr;
p = new int[10];
p[3] = 4; //error
我们发现第三行没法编译,这是因为第一行的const限制的时int,意思就是无法改变p所指的int类型的值。
(2) int * const p = nullptr;
p = new int [10]; //error
这是为什么呢?原来时因为const限定的是int*,也就是限定的是指向int*的指针,也就是p指针;所以第二行是报错的。因为p已经有了nullptr,
(3) const int * p 和int const * p是一个道理;
2.const引用
const引用通常比const指针简单,原因有两个:
第一:引用默认为const无法改变引用所指的对象,所以不需要显示的指出const。
第二:引用无法创建引用的引用,只可能是有一层间接的取值,获取多层间接的取值唯一方法就是创建指针的引用。
eg:int a;
const int & aRef = a;
aRef = 2; //error
值得注意的是:const int & aRef = a; 与 int const & aRef = a;是一样的;
因为const引用与int所以没办法改变aRef的值,但是不会影响a的改变。
int a = 3;
int const & aRef = a;
std::cout << aRef << std::endl; //aRef = 3;
a = 5;
std::cout << aRef << std::endl; //aRef = 5;
3.constexpr关键字
C++一直存在常量表达式的概念,
有的时候不使用constexpr是不合适的,
eg: int getValue(){return 10;}
int arrayInt[getValue()]; //error
但是这样是可以的:
constexpr int getValue()
{
return 10;
}
int arrayInt[getValue()]; //OK
需要注意的是constexpr是由一些限制的:
例如:
- 函数体是一个有return 语句,不包含goto语句和try catch块,也不抛出异常,但是可以调用其他的constexpr函数
- constexpr函数必须返回字面量类型。返回值不能是void
- 如果constexpr是一个类的成员函数,则他不能是virtual函数
- 函数的所有参数都应该是字面量类型
- 不允许使用dynamic_cast
- 不允许使用new 和 delete.
class Rect
{
public:
constexpr Rect(int inWidth,int inHeight)
:mWidth(inWidth)
,mHeight(inHeight)
{ } constexpr int getRect() const
{
return mWidth * mHeight;
}
private:
int mWidth,mHeight; };
int main(int argc, char** argv)
{
Rect rect(,);
std::cout << "Rect's area : " << rect.getRect() <<
std::endl; return ;
}
结果是:Rect's area : 10
const引用和constexpr的更多相关文章
- const引用和函数占位参数遇上默认参数以及内联函数
1.const引用: 但是加上const之后是可以的,const int &a=100;就不会报错了. 2.函数占位参数: 如果给最后的占位参数加上默认值: 3.内联函数 内联只是对编译器发起 ...
- C++ Const引用详解
(1) 在实际的程序中,引用主要被用做函数的形式参数--通常将类对象传递给一个函数.引用必须初始化. 但是用对象的地址初始化引用是错误的,我们可以定义一个指针引用. 1 int ival ...
- 【c++基础】const、const指针、const引用
一.const常量 声明时必须同时初始化(和“引用”一样) 二.const指针 三.const引用 引用本身和引用的对象都是const对象,可以用字面值来赋给const引用(普通引用则不行) ; co ...
- 传const引用代替传值
1.为什么使用传const引用? a.被调方法中,形参不再进行copy构造,以及析构,提高效率. b.传值,会出现对象切割的问题. 2.有没有例外? 在编译器底层,引用是使用指针实现的.这就意味着,如 ...
- const引用
在C++中可以声明const引用 const Type& name = var: const引用让变量拥有只读属性 const int &a = b const int &a ...
- c/c++ 拷贝控制 右值与const引用
拷贝控制 右值与const引用 背景:当一个函数的返回值是自定义类型时,调用侧用什么类型接收?? 1,如果自定义类型的拷贝构造函数的参数用const修饰了:可以用下面的方式接收. Test t2 = ...
- C++引用和const引用、常量指针、指针常量
1.引用.常量引用 引用主要被用做函数的形式参数--通常将类对象传递给一个函数. 引用在内部存放的是一个对象的地址,它是该对象的别名.引用不占用内存,因为取地址引用的值和被引用变量的地址相同.但是ob ...
- const引用返回值
一.引用 引用是别名 必须在定义引用时进行初始化.初始化是指明引用指向哪个对象的唯一方法. const 引用是指向 const 对象的引用: ; const int &refVal = iva ...
- 非const引用参数传入不同类型编译不过的理解(拒绝将临时对象绑定为非const的引用的形参是有道理的)
int f (int & I) { cout<<I<<std::endl; } void main() { long L; f(L); // 编译不过 f((int)L ...
随机推荐
- eclipse中编写运行c/c++
注意:此过程有点复杂 准备:1.MinGW:c/c++运行环境: 2.CDT 1.MinGW:安装程序:http://sourceforge.net/projects/mingw/?source=ty ...
- BZOJ4650: [Noi2016]优秀的拆分(hash 调和级数)
题意 题目链接 Sol NOI的题都这么良心么.. 先交个\(n^4\)暴力 => 75 hash优化一下 => 90 然后\(90\)到\(100\)分之间至少差了\(10\)难度台阶= ...
- apply的妙用
有一个很常见的问题"call和apply的区别是什么?",大家都知道答案:它们的区别仅在于接受参数的方式不同,传递给call的第二个参数必须逐个列举出来,而传递给apply的第二个 ...
- 20个网页设计师应该学习的CSS3经典教程实例
CSS3技术离我们越近,我们也应该学习一些简单的CSS3技术了,而学习最基本的方法就是模仿,以及观看大师作品的案例.收集了20个基础教程,均是涉及到css3应用范围,值得你和我一起共同学习. Smoo ...
- UTF-8和GBK编码转换iconv
iconv("GBK", "UTF-8", $str);//将GBK编码转换成UTF8编码
- css多行文本省略号(...)
如果实现单行文本的溢出显示省略号同学们应该都知道用text-overflow:ellipsis属性来,当然还需要加宽度width属来兼容部分浏览. 实现单行文本省略 <!DOCTYPE html ...
- c# copy类中值到另外一个对象中
贴图: 调用:
- 在 ubuntu 上运行 php 脚本
在 ubuntu 上运行 php 脚本 一.配置运行环境 1.要在 ubuntu 上运行 php 脚本,需要安装 Apache2 和 PHP 具体步骤,请参考:Ubuntu 搭建Web服务器(MySQ ...
- PHP把下划线分隔命名的字符串与驼峰式命名互转
最近项目使用symfony框架,这个框架对数据库的操作在这个团队里使用的是ORM进行操作,说实话使用ORM的开发效率和运行效率不一定高多少,到是它的实体命名和现有数据库字段的命名不太一样,ORM实体属 ...
- qt 拖放dropEvent
1.拖放操作分为两个截然不同的动作: 拖动和放下. 拖动通过 void dragEnterEvent(QDragEnterEvent * event); 来实现. 放下通过 void dropEven ...