精华内容
下载资源
问答
  • const形参表示:函数将不会修改函数调用者所传递的这个参数

    const形参表示:函数将不会修改函数调用者所传递的这个参数

    展开全文
  • 目录函数形参 const 引用居多的原因普通的函数形参引用,不带const的例子函数形参const引用的例子下面例子是是函数形参是对象类型,const 引用依然可以接受const 和 非const对象 函数形参 const 引用居多的原因 大...

    函数形参 const 引用居多的原因

    大部分c++函数形参如果是引用,都是const类型的引用,为什么呢?
    答案就是const类型的引用可以,接受const类型的参数,和非const类型的参数.
    下面代码距离说明

    普通的函数形参引用,不带const的例子

    下面代码函数传入const类型的参数直接报错了.

    int add2(int& a, int& b){ //非const引用只能接受 变量,不能接受const类型的参数
        return a + b;
    }
    int main(int argc, const char * argv[]) {
        int a = 3;
        const int b = 5;
        add2(a,a);//传入非const参数可以
        add2(a,b);//传入非const参数报错
    }
    

    函数形参是const引用的例子

    int add(const int & a, const int &b){
        return a + b;
    }
    int main(int argc, const char * argv[]) {
        int a = 3;
        const int b = 5;
        int c = 4;
        cout << add(a,b) <<endl;//const类型参数可以传入
        cout << add(a,c) <<endl;//非const类型参数可以传入
    }
    

    下面例子是是函数形参是对象类型,const 引用依然可以接受const 和 非const对象

    class Person{
    public:
        int age;
        Person(int a):age(a){}
    };
    int add3(const Person &a ,const Person &b){ //const引用可以接受 const和非const对象
        return a.age+ b.age;
    }
    
    int add4(Person &a , Person &b){
        return a.age+ b.age;
    }
    int main(int argc, const char * argv[]) {
        Person p1(3);
        Person p2(4);
        const Person p3(5);
        add3(p1,p2);
        add3(p2,p3);//对象类型的参数,const 引用也可以接受const类型对象,和非const类型对象
        add4(p1,p2);
        add4(p2,p3);//报错,因为add4 不是const引用,不能传入const类型的对象p3
    }
    
    展开全文
  • const形参和实参

    2021-05-22 01:39:30
    形参const时,必须要注意关于顶层const的讨论。如前所述,顶层const的作用于对象本身:const int ci=42; //不能改变ci,const是顶层的int i=ci; //正确:当拷贝ci时,忽略了它的顶层constint *const p=&i; ...

    当形参是const时,必须要注意关于顶层const的讨论。如前所述,顶层const的作用于对象本身:

    const int ci=42;  //不能改变ci,const是顶层的

    int i=ci;   //正确:当拷贝ci时,忽略了它的顶层const

    int *const p=&i;  //const是顶层的,不能给p赋值

    *p=0;    //正确:通过p改变对象的内容是允许的,现在i变成了0

    和其他初始化过程一样,当用实参初始化形参时会忽略掉顶层const。换句话说,形参的顶层const被忽略掉了。当形参有顶层const时,传给它的常量对象或者非常量对象都是可以的:

    void fcn(const int i){  /*fcn能够读取i,但是不能向i写值*/}

    调用fcn函数时,既可以传入const int也可以传入int。忽略掉形参的顶层const可以产生意想不到的结果:

    void fcn(const int i) {/*fcn能够读取i,但是不能向i写值*/}

    void fcn(int i)  {/*....*/}//错误:重复定义了fdn(int)

    在C++语言中,允许我们定义若干具有相同名字的函数,不过前提是不同函数的形参列表应该有明显的区别。因为顶层const被忽略了,所以在上面的代码中传入两个fcn函数的参数可以完全一样。因此第二个fcn是错误的,尽管形式上由差异,但实际上它的形参和第一个fcn的形参没什么不同。

    指针或引用形参与const

    形参的初始化方式和变量的初始化方式是一样的,所以回顾通用的初始化规则有助于理解下面的知识。我们可以使用非常量初始化一个底层的const对象,但是反过来不行;同时一个普通的引用必须用同类型的对象初始化。

    int i=42;

    const int *cp=&i;  //正确:但是cp不能改变i

    const int &r=i;   //正确:但是r不能改变i

    const int &r2=42;   //正确

    int  *p=cp;    //错误:p的类型和cp的类型不匹配

    int &r3=r;    //错误:r3的类型和r的类型不匹配

    int  &r4=42;  //错误:不能用字面值初始化一个非常量引用

    将同样的初始化规则应用到参数传递上可得如下形式:

    int i=0;

    const int ci=i;

    string::size_type ctr=0;

    void reset(int &i);

    reset(&i);  //调用形参类型是int *的reset函数

    reset(&ci);  //错误:不能用指向const int对象的指针初始化int *

    reset(i);   //调用参数类型是int&的reset函数

    reset(ci);  //错误:不能把普通引用绑定到const对象ci上

    reset(42);  //错误:不能把普通引用绑定到字面值上

    reset(ctr); //错误:类型不匹配,ctr是无符号类型

    //find_char的第一个形参是对常量的引用

    find_char("hello world",'o',ctr);//可以绑定到字面值常量上

    要想调用引用版本的reset,只能使用int类型的对象,而不能使用字面值、求值结果为int的表达式、需要转换的对象或者const int类型的对象。类似的,要想调用指针版本的reset只能使用int*。

    另一方面,我们能传递一个字符串字面值作为find_char的第一个实参,这是因为改函数的引用形参是常量引用,而C++允许我们用字面值初始化常量引用。

    尽量使用常量引用

    把函数不会改变的形参定义成(普通的)引用是一种比较常见的错误,这么做带来给函数的调用者一种误导,即函数可以修改它的实参的值。此外,使用引用而非常量引用也会极大地限制函数所能接受的实参类型。就像刚刚看到的,我们不能把const对象、字面值或者需要类型转换的对象传递给普通的引用形参。

    关于函数传参的其他问题&lpar;const形参实参&sol;可变形参&rpar;

    const 形参和实参 当形参是 const 变量时,实参是 const 或者不是 const 变量都可以. 实参初始化形参时会忽略掉顶层 const: void gel(const int a){ ...

    C语言之形参和实参

    一 形参与实参 1).定义 形参:形式参数. 就是定义函数的时候,写在函数名小括号后面的参数叫形参 实参:实际参数. 就是调用函数的时候,调用函数时写在函数名小括号后面的参数就叫实参 2).注意项 a ...

    const形参与非const形参

    在程序设计中我们会经常调用函数,调用函数就会涉及参数的问题,那么在形参列表中const形参与非const形参对传递过来的实参有什么要求呢? 先来看一个简单的例子: #include 

    c&plus;&plus;形参改变实参(对指针的理解

    这几天搞逻辑比较晕,居然把指针的概念都混淆了. eg:int *p;//当然不对指针初始化在有些编译器是通不过编译的,比如VS(尤其是选中了SDL) 指针p是一个对象,定义开始没有分配了内存空间,只是 ...

    C&num;形参,实参,值传递参数,引用传递参数,输出参数,参数数组的学习

    1)形参 形参顾名思义就是形式上的参数,不是实际的参数,它代替实际传入方法的值.在方法体代码中代表了值本身参与运算.形参定义于参数中,它不同于方法体内局部变量,因为是一个变量,在它的作用域内不允许存在 ...

    c&plus;&plus;形参和实参同名时,如何单步执行观察形参的变化。

    c++形参和实参同名时,如何单步执行观察形参的变化? 方法:当程序运行到函数中时,添加变量观察即可.

    关于Java中形参与实参的理解

    今天阅读了一个写的非常棒的博文,通过此博文再次复习了Java中参数传递的知识(即值传递与引用传递的区别).参考网站http://www.cnblogs.com/binyue/p/3862276.htm ...

    JavaScript中函数的形参和实参的实现原理剖析

    我们都知道JS里面参数的传递是可以不一样的,比如我们有一个函数:

    &lbrack;C&plus;&plus;程序设计&rsqb;有关形参与实参&comma;及返回值说明

    有关形参与实参的说明:(1) 在定义函数时指定的形参,在未出现函数调用 时,它们并不占内存中的存储单元,因此称它们是 形式参数或虚拟参数,表示它们并不是实际存在的数据,只有在发生函数调用时,函数max ...

    随机推荐

    【Linux学习】Vi 操作命令集合

    Vi 操作命令集合 进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n filename :打开文件,并将光标置于第n行首 vi + filename :打开文 ...

    sql server T-SQL 基础

    SQL语言按照用途可以分为如下3类: ①DDL(Data Definition Language)  数据定义语言: 定义修改和删除数据库.表.索引和视图等 ②DML(Data Manipulatio ...

    Deferred和Promise之间有什么区别呢?

    一个promise就是一个由异步函数返回的对象. deferred对象就是jQuery的回调函数解决方案. 总结 jQuery 的ajax 就是返回一个promise 对象,里面含有done(), f ...

    简洁之美 -约瑟夫环的python 解法

    问题描述: 约瑟夫环问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到k的那个人出列:他的下一个人又从1开始报数,数到k的那个人又出列:依此规律重复下 ...

    UGUI实现NGUI的UIEventListener功能

    在unity中处理UI事件时,习惯了使用NGUI的UIEventListener,虽然UGUI也有AddListener,但是一个组件只能对应一个函数,不能在一个函数中同时处理多个事件,显得有些麻烦 ...

    gitlab中批量删除本地以及远程tag的操作

    git 批量删除标签# 删除所有远程标签git show-ref --tag | awk '{print ":" $2}' | xargs git push origin # 删除 ...

    省钱版----查找 IoT 设备TTL线序&lowbar;&lowbar;未完待续

    作者:仙果 原文来自:省钱版—-查找 IoT 设备TTL线序 省钱版----查找 IoT 设备TTL线序__未完待续 缘由 在IoT固件调试分析的过程中,建议首先在IoT设备的板子上焊接调试线,这是能 ...

    前端Js框架 UI框架汇总 特性 适用范围 选择

    身为一个资深后端工程师,面对层出不穷的前端框架,总让人眼花缭乱,做一个综合解析贴,从全局着眼,让我们明白各种前端框架的应用范围,为如何选择前端框架,从不同的维度提供一些线索,做为一个长期优化贴,欢迎指 ...

    Java NIO Test Case

    package org.zwl.test.nio; import java.io.IOException; import java.net.InetSocketAddress; import java ...

    展开全文
  • 今天早上被小六打电话给吵醒了,呜呜,人家还没睡醒好不好。翻开书本,看到之前看到的一个东西,有两个问题:  -----------------------------------question--------------------...第一个问题是实参char *与形参con
     今天早上被小六打电话给吵醒了,呜呜,人家还没睡醒好不好。翻开书本,看到之前看到的一个东西,有两个问题:
            -----------------------------------question------------------------------------------------------------------------

    第一个问题是实参char *与形参const char* 为什么会相容
    第二个问题实参char **与形参const char **为什么会不相容。

            -----------------------------------question------------------------------------------------------------------------
    const是什么?
    const是一个C语言的关键字,它限定一个变量不允许被改变,产生静态作用。  
    const最有用之处就是用它来限定函数的形参,这样该函数将不会修改实参指针所指的数据,但其他的函数  却可能修改它。

    现在还有些晕乎。。。书本原文内容如下:
            ------------------------------------------------------------------------------分割线------------------------------------------------------------------------------- 
     
    一位销售工程师把下面这段代码作为测试例发给Sun的编译小组。
     
    1 foo(const char  **p)
    2
    3 main(int argc, char **argv)
    4 {
    5   foo(argv);
    6 }
     
    如果编译这段代码,编译器会发出一条警告信息:
    line 5: warning: argument is incompatible with prototype
    (第5行: 警告:参数与原型不匹配)。
     
    提交代码的工程师想知道为什么会产生这条警告信息,也想知道ANSIC标准的哪一部分讲述了这方面的内容。他认为,实参 char *s 与形参const char *p应该是相容的,标准库中所有的字符串处理函数都是这样的。那么,为什么实参char **argv 与形参const char **p实际上不相容呢?
     
    答案是肯定的,它们并不相容。要回答这个问题破费心机,如果研究一下获得这个答案的整个过程,会比仅仅知道结论更有意义。对这个问题的分析是由Sun的其中一位"语言律师"进行的,其过程如下:

     在ANSIC标准第6.3.2.2节中讲述约束条件的小节中有这么一句话:
      每个实参都应该具有自己的类型,这样它的值就可以赋值给与它所对应的形参类型的对象(该对象的类型不能含有限定符)。
     
     这就是说参数传递过程类似于赋值。
     
     所以,除非一个类型为char **的值可以赋值给一个const char **类型的对象,否则肯定会产生一条诊断信息。要想知道这个赋值是否合法,就请回顾标准中的有关简单赋值的部分,它位于6.3.16.1节,描述了下列约束条件:
     
     要使上述的赋值形式合法,必须满足下列条件之一:
      两个操作数都是指向有限定符或无限定符的相容类型的指针,左边指针所指向的类型必须具有右边指针所指向类型的全部限定符。
     

     正是这个条件,使得函数调用中实参char *能够与形参const char *匹配(在C标准库中,所有的字符串处理函数就是这样的)。它之所以合法,是因为在下面的代码中:
     
     char *cp;
     const char *ccp;
     ccp = cp;
     
     ~左操作数是一个指向const限定符的char的指针。
     ~右操作数是一个指向没有限定符的char的指针。
     ~char类型与char类型是相容的,左操作数所指向的类型具有右操作数所指向类型的限定符(无),再加上自身的限定符(const)。
     
     注意,反过来就不能进行赋值。如果不信,试试下面的代码:
     cp = cpp;
     
     标准第6.3.16.1节有没有说char **实参与const char **形参是相容的? 没有。
     标准第6.1.2.5节中讲述实例的部分声称:
      const float *类型并不是一个有限定符的类型---它的类型是"指向一个具有const限定符的float类型的指针",也就是说const限定符是修饰指针所指向的类型,而不是指针本身
     类似地,const char **也是一个没有限定符的指针类型,它的类型是"指向有const限定符的char类型的指针的指针"。
     
     由于char **和const char**都是没有限定符的指针类型,但它们所指向的类型不一样(前者指向char *,后者指向const char *),因此它们是不相容的。因此,类型为char**的实参与类型为const char**的形参是不相容的,违反了标准第6.3.2.2节所规定的约束条件,编译器必然会产生一条诊断信息。
    展开全文
  • 1,形参不确定类型时 可以使用decltype; 例如:返回s中出现的c的次数。 string::size_type findchar(const string &s ,char c,string::size_type &occurs){ auto ret =s.size(); occurs=0; for(...
  • 问题 #include <...string f1(const q &a) { return *a; } string f2(const string* &a) { return *a; } int main() { string s("hello"); cout << f1(&s) << en
  • C++函数——const形参和实参

    千次阅读 多人点赞 2018-07-09 21:09:33
        顶层const: 表示任意的对象是常量。      底层const: 与指针和引用等复合类型有关。     对指针而言, 顶层const表示指针本身是个常量, 而底层const表示指针所指的对象是一个常量。 int i =...
  • 传递非引用形参的数组类型的参数,其实如下 void func(int* a); void func(int a[]); void func(int a[10]); 是等价的,写成 void func(int* a);更加明确易读。 在void func(int a[10]); 里面数组大小10 会被...
  • const函数形参char *

    2020-03-18 11:56:14
    下面探讨下const修饰char *的函数形参时的三种情况。 第一种 const修饰的字符串指针 赋值给 临时变量字符串指针 #include<stdio.h> void testfunc(const char *teststr) { char *temp; te...
  • const的了解和应用

    2021-05-22 01:39:25
    当前位置:我的异常网» 编程»const的了解和应用const的了解和应用www.myexceptions.net网友分享于:2013-10-10浏览:3次const的理解和应用const的理解和应用一.理解const是一种语义上的约束,可以通知编译器和其他...
  • const形参结合 一.防止实参被修改 例: int add(int *a,int *b) { *a=20; return *a+*b; } int main() { int a=10; int b=20; cout(&a,&b); cout; cout; return 0; } add()函数只是为了...
  • 1.临时变量、引用参数和 const声明的形参 在参数传递过程中,如果实参与引用参数不匹配,C++将生成临时变量。当前,仅当参数为 const 引用时,C++才允许这么做,但以前不是这样。如果引用参数是 const...
  • c++ 函数形参关于const和引用

    千次阅读 2016-10-26 10:31:39
    1 非引用的 (const形参 或者非const形参),实参既可以是const 也可以是非const   a 如果函数使用非引用的非const形参,既可以传递const实参,也可以传递非const实参。因为初始化复制了初始化式的值,所以可以...
  • C++函数中const形参与非const形参

    万次阅读 多人点赞 2015-09-11 21:50:33
    在程序设计中我们会经常调用函数,调用函数就会涉及参数的问题,那么在形参列表中const形参与非const形参对传递过来的实参有什么要求呢? 先来看一个简单的例子: #include #include using namespace std; ...
  • /*在形参里加const有什么意义吗?是不是代表这个参数不能在函数里被修改?那为什么在下面的程序中,在print函数输出的还是修改后的对象呢?望大神们指点迷津!谢谢!*/ #include #include"string.h" using ...
  • const形参与非const形参

    千次阅读 多人点赞 2013-03-29 19:43:55
    在程序设计中我们会经常调用函数,调用函数就会涉及参数的问题,那么在形参列表中const形参与非const形参对传递过来的实参有什么要求呢? 先来看一个简单的例子: #include #include using namespace std; ...
  • 1. 代码 #include <...void fun(const char *p) { *p = 'a'; } void main() { char arr[] = "123"; fun(arr); } 2. 编译 D:\baoli\Desktop λ gcc test.c test.c: 在函数‘fun’中: te...
  • 函数形参const 引用

    2015-03-13 17:04:42
    这个函数里面的形参为什么这么修饰,一直没怎么搞明白,网上查了下,把弄清楚为什么要这么写 const sPlayerInfo& kPlayer const 表示常量不可修改,这应该好理解,表示传进去的参数kPlayer不能被修改。 但是为什么...
  • C++函数中const引用形参的一点理解

    千次阅读 2017-05-08 17:18:24
    const关键字的作用很多,这里只解释它作为函数形参的一个作用,主要有两个作用:(1)它告诉编译器,这个参数是一个常量,首先你在函数内部不能改变它;(2)其次,如果在函数内部需要多次引用这个值,CPU不必每次都...
  • 函数中参数的传递这里说的传递当然是指 实参是如何传递给形参的啦还挺复杂的~~~~~~~~⊙﹏⊙b汗,这里讲述了4种参数传递的情况和注意事项:1.非引用形参这是最普通,也是最简单的形参传递了。参数传递,即是使用实参...
  • C/C++ 函数const形参

    千次阅读 2014-04-30 19:04:56
    以下是《C++ Primer 中文版(Edition 4)》 7.2.1非引用形参 -- 2 const 形参 章节中的一段话: 在调用函数时,如果该函数使用 非引用的非const形参 ,则 既可以给该函数传递const实参也可传递非const实参 ...
  • C++形参const char * 与 char * 的区别

    千次阅读 2017-03-07 08:54:46
    在函数调用时,我们经常看见... 那么将形参设置为const的到底有什么好处呢?网络上经常的回答是:这样将把形参限定为常量,使得我们不能修改它。总感觉这种说法似乎是明白了,但再仔细的想下,总觉得少点什么。  
  • C++ Primer:形参const

    2020-03-16 14:27:08
    1. 形参本身是const 程序调用函数时会用实参来初始化形参,若形参本身是const,顶层const会被忽略。故不能通过判断形参本身是否是const来区分函数。 #include <iostream> using namespace std; class A { ...
  • C++成员函数形参列表后的const

    千次阅读 多人点赞 2018-05-29 22:13:18
    有时候我们在阅读一些源码时,发现有些类的成员函数的形参列表后面有个const,但是使用的时候感觉跟那些没有const的成员函数没有啥区别,如下, #include &amp;amp;amp;lt;iostream&amp;amp;amp;gt; using...
  • const对象只能调用const函数,自由对象优先调用非const函数。 函数后面加const 表示不能修改当前对象的数据。  2 mutable 关键字,让const函数 可以进行修改内部变量。 #include using namespace std...
  • 形参有没const的区别

    千次阅读 2012-10-24 15:44:55
    形参前面有没const,这里还是有点区别的。分几个情况看看: 知道实参如果按值传递,则形参接收的只是实参的一个拷贝,对这个拷贝的任何操作都不会去改变实参,那么此时它加不加const都是一样,所以在有这样一种情况...
  • 7.2.2 引用形参const形参(重要)

    千次阅读 2015-05-20 19:43:42
    复制实参并不是在所有的情况下都适合,不适宜复制实参的情况如下,在如下的情况中,有效的解决办法是将形参定义为引用或指针类型: 当需要在函数中修改实参的值时; 当需要以大型对象作为实参传递时
  • 形参中使用const时的几种意思 原文链接:点击打开链接 更原始的链接:http://www.possibility.com/Cpp/const.html const char*可以访问inputString所指向的数据,又可以避免修改原来的字符串。...
  • c语言中const的使用方法发布时间:2020-06-22 16:03:32来源:亿速云阅读:188作者:Leah这篇文章运用简单易懂的例子给大家介绍c语言中const的使用方法,代码非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能...
  • const与&修饰函数形参

    2019-11-06 16:39:59
    c++中const与&修饰函数形参的四种情况

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 81,363
精华内容 32,545
关键字:

形参const