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的更多相关文章

  1. const引用和函数占位参数遇上默认参数以及内联函数

    1.const引用: 但是加上const之后是可以的,const int &a=100;就不会报错了. 2.函数占位参数: 如果给最后的占位参数加上默认值: 3.内联函数 内联只是对编译器发起 ...

  2. C++ Const引用详解

    (1)       在实际的程序中,引用主要被用做函数的形式参数--通常将类对象传递给一个函数.引用必须初始化. 但是用对象的地址初始化引用是错误的,我们可以定义一个指针引用. 1 int ival ...

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

    一.const常量 声明时必须同时初始化(和“引用”一样) 二.const指针 三.const引用 引用本身和引用的对象都是const对象,可以用字面值来赋给const引用(普通引用则不行) ; co ...

  4. 传const引用代替传值

    1.为什么使用传const引用? a.被调方法中,形参不再进行copy构造,以及析构,提高效率. b.传值,会出现对象切割的问题. 2.有没有例外? 在编译器底层,引用是使用指针实现的.这就意味着,如 ...

  5. const引用

    在C++中可以声明const引用 const Type& name = var: const引用让变量拥有只读属性 const int &a = b const int &a ...

  6. c/c++ 拷贝控制 右值与const引用

    拷贝控制 右值与const引用 背景:当一个函数的返回值是自定义类型时,调用侧用什么类型接收?? 1,如果自定义类型的拷贝构造函数的参数用const修饰了:可以用下面的方式接收. Test t2 = ...

  7. C++引用和const引用、常量指针、指针常量

    1.引用.常量引用 引用主要被用做函数的形式参数--通常将类对象传递给一个函数. 引用在内部存放的是一个对象的地址,它是该对象的别名.引用不占用内存,因为取地址引用的值和被引用变量的地址相同.但是ob ...

  8. const引用返回值

    一.引用 引用是别名 必须在定义引用时进行初始化.初始化是指明引用指向哪个对象的唯一方法. const 引用是指向 const 对象的引用: ; const int &refVal = iva ...

  9. 非const引用参数传入不同类型编译不过的理解(拒绝将临时对象绑定为非const的引用的形参是有道理的)

    int f (int & I) { cout<<I<<std::endl; } void main() { long L; f(L); // 编译不过 f((int)L ...

随机推荐

  1. 腾讯企业邮箱报错 "smtp.exmail.qq.com"port 465, isSSL false

    一.报错 "smtp.exmail.qq.com" port 465, isSSL false 通过网上搜索查询一些资料,推测是邮箱的配置出问题了. 二.修改邮箱配置 // 创建属 ...

  2. Groovy内存机制详解

    groovy每执行一次脚本,都会生成一个脚本的class对象,并new一个InnerLoader去加载这个对象. 所有的脚本都是由GroovyClassLoader加载的,每次加载脚本都会生成一个新的 ...

  3. bnu 4060 奇偶性,异或运算

    Plants vs. Zombies Time Limit: 5000ms Memory Limit: 2048KB   64-bit integer IO format: %lld      Jav ...

  4. equals、==和hashCode

    equals和== ==可以用于基本类型和引用类型:当用于基本类型时,比较值是否相同:当用于引用类型时,比较的是所指向的对象的地址是否相同.如果有包装类型,则先将包装类型转换为基本类型再比较值是否相等 ...

  5. IDEA 2017.2.2 环境下使用JUnit

    JUnit:单元测试框架,测试对象为一个类中的方法. JUnit不是Javase的一部分,想要使用需要导入jar包,在IntelliJ IDEA 中自带JUnit插件. JUnit 版本有3.X 4. ...

  6. LeetCode SQL: Second Highest Salary

    , NULL, salary) as `salary` from ( ,) tmp Write a SQL query to get the second highest salary from th ...

  7. Asp.Net实现在线网站安装(上)

    在很多年前,笔者在使用z-blog搭建个人部落格的时候,最大的感受就是z-blog在线安装功能! 因为在那个时候,以几K每秒的速度上传一个几M或者十几M的压缩包到虚拟主机上,是一个很痛苦的事情.特别是 ...

  8. OI中的一些模板

    线性筛 #include"cstdio" #include"cstring" #include"iostream" #include&quo ...

  9. html开发那些不好的习惯,和问题。

    最近网上看了好多html开发中那些问题和不好的习惯,顺手总结一下. 一.上下间距 在开发中你会发现你明明设置的两个p标签上下间距为20px但你实际测量中会发现他会多4~8px,这是为什么呢!如果你是老 ...

  10. 转载:Windows下三分钟搭建Shadowoscks服务器端

    Windows下三分钟搭建Shadowoscks服务器端 之前在V2EX上有人问为啥没人做个在Windows上一键运行Shadowsocks服务器端的程序,我只想说……这是因为没人关注我的libQtS ...