在程序设计中我们会经常调用函数,调用函数就会涉及参数的问题,那么在形参列表中const形参与非const形参对传递过来的实参有什么要求呢?

先来看一个简单的例子:

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. void print_str(const string s)
  5. {
  6. cout<<s<<endl;
  7. }
  8. int main()
  9. {
  10. print_str("hello world");
  11. return 0;
  12. }

毫无疑问,const实参传递给const形参,正确调用函数,如果你将第4行代码中的const去掉,也能得到正确的结果。那么在去掉const的基础上将形参变为引用形参,会出现什么样的结果呢?看下面的代码:

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. void print_str( string & s)
  5. {
  6. cout<<s<<endl;
  7. }
  8. int main()
  9. {
  10. print_str("hello world");
  11. return 0;
  12. }

发现编译不通过,如果在第4行的string前加上一个const,就会通过编译。进一步研究我们会发现指针形参与引用形参会出现类似的情况。

普通形参加不加const限定符对实参没有影响,引用形参和指针形参前面没有const限定符时,实参必须是非const的,而前面有const限定符时对实参也没有什么影响。

为什么会出现这种情况?

原因在于实参的传递方式不同,函数中的形参是普通形参的时,函数只是操纵的实参的副本,而无法去修改实参,实参会想,你形参反正改变不了我的值,那么你有没有const还有什么意义吗?引用形参和指针形参就下不同了,函数是对实参直接操纵,没有const的形参时实参的值是可以改变的,这种情况下怎能用函数来操纵const实参呢。

我一直这样记忆:“对于变量的约束,允许加强,当绝对不能削弱.....”
例如:实参是const,那么形参如果是非const意味着可以在函数体中改变形参的值,使约束削弱了所以不行。对于使用&,自然也是这个道理。同样的,指针里面的const也是这个样子的,如果让非const指针指向了const对象的地址,那么必然是无法通过编译的,因为如果这样做了,意味着可以通过这个指针改变本该是const的值了,显然是使约束削弱了

const形参与非const形参的更多相关文章

  1. const引用与非const引用

    void print1(int a) { cout<<a<<endl; } void print2(const int& a) { cout<<a<& ...

  2. 函数参数,const 引用 和 非 const引用是不同的函数。

    举个例子, void f(const int &x) 和 void f(int &x) 是不同的函数. 函数的返回值不能作为区分

  3. C++中const对象和非const对象调用成员函数问题

    一.类MyClass 二.主函数调用 三.结果

  4. const和非const函数重载

    成员函数后面加const,表示在该函数中不能对类的数据成员进行改变,比如下面的代码: #include <stdio.h> class A { private: mutable int a ...

  5. 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用

    [源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象,  const 指针和指向 const 对象的指针, con ...

  6. const成员函数和const对象

    从成员函数说起 在说const成员函数之前,先说一下普通成员函数,其实每个成员函数都有一个隐形的入参:T *const this. int getValue(T *const this) { retu ...

  7. 临时变量不能作为非const类型引用形参的实参

    摘要:     非const 引用形参只能与完全同类型的非const对象关联.      具体含义为:(1)不能用const类型的对象传递给非const引用形参:                  ( ...

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

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

  9. C++-const_cast只能用于指针和引用,对象的const到非const可以用static_cast

    Static_cast可以对对象也可以对指针也可以对引用,但是const_cast只可以对指针和引用使用,后者不可以对对象用,如果你要把一个const值转化为非const值只能用隐式执行或通过使用st ...

随机推荐

  1. 隐藏或删除指定的html元素

    <div  id="Contain"> <div>好好学习<div> <div>天天向上<div> <div> ...

  2. JavaScript字符和数组一些基本算法题

    1.翻转字符串 例子(要求:先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串) function reverseString(str) { str=str.sp ...

  3. Fedora24 升级到25

    1 安装dnf-plugin-system-upgrade dnf install dnf-plugin-system-upgrade 2 更新软件包 dnf system-upgrade downl ...

  4. 64位Java开发平台的选择,如何区分JDK,Tomcat,eclipse的32位与64版本

    当你想下载Linux.JDK.Tomcat.eclipse时,你是下载32位版本还是64位版本?64位版本有两种,应该选哪一个? 当你看到这些内容:x86.x64.x86-32.x86-64.ia64 ...

  5. UVA11549 计算机谜题(Floyd判圈算法)

    #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #inclu ...

  6. laravel 安装 Laravel 扩展包

    问题说明 我们经常要往现有的项目中添加扩展包,有时候因为文档的错误引导,如下图来自这个文档 的: composer update 这个命令在我们现在的逻辑中,可能会对项目造成巨大伤害. 因为 comp ...

  7. swift3 控件创建

    //MARK:- UIScrollView let scrollView = UIScrollView() scrollView.delegate = target scrollView.backgr ...

  8. SAP HANA创建层次结构的属性视图(Hierarchy Attribute View)

    在产品表中,数据是具有一定层次结构的 1. 在Content相应的package下面右键点击Attribute View,新建Attribute View 填写相关信息,注意:我们所建的依然是标准视图 ...

  9. wf跟webx开源我见

    今天看WF的时候突然想到了WEBX!一个是58同城的优秀框架,一个是阿里巴巴集团的开源结晶,但是差距在哪里!随便在网上一搜webx,看到推广最上方的是一个网站,关于webx的官方认证网站,但是wf也开 ...

  10. Tiny64140之初始化时钟

    简介: Tiny6410 时钟逻辑为整个芯片提供了3种时钟分别为FCLK.HCLK.PCLK有三个PLL 分别为APLL.MPLL.EPLL.   APLL 专用于CPU   MPLL 供AHB(存储 ...