精华内容
下载资源
问答
  • 13-C++ 基础-用户定义函数

    千次阅读 2018-06-01 09:07:41
    2.4.3用户定义函数标准C库提供了140多个预定义的函数,如果其中的函数能...每个C++程序都必须有一个main()函数用户必须对它进行定义。假设需要添加另一个用户定义函数。和库函数一样,也可以通过函数名来...

    2.4.3用户定义的函数

    标准C库提供了140多个预定义的函数,如果其中的函数能满足需求,则应使用它们。但用户经常需要编写自己的函数,尤其是在设计类的时候。无论如何,设计自己的函数很有意思,下面来介绍这一过程。前面已经使用过好几个用户定义的函数,它们都叫main()。每个C++程序都必须有一个main()函数,用户必须对它进行定义。假设需要添加另一个人用户定义的函数。和库函数一样,也可以通过函数名来调用用户定义的函数。对于库函数,在使用之前必须提供其原型,通常把原型放到main()定义之前。但现在您必须提供新函数的源代码。最简单的方法是,将代码放在main()的后面。程序2.5演示了这些元素:

    程序2.5    ourfunc.cpp

    //ourfunc.cpp--defining your own function
    
    #include<iostream>
    void simon(int);
    
    int main()
    {
    	using namespace std;
    	simon(3);     
    	cout<<"Pick an integer:";
    	int count;
    	cin>>count;
    	simon(count);
    	cout<<"Done!"<<endl;
    	return 0;
    }
    
    void simon(int n)
    {
    	using namespace std;
    	cout<<"Simon says touch your toes "<<n<<" times."<<endl;
    }

    main()函数两次调用simom()函数,一次的参数是3,另一次的参数为变量count。在这两次调用之前,用户输入一个整数,用来设置count的值。这个例子没有在cout提示信息中使用换行符。这样将导致用户输入和提示出现在同一行中。下面是运行情况:

    1、函数格式

    在程序2.5中,simon()函数的定义与main()的定义采用的格式相同。首先,有一个函数头,然和是花括号中的函数体。可以把函数的格式统一为如下的情形:

    type functionname(argumentlist)

    {

    statements

    }

    注意,定义simon()的源代码位于main()的后面,和C一样(但不同于Pascal),C++不允许将函数定义嵌套在另一个函数定义中。每个函数定义都是独立的,所有函数的创建都是平等的。

    2、函数头

    在程序2.5中,simon()函数的函数头如下:

    void simon(int n)

    开头的void表面simon()没有返回值,因此调用simon()不会生成可在main()中将其赋给变量的数字。因此,第一个函数调用方式如下:

    simon(3);

    由于simon()没有返回值,因此不能这样使用它:

    simple=simon(3);

    括号中的int n表面,使用simon时,应提供一个int 参数,n是一个新的变量,函数调用时传递的值将被赋给它。因此,下面的函数调用将3赋给simon()函数头中定义的变量n:

    simon(3);

    当函数体中的cout语句使用n时,将使用函数调用时传递的值。这就是为什么simon(3)在输出中显示3的原因所在。在示例运行中,函数调用simon(count)导致函数显示512,因为这正是赋给count的值。简言而之,simon()的函数头表面,该函数接受一个int 参数,不返回任何值。

    下面复习一下main()的函数头:

    int main()

    开头的int表明,main()返回一个整数值,空括号(可以包含void)表明,main()没有参数,对于有返回值的函数,应使用关键字return来提供返回值,并结束函数,这就是为什么要在main()结尾使用下属语句的原因:

    return 0;

    这在逻辑上是以指的:main()返回一个int,而程序员要求它返回整数0。但可能会产生疑问,将这个值返回到哪里了呢?毕竟,程序中没有哪个地方可以看出对main()的调用:

    squeeze=main();

    答案是,可以将计算机操作系统(如UNIXWindows)看作调用程序。因此,main()的返回值并不是返回给程序的其他部分,而是返回给操作系统。很多操作系统都可以使用程序的返回值。例如 ,UNIX外壳脚本和Windows命令行批处理文件都被设计成运行程序,并测试它们的返回值(通常叫做退出值)。通常的约定是,退出值为0则意味着程序运行成行,为非零则意味着存在问题。因此,如果C++程序无法打开文件,可以将它设计为返回一个非零值。然后,便可以设计一个外壳脚本或批处理文件来运行该程序,如果该程序发出指示失败的消息,则采取其他措施。

    关键字

    关键字是计算机语言中的词汇。本章使用了4C++关键字:intvoidreturndouble。由于这些关键字都是C++专用的,因此不能用作他用。也就是说,不能将return用作变量名,也不能把double用作函数名。不过可以把它们用作名称的一部分,如painter(其中包含int)return_aces。另外,main不是关键字,由于它不是语言的组成部分。然而,它是一个必不可少的函数的名称。可以吧main用作变量名(在一些很神秘的以至于无法在这里介绍的情况中,将main用作变量名会引发错误,由于它在任何情况下都是容易混淆的,因此最好不要这样做)。同样,其他函数名和对象名都不能是关键字。然而,在程序中将同一个名称(比如cout)用作对象名和变量名会吧编译器搞糊涂。也就是说,在不使用cout对象进行输出的函数中,可以将cout用作变量名,但不能在同一个函数中同时将cout用作对象名和变量名。

    2.4.4用户定义的有返回值的函数

    我们在深一步,编写一个使用返回语句的函数。main()函数已经揭示了有返回值的函数的格式:在函数头中指出返回类型,在函数体结尾处使用return。可以用这种形式为在英国观光的人解决重量问题。在英国,很多浴室都已英石为单位,不像美国以磅或公斤为单位。一英石等于14磅,程序2.6使用一个函数来完成这样的转换。

    程序2.6    convert.cpp

    //convert.cpp--converts stone to pounds
    #include<iostream>
    int stonetolb(int);
    int main()
    {
    	using namespace std;
    	int stone;    
    	cout<<"Enter the weight in stone:";
    	cin>>stone;
    	int pounds =stonetolb(stone);
    	cout<<stone<<" stone =";
    	cout<<pounds<<" pounds."<<endl;
    	return 0;
    }
    
    int stonetolb(int sts)
    {
    	return 14*sts;
    }

    下面是该程序的运行情况:


    main()中,程序使用cin来给整型变量stone提供一个值。这个值被作为参数传递给stonetolb()函数,在该函数中,这个值被赋给变量sts。然后,stonetolb()用关键字return14*sts返回给main()。这表明return 后面并给一定要跟一个简单的数字。这里通过使用较为复杂的表达式,避免创建一个新变量,将结果赋给该变量,然后将它返回。程序将计算表达式的值(这里为210),并将其返回。如果返回表达式的值很麻烦,可以采用更复杂的方式:

    int stonetolb(int sts)

    {

    int pounds=14*sts;

    return pounds;

    }

    这两个版本的返回的结果相同,但第二个版本更容易理解和修改,因为它将计算和返回分开了。通常,在可以使用一个简单变量的地方,都可以使用一个返回值类型与该常量相同的函数。例如,stonetolb()返回一个int值,这意味着可以以下面的方式使用该函数:

    int aunt = stonetolb(20);

    int aunts =aunt + stonetolb(10);

    cout<<Ferdie weighs stonetolb(16)<< pounds.<<endl;

    在上述任何一种情况下,程序都将计算返回值,然后再语句中使用这个值。

    这些例子表明,函数原型描述了函数的接口,即函数如何与程序的其他部分交互。参数列表指出了何种信息将被传递个函数,函数类型了返回值的类型。程序员有时将函数比作一个有出入它们的信息所指定的黑盒子,具有黑盒效应。

    函数stonetobl()短小、简单,但包含了全部的函数特性,麻雀虽小五脏俱全:

    l 有函数头和函数体;;

    l 接受一个参数

    l 返回一个值;

    l 需要一个原型

    可以把stonetolb()看作函数设计的标准格式,第七章和第八章将更详细地介绍函数。而本章的内容让读者能够很好地了解函数的工作方式及其愈合与C++匹配。

    
     



    展开全文
  • 任何能够使用它们的地方,都可以定义一个单独的普通函数来进行替换。我将它们用在需要封装特殊的、非重用代码上,避免令我的代码充斥着大量单行函数。 lambda匿名函数的格式:冒号前是参数,可以有多个,用逗号隔开...

    匿名函数lambda:是指一类无需定义标识符(函数名)的函数或子程序
    lambda 函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值。

    要点:

    1. lambda 函数不能包含命令
    2. 包含的表达式不能超过一个

    说明:一定非要使用lambda函数;任何能够使用它们的地方,都可以定义一个单独的普通函数来进行替换。我将它们用在需要封装特殊的、非重用代码上,避免令我的代码充斥着大量单行函数。

    lambda匿名函数的格式:冒号前是参数,可以有多个,用逗号隔开,冒号右边的为表达式。其实lambda返回值是一个函数的地址,也就是函数对象。

    ### lambda函数也叫匿名函数,即,函数没有具体的名称。先来看一个最简单例子:
     def f(x):
       return x**2
     print f(4)
    
    # Python中使用lambda的话
     g = lambda x : x**2
     print g(4)

    https://www.cnblogs.com/kaishirenshi/p/8611358.html

    展开全文
  • 构造方法的定义: 构造方法是一种特殊的方法,它是一个与类同名且没有返回值类型的方法。...在java中普通函数可以和构造函数同名,但是必须带有返回值。2. 构造函数的功能主要用于在类的对象创建时定义初始化的状态...

    构造方法的定义:

      构造方法是一种特殊的方法,它是一个与类同名且没有返回值类型的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化。当类实例化一个对象时会自动调用构造方法。构造方法和其他方法一样也可以重载。

    构造方法的特点:

    1. 构造函数的命名必须和类名完全相同;在java中普通函数可以和构造函数同名,但是必须带有返回值。
    2. 构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。这就保证了它不仅什么也不用自动返回,而且根本不能有任何选择。
    3. 构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用;而一般的方法是在程序执行到它的时候被调用的。

    4. 当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可省略,不过Java编译器会提供一个默认的构造函数.此默认构造函数是不带参数的。而一般的方法不存在这一特点。

    class HelloWorld//(Box)
    {
    static int length;
    static int width;
    static int heigth;
    
    void setBox(int l,int w,int h)
    {
    int l1;
    int w1;
    int h1;	
    }
    int volume(int a,int B,int c)
    {
    	int s;
    	s=a*B*c;
    	return s;	
    }
    
    public static void main(String args[]){
    	int S;
    	HelloWorld b=new HelloWorld();
    	b.length=1;
    	b.width=2;
    	b.heigth=4;
    	S= b.volume(length,width,heigth);
    	System.out.println(S);
    }
    }
    Class BankAccount{
    Int acciuntnumber;
    Int leftmoney;
    public double getleftmoney () {     //查询余额
    	System.out.println(leftmoney);
    }
    
    public void savemoney(double money) {   //存款
    leftmoney+=money;
    }
    
    public void getmoney (double money){  //取款
    leftmonney-=money;
    }
    
    public BankAccount (int number, double money){  //默认的构造方法,用来初始化变量 
    acciuntnumber =123456; 
    letfmoney=500;
    }
    
    public static void main(String args[]) {  
    	BlankAccount ba=new BlankAccount(123456,500);
    ba.savemoney(1000); 
      System.out.println("存入1000元后,您的余额为:"+ba.getleftmoney());
      ba.getmoney(2000);
      System.out.println("取款2000元后,您的余额为:"+ba.getleftmoney());
    }
    }

    这两段代码很好的解释了构造方法的特点。


    展开全文
  • C++定义函数

    千次阅读 2019-07-16 15:26:07
    一、函数传递参数的方式 术语: 主调函数:调用其他函数函数,大部分时候为main函数 ...此类函数传送机制是将主调函数中的变元生成一个副本作为被调函数的形式参数,即将变元重新拷贝一份然后再传...

    一、函数传递参数的方式

    术语:
    主调函数:调用其他函数的函数,大部分时候为main函数
    被调函数:被其他函数如main函数调用的函数
    变元:在主调函数中传递给被调函数的变量或常量,如函数调用语句function(a,b)中变元为a和b
    形式参数:主调函数传递给被调函数的变量或常量

    1.按值传送机制

    此类函数传送机制是将主调函数中的变元生成一个副本作为被调函数的形式参数,即将变元重新拷贝一份然后再传递给被调函数。显然,在这种传递机制下,在被调函数中对形式参数的操作并不会影响主调函数内的变量。

    1.1传递普通变量

    这里的普通变量是指基本类型变量,如 Int , double 等,当这些变量作为变元传递给被调函数后,被调函数可对这些变量进行操作,但不会影响主调函数内的变元。

    1.2传递指针变量(指针还没整明白的同学戳这里(指针专题)

    首先应明确,指针变量的值是一个对应类型变量的地址,所以传递指针仍是按值传递。当我们将指针作为变元传递给被调函数时,程序依然会生成一个指针变量副本并作为形式参数传递给被调函数,因此形式参数指针存储的地址与原指针一模一样,即两个指针指向内存中同一块区域。因此,当我们在被调函数中对形式参数指针进行解引用赋值等操作时,对应内存区域上的值也会被改变。

    1.3传递数组

    当传递整个数组时,我们一般会选择将数组名传递给被调函数以节省时间开销。数组名本身是一个常量指针,指向内存中一块连续的存储数组元素的空间。当数组名作为变元时,数组名被复制后传递给被调函数,此时被调函数中的指针也指向同一块连续的内存空间,因此,我们也可以通过形式参数指针对这块内存进行操作。

    1.4传递const 指针参数

    通过1.2和1.3我们发现,每次传递指针后,被调函数都能直接通过形式参数指针来对原指针指向的内存空间进行修改,而有时我们并不希望被调函数修改它们。所以,当我们只需要访问元素而并不需要修改它们时,我们可以在形式参数指针前加上一个 const 关键词,如:

    void function(const int* p) {
    	*p = 3;//无法编译,因为此时p是常量,无法作为表达式左值
    	std::cout << *p;//可以访问
    }
    int main()
    {
    	int a{ 10 };
    	int *pa{ &a };
    	function(pa);
    }
    

    值得注意的一点是,非const变元可以传递给const形式参数和非const形式参数,但const变元只能传递给const形式参数。

    2.按引用传送机制

    什么是引用

    引用是一个变量的别名,也可以说,引用等价于原变量。一个引用必须满足以下两个条件:1.引用不可为空,一定要初始化。2.一旦初始化后,引用不可改变其指向。要使用左值引用类型,只需在类型名后面加上&,如:

    	int variable{ 3 };
    	int &cite = variable;
    	cite++;
    	std::cout << variable;//结果为4
    

    此时 cite 是 variable 的引用,对 cite 的操作完全等价于对 variable 的操作。

    按引用传递参数

    当被调函数的形式参数为引用时,同样的,它就是主调函数中变元的别名。此时,在传递过程中,程序不会生成变元副本,而是直接将变元本身传递过去。因此在被调函数中对引用参数的操作会直接影响主调函数中的变元。主调函数中变元地址与引用参数地址是相同的。

    void function(int &cite) {
    	cite++;
    	std::cout << &cite << std::endl;//引用参数cite的地址
    }
    int main()//从main函数开始阅读程序是一个良好的习惯
    {
    	int variable{ 3 };
    	function(variable);
    	std::cout << variable << std::endl;//结果为4,其值已经在function中加1
    	std::cout << &variable << std::endl;//主调函数中变元地址
    }
    

    在上面代码中,两个输出的地址结果是一样的,这也进一步表明了,引用只是一个变量的别名,它等价于原变量。
    那么,为什么我们要按引用给函数传递参数呢?
    一个明显的优点是,引用不需要对变元进行复制,特别是一些长的 string 字符串或者是矢量 vector,能节省很多的时间开销。
    同理,当我们只需要访问元素而不希望修改它们时,我们仍可以在引用参数前加上 const 关键词。如:

    void function(const int &cite) {
    	cite++;//无法编译,cite为常量
    }
    int main()
    {
    	int variable{ 3 };
    	function(variable);
    }
    

    二、函数默认参数值

    可以为一个函数设置默认的变元值,即只有我们在希望参数值不同于默认值时,才指定参数值。有默认值的形式参数要放在参数列表的最后面。
    需要注意的是,默认变元值只能在函数原型或函数声明中指定,而不是在函数定义中。如:

    void function(int x = 3);//函数声明
    void function(int x) {//函数定义
    	std::cout << x << std::endl;
    }
    int main()
    {
    	int variable{ 3 };
    	function();//输出3
    	function(10);//输出10
    }
    

    当有多个默认参数时,所有默认参数都要同一放在参数列表的后面,且调用函数时省略一个变元,其后面的所有变元都必须要一同省略。因此,应将最可能省略的变元放在参数列表最后面。

    三、函数返回值

    1.返回基本类型

    函数中返回一个基本类型是简单的,只需要 return 关键词后加上想要返回的变量即可。

    2.返回指针

    指针又来了,当我们从函数中返回指针时,要永远遵循一个 Golden rule:

    永远不要从函数中返回自动局部变量的地址。

    好好剖析一下这句话:
    自动局部变量是作用域为函数的变量,它在一个函数中被创建,内存自动为其在栈上分配一块空间。当函数体结束时,内存为其分配的空间又自动释放。因此,若函数返回自动局部变量的指针,那么这个指针所指的内存上的位置实际上是一块不存储任何变量的空间,因为自动局部变量已经被释放掉了,因此返回的指针是一个“野指针”。不过奇怪的是,当我们在主函数中为返回的野指针解除引用,好像又能得到我们”希望“的值,如下:

    int* function(int x) {
    	int a = x;
    	return &a;
    }
    int main()
    {
    	int *p = function(3);
    	std::cout << *p << std::endl;//结果竟为3
    }
    

    这又是为什么, 为什么野指针 p 解除引用后能得到 function 函数中自动局部变量的值?
    其实,当自动局部变量被释放掉后,它原来占用的这一块内存就会立即被标为可使用,也就是可供其他变量存储。但是,这块内存存储的值在未被其他变量覆盖前仍是原来自动局部变量的值,此时的野指针 p 仍可以访问其上的值。

    那么我们要返回怎样的指针呢?答案可以是手动分配内存的局部变量的指针!
    当我们在函数中用new,malloc关键字时,我们为局部变量在堆上手动分配了一块内存,这块内存只有到程序结束或者我们手动用delete,free关键词才会被释放,而不会随着函数的结束而释放,所以函数返回手动分配内存的指针不是野指针。

    四、函数的重载

    我们常常需要用两个或多个函数完成相同的任务,但其参数列表不同,在这种情况下我们可以使用名称相同的重载函数。
    不同的函数有不同的函数签名,函数签名包括一个函数的名称及其参数列表,但不包括函数返回类型。重载函数也是不同的函数,既然它们的名称是相同的,那么其参数列表一定不能相同。重载函数满足以下两个条件之一:
    1.函数参数个数不同。
    2.至少有一对对应参数的类型不同。
    如以下两个重载函数的函数:

    int function(int a,int b) {
    	return a + b;
    }
    double function(double a, double b) {
    	return a + b;
    }
    int main()
    {
    	double a{ 3.14 }, b{ 4.13 };
    	double result{ function(a,b) };
    	std::cout << result << std::endl;//结果为3
    }
    
    

    以上两个函数的参数类型不同。当我们在主调函数中调用 function 函数时,编译器会自动识别变元类型,并匹配相应的重载函数,若找不到相应的重载函数,编译器便会报错。

    五、函数模板

    5.1函数模板生成与调用

    在上述两个重载函数中,唯一区别是它们的参数类型不同,其他代码完全一样。此时,我们可以定义一个函数模板,函数模板是定义一系列函数的蓝图,它不是函数的定义。编译器在需要时使用函数模板生成一个函数定义,如果不需要,就不从模板中生成代码。从函数模板中生成的函数定义称为该模板的一个实例,称为模板函数
    上述重载函数的函数模板如下:

    template <typename T> 
    T function(T a, T b) {
    	return a + b;
    }
    

    其中,template 关键字标识一个函数模板,typename 关键字把 T 标识为类型。这个函数模板的参数为类型,当我们在主调函数中调用函数 function 时,编译器会自动推断变元的类型,并用该实际类型替换类型 T 。如代码调用模板:

    double a{3.14},b{4.13};
    double result;
    result=function(a,b);
    

    实际等价于调用函数:

    double function(double a, double b) {
    	return a + b;
    }
    

    我们也可以显示指定数据类型 T 为任意类型如 double,代码如下:

    double a{3.14},b{4.13};
    double result;
    result=function<double>(a,b);
    

    在函数模板调用语句中,< >内的参数是模板的参数列表,( )内是函数的参数列表

    5.2函数模板的特例

    5.1内函数模板在某些情况下会不适用,或者说无法达到我们预期的结果,如:

    	double a{ 3.14 }, b{ 4.13 };
    	double *pa{ &a }, *pb{ &b };
    	double* result=function(pa,pb);
    	
    

    此时,调用5.1的函数模板编译器会报错,因为我们不能使两个指针直接相加,而我们希望的是返回存储两个变量 a 和 b 相加的结果的指针。对于这种情况,我们可以有两种解决方法供选择:
    1.直接用函数重载方法重载模板函数,编译器优先调用该函数:

    double* function(double *a, double *b) {
    	double temp = *a + *b;
    	double *p = &temp;
    	return p;
    }
    

    2.定义一个5.1函数模板的特例(注意:特例应放在函数模板声明或定义之后)在特例里,template后面的尖括号必须为空,并且手动将类型T替换为我们希望的类型,形式如下:

    template <>
    double* function(double* a, double* b) {
    	double temp = *a + *b;
    	double *p = &temp;
    	return p;
    }
    

    5.3函数模板的重载

    函数模板与函数模板之间可以重载,重载规则与普通函数重载相同,即函数内参数列表不同。以下模板为5.1模板的重载:

    template<typename T>
    T function(vector<T>&data) {
    	for (size_t i = 0; i < data.size(); i++)
    	{
    		data[i] = data[i] * data[i];
    	}
    }
    

    5.4带有多个参数的函数模板

    前面的函数模板只有一个参数 T ,我们也可以在函数模板内使用多个参数,当有一个参数提供函数返回类型时,必须在函数调用时显示指定返回类型,因为编译器无法推断函数模板返回类型。
    两个参数的函数模板:

    template<typename F,typename T>
    F function(T a, T b) {  //F是返回类型,T是参数类型
    	return a + b;
    }
    int main()
    {
    	double a{ 3.14 }, b{ 4.13 };
    	double result=function<int,double>(a, b);//返回类型为int
    	std::cout << result << std::endl;//输出为7
    }
    

    下图可帮助理解函数模板与函数调用
    函数模板与函数调用

    六、拖尾返回类型

    知识前提decltype(expression) 关键字可以返回括号内表达式的类型。

    带有多个参数的函数模板的返回类型可能是不确定的,这时我们首先想到的是可以让用户指定返回类型,如模板:

    template <typename Treturn,typename T1,typename T2>
    Treturn function(vector<T1>& a, vector<T2>& b) {
    	Treturn sum{};
    	for (size_t i = 0; i < ; i++)//假设两个vector元素数量相同
    	{
    		sum += a[i] * b[i];
    	}
    	return sum;
    }
    

    这个模板的作用是返回两个不同类型 vector 对应元素乘积之和,但是 T1 和 T2 我们是不确定的,我们不能保证 T1 和 T2 相加一定会得到我们设定的 Treturn 类型,如果能让编译器自己判断返回类型,可能会更好。C++11提供了拖尾返回类型,其形式为:

    auto function(vector<T1>& a, vector<T2>& b)->decltype(a[0]*b[0]) {//拖尾返回类型
    	Treturn sum{};
    	for (size_t i = 0; i < ; i++)//假设两个vector元素数量相同
    	{
    		sum += a[i] * b[i];
    	}
    	return sum;
    }
    

    auto 关键字表示让编译器自动推断返回值类型,decltype(a[0]*b[0])表示返回 a[0] 和 b[0] 相乘后结果的类型,即T1 和 T2 作用后的类型。比如 intdouble 类型的变量相乘后为 double 类型,那么 decltype 得到的返回类型就是 double 。->表示拖尾返回数值。

    七、函数指针

    与普通变量指针类似,函数指针是可以存储函数地址的变量,它可用于调用自身指向的地址上的函数。但与普通指针相比,函数指针要略微复杂,它还必须存储每个参数的类型以及返回类型。
    函数指针基本形式为:返回类型 ( * 指针名)(参数列表) 如:

    int function(int a, int b) {
    	return a + b;
    }
    int main()
    {
    	int(*pfun)(int, int) = function;
    }
    

    此时,pfun 为指向函数 function 的指针,它只能指向返回类型为 int ,参数列表为(int,int)的函数,绝不可以指向返回类型或参数列表与 pfun 定义不同的函数。
    为了方便,我们也可以直接让编译器来推断函数指针的类型:

    int function(int a, int b) {
    	return a + b;
    }
    int main()
    {
    	auto pfun2 = function;
    }
    

    此时的 pfun2 与 pfun 是一模一样的函数指针。
    另外,函数指针也一样必须要初始化,否则是个野指针。

    有问题欢迎私信交流,转载请注明出处,谢谢~

    展开全文
  • 参数类型为不定请求思路,一个DELPHI程序要调用DLL,而DLL函数名,参数个数,参数类型为不定,要调用的DLL函数名、参数个数、参数类型要可以在窗口Edit动态输入我的意思就是函数不能在程序中事先定义,...
  • Visual Basic快捷教程——函数与子程序

    千次阅读 多人点赞 2017-04-19 22:30:14
    函数是结构化程序设计的基础。函数的本质就是为了把程序切分成若干相对...在Visual Basic函数组以Function开头和End Function结尾的封闭程序代码语句。当函数被调用时,便会开始执行函数体内所定义程序代码
  • 一个Luat程序

    万次阅读 2021-03-24 09:53:38
    目录名称一个Luat程序一个工程安装编辑器更改软件各项默认设置推荐安装的拓展新建工程模块化编程连接硬件点亮LED小灯让LED灯闪烁起来 第一个工程 本文将从零开始,引导你建立第一个工程。在阅读本文前,请确保:...
  • 2.函数名称 注意: 3.参数 4.函数主体 实例: 三:函数声明 补充: 四:调用函数 实例: 五:函数参数 六:内部函数&外部函数&内联函数 1.内部函数 定义: 2.外部函数 定义: 3.内联函数 ...
  • 类与应用程序不同,类的功能虽然独立,但不能独立启动,就象汽车零件那样. 2.Class 是种数据类型, 其变量为对象.对象包含有member variables(成员变量)和member functions(成员函数). class Date{ int year, month...
  • 概述 这个打印的过程是用JDK或Java 2 SDK写一个简单的Java程序,程序会调用一个C函数打印"HelloWorld".这个过程将包括以下步骤: 创建一个Java类(HelloWorld.java),以及定义一个native方法. 使用javac去编译这个Hello...
  • Python函数定义-位置参数-返回值

    千次阅读 2019-05-04 20:37:38
    函数在编程语言就是完成特定功能的一个词句组(代码块),这组语句可以作为一个单位使用,并且给它取一个名字。可以通过函数名在程序的不同地方多次执行(这叫函数的调用)。函数在编程语言有基本分为:预定义函数...
  • 如何快速开发一个自己的微信小程序

    万次阅读 多人点赞 2018-07-18 01:15:24
    对于前端开发而言,微信小程序因为其简单快速、开发成本低、用户流量巨大等特点,也就成了前端开发工程师必会的一个技能。 &nbsp; 2.先看看小程序效果 (1)欢迎页 &nbsp; &nbsp; (2)首页:...
  • 定义函数定义形参,调用函数时传递实参;函数返回值通过return获得;不带返回值时定义为空类型。函数调用形式为函数名 (实参表列)。C语言可以嵌套调用函数。在调用函数时又调用该函数本身为递归,必须有退出条件...
  • c++函数重载,重定义,重写,区别详解理解原理函数重载的...2、当我们调用一个重载的函数时,又是如何去解析的?(即怎么知道调用的是哪个函数呢) 这两个问题是任何支持函数重载的语言都必须要解决的问题!带着这两
  • C++之的友元函数的作用

    万次阅读 多人点赞 2017-12-09 17:23:22
    通过友元,一个不同函数或另一个的成员函数可以访问类的私有成员和保护成员。c++的友元为封装隐藏这堵不透明的墙开了一个小孔,外界可以通过这个小孔窥视内部的秘密。友元的正确使用能提高程序的运行效率,...
  • c语言函数名和宏定义冲突

    千次阅读 2015-04-13 12:41:27
    c标准库有这样的代码: int tolower(int); #define tolower(c) _...}也就是在函数定义的时候在函数名外加了一对括号,我们知道当函数名和宏名冲突时,宏名会掩盖函数名,而加的括号可以阻止翻译程序识别和展开宏
  • 这篇文章里讲一下在GLSL如何使用函数和子程序(subroutines)。...下面,我们以一个普通的ADS(ambient,diffuse,specular)shader为例,熟悉一下GLSL中函数的用法。 Vertex Shader: #version 400 layout (locati
  • 通过友元,一个不同函数或另一个的成员函数可以访问类的私有成员和保护成员。c++的友元为封装隐藏这堵不透明的墙开了一个小孔,外界可以通过这个小孔窥视内部的秘密。 友元的正确使用能提高程序的运行...
  • C++之利用typedef定义函数指针

    千次阅读 2018-05-09 10:28:04
    转自:https://blog.csdn.net/u014114990/article/details/47748747进入正文: 代码简化, 促进跨平台开发的目的. typedef 行为有点像 #define 宏,用其实际类型...用法:typedef int (*MYFUN)(int, int); ...
  • C++:第一个程序

    万次阅读 2018-10-04 16:52:50
    C++的第一个程序一个向控制台输出向世界问好的程序,源码如下,其程序文件名可为HelloWorld.cpp: #include &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;iostream&amp;amp;amp;amp...
  • 函数名称前面加引用“&”或指针符号“*”的意思

    万次阅读 多人点赞 2017-10-10 08:55:29
    学习笔记: (一) 函数名称前面加引用符号“&”,代表该函数返回值类型是引用。 如:int &operate+(...); ...函数名称前面加指针符号“*”,代表它是函数指针。...定义一个函数指针 指针是变量,所
  • 今天再给大家分享一个函数指针】的高级应用;在嵌入式系统开发,此类用法非常地常见,但如果对【函数指针】的理解不够透彻,很有可能会看得一头雾水。 代码片段如下: typedef void (*kernel_func)(void); ...
  • 函数的声明、定义和调用 函数:提高可读性。实现多功能,只需对每功能编写程序,主程序调用所写程序即可。 以这问题为例: 函数声明(有分号): status ReadInfo(char *name, struct student stu[], int...
  • matlab中定义类、面向对象编程

    万次阅读 2018-07-09 23:36:21
    Matlab也可以写面向对象的代码,首先表现在可以定义类,可以继承,使用类(class)有很多好处,其中一个重要的好处便是解决变量名冲突和让函数、对象的结构清晰。class的static function可以在不定义类的实例直接...
  •  对于前端开发而言,微信小程序因为其简单快速、开发成本低、用户流量巨大等特点,也就成了前端开发工程师必会的一个技能。  2.开发准备:  (1)有人开玩笑说,会vue小程序根本都不用学:  微信小程序虽然是...
  • (转) 两天快速开发一个自己的微信小程序

    万次阅读 多人点赞 2018-04-22 21:59:54
     对于前端开发而言,微信小程序因为其简单快速、开发成本低、用户流量巨大等特点,也就成了前端开发工程师必会的一个技能。 2.先放上我做的小程序可以在微信小程序搜索“悬笔e绝”,或者用微信扫描下面的二维码哦...
  • 、面向对象程序设计(OOP)的三大基本特征(定义、特性、优缺点、java的表现形式、应用) 1.封装 封装的定义 ​ 通俗的说:普通人对计算机进行应用操作,只需知道如何在计算机上连网,如何浏览网页,下载东西...
  • python中函数的使用

    千次阅读 2018-09-03 11:27:30
    所谓函数,就是把具有独立功能的代码块组织成为一个小模块,在需要的时候调用 函数的使用包含两个步骤 1.定义函数–封装独立的功能 2.调用函数–享受封装的成果 使用函数的好处: 在开发时,使用函数...
  • Js函数

    千次阅读 热门讨论 2021-02-21 13:18:57
    目录JavaScript 函数定义自调用函数箭头函数JavaScript 函数参数参数规则默认参数ES6 函数可以自带参数arguments 对象JavaScript 函数调用this 关键字调用 JavaScript 函数作为一个函数调用函数作为方法调用使用构造...
  • 本节是记录搭建第一个NDK程序的过程,记录总结了相关步骤,以及遇到的一些问题~希望帮助后来者吧

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 175,166
精华内容 70,066
关键字:

一个程序中用户定义的普通函数名称