精华内容
下载资源
问答
  • 函数的形参列表

    千次阅读 2020-09-07 12:12:29
    函数在定义的时候,可以定义“形参列表”,用于接收参数!形参列表就是定义一系列的参数,可以是变量或函数指针。形参变量用于接收函数调用的时候,传递过来的数据。 这里我们先讲解形参是变量的知识,后续再讲解...

    函数在定义的时候,可以定义“形参列表”,用于接收参数!形参列表就是定义一系列的参数,可以是变量或函数指针。形参变量用于接收函数调用的时候,传递过来的数据。

    这里我们先讲解形参是变量的知识,后续再讲解形参是函数指针的知识。

    根据函数的定义格式如下:

    返回数据类型 函数名(形参列表)

    {

    函数体

    }

    那么,形参列表是变量的时候,就是如同定义变量一样,如下:

    返回数据类型 函数名(数据类型名 变量名)

    如果要定义多个参数变量,定义格式如下:

    返回数据类型 函数名(数据类型名 变量名1, 数据类型名 变量名2, … 数据类型名 变量名N)

    可以看到,形参列表就是定义多个变量的列表,定义情况有:

    (1) 如果不定义形参列表,函数形参可以使用void关键字修饰;

    (2) 如果只定义1个变量,可以如同定义变量一样,末尾不需要用引号“;”结束;

    (3) 如果定义多个变量,在定义不同变量之间是有逗号“,”分隔开;

    注意:虽然可以在形参列表中定义多个参数,但是,在编写程序的时候,要考虑函数模块之间的“耦合性”和“扩展性”。不要传递太多的参数。如果项目需求改动,需要修改某个参数,就会导致函数接口的改动,函数接口的改动对程序的改动很大,这种操作应该极力避免。

    当学习到结构体之后,我们可以把多个参数封装到一个结构体中,函数的参数只需要传递一个结构体变量就OK了。那么,当有数据需要改动,只需要修改结构体的定义和数据,函数的接口不需要修改,那么,函数模块之间的耦合性就降低,提高程序函数模块之间的扩展性。这就是函数模块扩展性好的一个表现形式,也是定义函数时需要思考的注意点。

    举例说明形参列表的定义如下:

    void func1(int a); //表示func1函数接收一个int类型的参数

    void func2(int a, int b, int c)//表示func2函数接收3个int类型的参数

    那么,调用函数的时候,有:

    (1) func1(8); 此时,调用func1函数,在参数中填入8这个数值,那么,就把8这个数值传递给形参变量a。等价于:

    int a = 8;

    所以,就是把8整数值赋给形参变量a;

    (2) func2(6, 7, 8); 此时,调用func2函数,在参数列表中填入6, 7, 8这个数值,那么,就会按顺序把数值6赋给形参变量a,把数值7赋给形参变量b,把数值8赋给形参变量c。等价于:

    int a = 6;

    int b = 7;

    int c = 8;

    所以,就是按顺序,把调用func2函数时的参数,设置到形参变量。

    那么,下面编写程序测试,看看怎么样使用定义函数的“形参列表”,测试代码如下:

     

    程序运行结果如下:

     

    可以看到,调用func1(10); 的时候,把实参10这个数值,传递给func1()函数的形参变量a;所以,在func1()函数中输出形参变量a的值,就是10这个数值。

    同理,func2(6, 7, 8); 函数的调用,是把实参6, 7, 8分别赋给func2()函数的形参变量 a, b, c。等效于:

    int a = 6;

    int b = 7;

    int c = 8;

    所以,func2()函数的形成变量a, b, c分别得到6, 7, 8这些数值。

    韦凯峰 Linux C/C++ 程序设计教程,Linux 系统编程,Openwrt 系统开发,微信:13926572996,QQ:1523520001,博客:www.mylinux.vip

    展开全文
  • Python 形参列表中带默认值的形参应放在不带默认值的形参的前面,否则会提示: SyntaxError: non-default argument follows default argument 错误代码: def p(n=None, n2): print(n, n2) p(1) ...

    Python 形参列表中带默认值的形参应放在不带默认值的形参的前面,否则会提示:
    SyntaxError: non-default argument follows default argument
    错误代码:

    def p(n=None, n2): print(n, n2)
    p(1)
    

    正确代码:

    def p(n, n2=None): print(n, n2)
    p(1)
    
    展开全文
  • 根据C语言的语法,一个函数可以没有形式参数,也可以有一个或多个参数,当然,也可以是类似于 scanf() 和 printf() 一样的带有变长形参列表的函数。显然,采用变长形参列表的函数能够提高程序的灵活性。针对目前 C 语言...
  • C++成员函数形参列表后的const

    千次阅读 多人点赞 2018-05-29 22:13:18
    有时候我们在阅读一些源码时,发现有些类的成员函数的形参列表后面有个const,但是使用的时候感觉跟那些没有const的成员函数没有啥区别,如下, #include <iostream> using...

    一 问题

    有时候我们在阅读一些源码时,发现有些类的成员函数的形参列表后面有个const,但是使用的时候感觉跟那些没有const的成员函数没有啥区别,举个简单栗子如下,

    #include <iostream>
    
    using namespace std;
    
    
    class TestClass
    {
    public:
        TestClass() : val(100) {}
        virtual ~TestClass() {}
    
    
        int getVal_v1()
        {
            return val;
        }
    
        int getVal_v2() const
        {
            return val;
        }
    
    private:
        int val;
    };
    
    
    int main()
    {
        TestClass tc;
    
        int a = tc.getVal_v1();
        int b = tc.getVal_v2();
    
    	cout << "getVal_v1: " << a << endl;
    	cout << "getVal_v2: " << b << endl;
    
        return 0;
    }
    
    

    编译运行都ok,输出如下,
    这里写图片描述
    有点懵,那这个const有什么作用呢?

    要回答这个问题,需要先回顾一下类的this指针。


    二 回顾this指针

    继续分析上一节的程序,当我们实例化类TestClass生成了对象tc,然后调用成员函数getVal_v1(),就可以拿到tc的private变量val,看上去一气呵成,但是这里需要思考一个问题:getVal_v1()是怎么拿到val的呢?

    这就是靠this指针来完成的,成员函数通过this这个额外的隐式参数来访问调用它的对象。当我们调用成员函数时,会用对象的地址来初始化this指针(对象就是调用成员函数的对象)。这样我们在成员函数里就可以拿到对象的私有变量了。
    getVal_v1()函数也可以写成如下形式,(一般为了方便会省去this)

    int getVal_v1()
    {
        return this->val;
    }
    

    this形参是隐式定义的,不会显式地出现在成员函数形参列表里,但实际是存在的,所以任何自定义为this的参数或变量都是非法的。
    因为this指针总是指向这个对象,所以this是一个常量指针,不允许修改this的值。this指针的默认初始化过程等价如下,
    TestClass *const this = &tc;

    ps:常量指针和指针常量是不同意思,常量指针是说指针的值是const的,指针常量是说指针指向的变量的值是const的,还有常指针常量,看字面就知道是把常量指针和指针常量合在一起,不但指针本身是const的,而且指针指向的变量也是const的。OMG!!!


    三 成员函数后的const

    下面就把目光转向本文开始讨论的问题:成员函数形参列表后的const有什么作用?

    成员函数形参列表后带const,这样的成员函数叫做类的const成员函数,也叫常量成员函数。这个const作用是用来修改隐式this指针的类型,把它变成常指针常量(请阅读上一节的ps部分,如果还看不懂,就请查阅《C++ primer 5th》2.4.2节)。

    为何要转变?这里以上一节的代码为例,默认情况下,this指针是常量指针,但是如果tc是个常量对象,那么this的默认初始化就是非法的,C++规定只能使用指向常量的指针来存放常量对象的地址。这里修改下第二节的代码,如下,

    #include <iostream>
    
    using namespace std;
    
    
    class TestClass
    {
    public:
        TestClass() : val(100) {}
        virtual ~TestClass() {}
    
    
        int getVal_v1()
        {
            return val;
        }
    
        int getVal_v2() const
        {
            return val;
        }
    
    private:
        int val;
    };
    
    
    int main()
    {
        const TestClass tc;
    
        int a = tc.getVal_v1();
        int b = tc.getVal_v2();
    
    	cout << "getVal_v1: " << a << endl;
    	cout << "getVal_v2: " << b << endl;
    
        return 0;
    }
    
    

    这里把tc声明为常量对象,此时再编译就出错了。
    这里有2个解决办法:

    1. 在成员函数getVal_v1()的形参列表后加上const,编译就ok了,也可以正常运行;
    2. 不加const,然后在main函数里注释掉getVal_v1()的相关语句,程序也可以正常编译运行,如下,(可以看出常量对象只能调用常量成员函数)
    int main()
    {
        const TestClass tc;
    
        // int a = tc.getVal_v1();
        int b = tc.getVal_v2();
    
    	// cout << "getVal_v1: " << a << endl;
    	cout << "getVal_v2: " << b << endl;
    
        return 0;
    }
    

    讲到这里,就弄明白这个const的作用了,就是把this指针由默认的常量指针变成常指针常量。有了const后,this指针的初始化过程就等价如下,
    const TestClass *const this = &tc;
    因为此时this是指向常量的,所以常量成员函数不能改变调用它的对象的内容,也就是不能修改对象的私有变量值。

    另外,非常量对象可以调用常量成员函数,但也是无法修改对象的内容的。


    四 结语

    经过上述三节,就搞明白成员函数形参列表后const的作用了,简单概述下,就是把this指针由默认的常量指针变成常指针常量,然后常量对象就可以调用这些常量成员函数了。

    这里再贴一个《C++ primer 5th》中关于常量成员函数的note:
    常量对象,以及常量对象的引用或指针都只能调用常量成员函数。

    本文主要参考《C++ primer 5th》关于常量成员函数的讲述,也算是总结一下自己的理解。

    如果有写的不对的地方,希望能留言指正,谢谢阅读。

    展开全文
  • 默认实参不在形参列表的结尾 C2548 缺少参数 X 的默认参数 原因是在C++的形参列表中,初始化的参数必须排列在不初始化的参数后面,也就是说初始化的参数后面的参数,也必须初始化。 修改如下: 正确解决! ...

    出现如上图的错误:

    默认实参不在形参列表的结尾

    C2548  缺少参数 X 的默认参数

    原因是在C++的形参列表中,初始化的参数必须排列在不初始化的参数后面,也就是说初始化的参数后面的参数,也必须初始化。

    修改如下:

    正确解决!

    (其实只是非常基础的一个问题,平时的编码习惯还是要保持规范!)

    展开全文
  • pythonI形参是空列表

    2019-10-04 21:40:14
    方法形参里有空列表可能会导致哪些问题?N年前楼主第一次被问到这个问题直接懵逼,因为确实没有关注过这个东西。查过资料后才知道这里面确实有坑。 talk is cheap ,我们通过一个例子一看便知。 def emptyList(num, ...
  • ---形参列表和格式化输出是如何实现的? (作者:LL  出处:http://blog.csdn.net/tcpipstack , 欢迎转载,也请保留这段声明。谢谢!) 一、引言 在上一篇 [Linux内核小白]深入剖析printf函数(上):如何不借助...
  • 看到(C++ Primer)类的成员函数这里,突然对成员函数形参列表后面的const感到迷惑。 因为书中开始说是修饰隐含形参this的,然后又说是声明该函数是只读的。 大为不解! 翻资料、找人讨论。。。 最终恍然大悟...
  • 形参中可变参数列表

    2020-04-01 11:55:12
    形参中可变参数列表
  • 我之前在李春葆那本数据结构上有个发现他的形参列表都是都是指针变量的引用*&,如果把引用去了就不能修改L了。这两个地方有什么区别吗?好迷啊 typedef struct LNode { ElemType data; struct LNode* ...
  • JAVA中通过反射机制获取方法的修饰符,返回值类型,方法名,形参列表 与Field中没太大区别: 获取修饰符列表 Modifier.toString(method.getModifiers()) 获取方法返回值类型 method.getReturnType()....
  • 关于C语言中的形参列表空着与加void的区别 来一段代码大家看看,不,两段吧! int func() { printf(“hello world\n”); } int func(void) { printf(“hello world\n”);} 请问这两段代码一不一样呀? 不一样....
  • 形参

    2017-11-06 21:47:56
    来源:牛客网   A:形式参数可被视为local variable。形参和局部变量一样都不能离开方法。都只有在方法内才会发生作用,也只有在方法中使用,不会在方法外可见。 B: 对于形式参数只能用final...
  • 可变类型形参列表(*variant-type-parameter-lists) 可变类型形参列表(variant-type-parameter-lists )只能在接口和委托类型上出现。它与普通的type-parameter-lists的差异在于,它的每个类型形参前面可以加上变化性...
  • 什么是函数:程序中专门保存一段可重用的代码片段的程序结构,再起一个名字。...什么是形参变量:专门接收函数执行时必需的数据的变量 为什么要使用形参变量:有些函数执行时,必须传入必要的数据,才能正常的执行。
  • 在我的印象中,java的接口是不可以实例化的,也就是说没有构造器,没有属性,只有一堆定义好形参和返回值的方法名。不能在程序中用new去实例化一个对象。所以理所应当的在脑海中深化了一种思维,就是接口不可以当做...
  • 原文地址:... 在VC 6.0 环境中调试程序出现错误 error C2440: 'initializing' : cannot convert from '' to 'void (__cdecl *)(int,int,...)'  None of the fu
  • python中列表作为形参传输给函数 代码如上 可见列表作为形参进行参数传递的时候,原列表的值是改变的。
  • #include<iostream> #include<string> using namespace std; class Parent { public: Parent(string name, char sex, int age);//构造函数 void printParent(); protected: ... in...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 102,578
精华内容 41,031
关键字:

形参列表是什么