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(2,5);
    std::cout << "Rect‘s area : " << rect.getRect() <<
        std::endl;

    return 0;
}

结果是:Rect‘s area : 10

原文地址:https://www.cnblogs.com/boost/p/10352539.html

时间: 2024-10-26 01:03:08

const引用和constexpr的相关文章

C++ 中有关const引用的一点小知识

在读<C++ Primer>时,发现之前对const的概念不是很清晰,只知道如何去使用,于是翻开const引用部分又阅读了一遍,发现有两点自己要注意的地方 1.const限定的对象不可以初始化非const引用 ex. 1 const int src = 512; 2 const int &ok_dest = src; //ok: 引用和初始化对象都是const 3 int &err_dest = src; //error : 引用为非const 原因很简单, src 是不可以被

非const引用不能指向临时变量

没找到具体原因,MSDN看到下面这句,VC是从2008才有这一限制的,感觉就是从语法上对临时变量增加了限定,因为一般说来修改一个临时变量是毫无意义的,通过增加限定,强调临时变量只读语义.虽然实际上修改临时变量并不会有问题. Visual Studio 2008 In previous releases of Visual C++, non-const references could be bound to temporary objects. Now, temporary objects ca

C++ Primer 学习笔记_17_从C到C++(3)--引用、const引用、引用传递、引用作为函数返回值、引用与指针区别

欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢 一.引用 1.引用是给一个变量起别名 变量: 名称 空间 引用: 引用不是变量 引用仅仅是变量的别名 引用没有自己独立的空间 引用要与它所引用的变量共享空间 对引用所做的改变实际上是对它所引用的变量的改变 引用在定义的时候必须要进行初始化 引用一经初始化,不能重新指向其他变量 2.定义引用的一般格式: (1)类型  &引用名 = 变量名: (2)例如: int a=1; int &b=a; // b是a的别名,因此a和b是同一个单元 (3)

深入学习 const指针,const引用

指针和引用的区别: 1.指针可以为空,引用不可以为空. 2.指针初始化后可以重新指向新对象,引用初始化以为不可以重新绑定新对象, 3.指针可以在初始化时赋值,可以初始化以后通过赋值运算符(=)赋值:引用只能在初始化时赋值. 4.指针是个实体(占内存4byte),引用只是个别名(不占内存) 5.指针sizeof是4byte,引用sizeof是绑定对象的大小. 6.指针是类型安全,引用是类型安全的. const对于指针和引用的区别: int a = 1: int b = 1: const int *

为什么赋值操作符函数的参数为const引用,返回值为引用

为什么赋值操作符函数的参数为const引用,返回值为引用 1.返回值类型 返回类型一般声明为类型的引用,并在函数结尾时返回实例自身的引用(即*this).这里主要有两个原因:(1)返回引用可以减少一次拷贝构造和析构函数导致不必要的开销,因为返回值类型不是引用,会创建一个匿名对象,这个匿名对象时个右值,获取return的值.(2)可以实现连续赋值 在例子中 b=c=a; 返回值不是引用类型也是可以的,其运算顺序 b=(c=a); c得到一个右值,再将右值赋给b,所以逻辑上没有问题的.但是如果是 (

C++primer: 引用&amp;与 const 引用

1.什么是引用? 引用就是对象的另外一个名字.在实际程序中,引用主要用作函数的形式参数. 引用是一种复合类型,通过在变量名前面添加"&"符号来定义.复合类型是指用其他类型定义的类型.在引用的情况下,每一种引用类型都"关联到"某一其他类型.不能定义引用类型的引用,但是可以定义任何其他类型的引用. 引用必须用与该引用同类型的对象初始化: int ival = 1024; int& refVal = ival;// ok:refVal refer to i

【c++基础】const、const指针、const引用

一.const常量 声明时必须同时初始化(和“引用”一样) 二.const指针 三.const引用 引用本身和引用的对象都是const对象,可以用字面值来赋给const引用(普通引用则不行) 1 const B=1024; 2 const refB=B; //const变量的声明和初始化 3 4 const int &r=42;//字面值给const赋值 5 int &r2=42;//错 [c++基础]const.const指针.const引用

const引用

#include <iostream> using namespace std; //const引用是指向const对象的引用 int main() { const int val = 1024; const int& refval = val; // int& ref2 = val; Error,val是常量 // refval=200 Error,refaval是个常量 int val2 = 1024; const int& ref3 = val2; //const

const引用与非const引用

void print1(int a) { cout<<a<<endl; } void print2(const int& a) { cout<<a<<endl; } void print3(int& a) { cout<<a<<endl; } int main() { int a = 10; int& b = a; const int& c = a; print1(a); print1(b); prin