`
geke260
  • 浏览: 13981 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

C++函数学习

阅读更多
1. 函数不能返回另一个函数或者内置数组类型,但可以返回指向函数的指针,或者指向数组元素的指针的指针。
2. 早期的C/C++在声明时可以不指定返回类型,如果缺少显示返回类型,函数的返回值将被假定为int型。现在标准的C++必须指定返回类型,否则编译出错。
3. 早期的C在声明时可以不指定形参列表,因为C不支持重载,编译不会出现问题,但是在C++中,由于支持重载,必须制定形参列表。(在vs 2008中测试过)
4. 在参数传值时,如果参数是指针(引用),则形参的初始化根据指针的初始化规则。指针的初始化规则 4.2.5节。可以将指向const对象的指针初始化为指向非const对象的指针,但是不能将指向非const对象的指针初始化为指向const对象的指针。这条规则不适应于一般的非引用(或者非指针)对象的传值,因为调用的时候形参复制了实参的值,所以可以用const对象的实参初始化非const对象的形参,同样的,可以用非const对象初始化const对象的形参)
5. 当函数的形参非指针或者引用类型时,且形参声明为const时,但是编译器会忽略掉这个const,如下两个函数定义:
void fcn ( const int i ){ /* 函数体*/}
void fcn ( int i ){ /*函数体*/}
这是编译时会出现重定义错误。这种用法是为了支持对C语言的兼容,因为在C语言中,具有const形参或非const形参的函数并无区别。也可以说是函数调用时会将值复制给fcn,这时并不需要考虑形参是否为const。但是当函数形参为指针类型时
void fcn ( const int * i ){ /* 函数体*/}
void fcn ( int  *i ){ /*函数体*/}
则这两个函数是不同的重载函数,这种情况同样适用于引用类型的形参。
6.在函数需要返回多个值的时候,引用传值或者指针传值是个不错的选择。
7.如果函数具有普通的非const引用形参,则显然不能用const对象进行调用。而且当传递过来为右值或者具有需要转换类型的对象时,同样不能进行调用。当传入值为需要转换类型的对象时,这时会产生一个临时对象,函数内所作的修改只反映到对临时对象,违背了调用者的本意(对实参进行修改),所以编译器会提示出错。而当传入值为右值时,右值不能初始化引用类型或者出现临时对象错误。
8.在实参为数组类型时,由于形参只能是其对应的作为实参的数组元素的指针类型或者是数组的引用。当形参为指针引用类型时,因为调用时总会产生临时对象,有可能出现7中的问题。当形参声明为数组的应用时,编译器不会讲数组实参转化为指针,而是传递数组的引用本生。在这种情况下,数组大小成为形参和实参类型的一部分。编译器会检查数组实参的大小与形参的大小是否匹配。
例一  :形参为指针引用类型时
#include<cstdio>
void func1( int *const&a);
void func2( int *&a);
int main(){
int myarray[5] = {1,2,3,4,5};
func1(myarray);
func2(myarray); //形参为非const指针引用,由于会产生临时对象,编译会报错
    }   
int func1(int *&a){
/*函数体*/
}
void func2(int *const&a){
/*函数体*/
}
例二 :形参为数组引用类型时
#include<cstdio>
void  func1(int (&a)[4]);
void func2(int (&a)[5]);
int main(){
int myarray[5] = {1,2,3,4,5};
func1(myarray); //编译不通过,形参和实参的数组长度不一致
func2(myarray); //输出20,得到数组的实际长度。
printf("%d",myarray[3]);
getchar();
    }  
void func1(int (&a)[4]){
/*函数体*/
}
void func2(int (&a)[5]){
   printf("%d\n",sizeof(a));
}
9.默认实参可以是任意的表达式,如果在函数调用时,需要用到默认实参,则在调用时求解改表达式。既可以在函数声明时也可以在函数定义中指定默认实参。但是,在一个文件中,只能为一个形参指定默认实参一次。通常应在函数声明中指定默认实参,并将改声明发那个在合适的头文件中。如果在函数定义的形参表中提供默认形参,那么只有在包含改函数定义的源文件中调用该函数时,默认实参才是有效的。
//ff.h
int ff(int  i=0);

//ff.cc
#include "ff.h"
int ff(int  i=0) {/* 函数体*/} //出错,因为包含了头文件,为形参i指定了两次默认实参。

10.编译器隐式地将在类内定义的成员函数当做内联函数。如果成员函数写在类外,需要在声明时加inline才是内联的。必须将成员函数定义在类声明的头文件中。当成员函数声明为inline时,函数定义不必在加inline。
11.如果成员函数被声明为const成员函数,那么函数定义是形参列表之后也必须有const。
12.在合成的默认构造函数中,对内置数据类型的成员变量的初始化如将依据变量的初始化规则初始化类中的所有成员。对类类型的成员采用该类自身的默认构造函数初始化。内置类型成员的初值依赖于对象如何定义。如果对象在全局作用域中定义或定义为静态局部对象,这这些成员初始化为0,。如果对象在局部作用域中定义,这些成员没有初始化(即初值不确定)。
13. 如果局部地声明一个函数,则该函数声明会屏蔽掉在外层作用域中声明的同名函数。由此类推,每一个版本的重载函数都应该在同一个作用域中声明。一般来说,局部地声明函数是一种不明智的选择。函数的声明应该放在头文件中。
例子:
void print(const string &);
void print(double);
void fun(){
void print(int);
  print("value");//编译错误,因为外部的声明被屏蔽了。
}
14.函数的匹配过程。
在函数匹配过程中,通过类型提升实现的转换优于其他标准转化。在标准转化时,从char到unsigned char的转换的优先级不比从char型到double型的转换高。枚举值会被提升为int型或者更大的类型,具体的提升类型型取决于枚举成员的值。 
15.可以使用函数名对函数指针做初始化或者赋值。直接引用函数名等效于在函数名上应用取地址符号。
cmpFcn pf1 = lengthCompare;
cmpFcn pf2 = &lengthCompare;
cmpFcn为函数指针,两者等效。
指向函数的指针可用于调用它所指向的函数。可以不需要使用介引用符号,直接通过指针调用函数。
pf2(“hi”,”world”);
不会出现编译错误。
函数的形参可以为指向函数的指针,这种形参可以用以下两种形式编写:
void useBigger(const string &, const string &,bool(const string &, const string & ));
void useBigger(const string &, const string &,bool(*)(const string &, const string & ));
函数的返回类型可以是函数指针类型,但是不能为函数类型。
示例:
#include<cstdio>
typedef int func(int ,int);
typedef int (*funcp)(int ,int);
int compare(int ,int);
int main(){
   func f1 = compare; //出错,不能用函数名为函数类型的变量赋值,只能为函数指针类型的变量赋值
   func *f2 = compare;  //正确。f2为函数指针
   funcp fp = compare;  //正确。fp为函数指针
}
int compare(int n,int m){
return n>m;
}
分享到:
评论

相关推荐

    C++函数学习资料_C++

    本学习资料“C++函数学习资料_C++”主要针对初学者,旨在帮助他们理解和掌握C++中的函数概念。PPT文档“c++函数.ppt”将深入探讨以下几个关键知识点: 1. **函数定义与声明**: 函数定义包含了函数名、返回类型...

    C++ 函数学习.pdf

    C++ 函数学习.pdf

    lua调用C++函数

    Lua是一种轻量级的脚本语言,常用于游戏开发、嵌入式系统和服务器应用程序,因其简洁、高效而受到欢迎。...如果你遇到问题,可以尝试分析源码或者在类似的环境中编译运行,以便更好地理解和学习Lua调用C++函数的过程。

    c++函数库查询 c++工具集

    "c++函数库查询 c++工具集"就是这样一个针对C++函数库的查询工具,它的设计目标是帮助开发者快速、直观地获取所需函数的详细信息。 这个工具类似于Java的javadoc,以网页形式呈现,使得用户可以轻松浏览和搜索C++库...

    C、C++函数手册 C/C++函数手册

    《C、C++函数手册》是学习和使用这两种语言时不可或缺的参考资料。这份手册详尽地涵盖了C和C++标准库中的各种函数,帮助开发者快速查找和理解函数的功能、参数、返回值以及可能的错误情况。以下是手册中可能会包含的...

    C/C++详细函数大全

    C++函数大全包含了C语言的所有函数,同时增加了许多C++特有的函数。比如,`new`和`delete`是C++中的内存管理函数,它们与C语言的`malloc`和`free`类似但更加强大,可以处理类对象的构造和析构。C++标准库中还包含...

    c++\实验2 C++函数的定义与使用.

    实验二C++函数的定义与使用的目的是学习函数的定义、函数的使用和函数重载,掌握函数的声明、定义和使用,理解函数参数的传递和C++系统函数的调用。 实验设备包括计算机、Windows操作系统和VC++6。 实验内容和步骤...

    winapi和C++函数查询.rar

    除了上述查询方式,还可以利用GitHub上的开源项目和社区论坛(如Stack Overflow)学习他人的代码和经验,这些都能成为查询和学习WinAPI与C++函数的有效资源。 总之,WinAPI和C++函数查询是开发者必备的技能,理解...

    C、C++函数辞典.chm

    《C、C++函数辞典》是一份宝贵的编程资源,主要涵盖了C和C++两种编程语言中的函数使用和解释。这份CHM( Compiled HTML Help)文件是程序员在学习和工作中查询函数用法的重要参考工具。下面,我们将深入探讨C和C++...

    python调用C++函数

    本文将详细介绍如何在Python中调用C++函数,以实现Python与C++的交互。 首先,我们需要理解Python与C++之间的接口是如何建立的。Python提供了一种称为`ctypes`的库,它允许我们直接调用动态链接库(DLL或SO)中的C...

    C/C++函数集合.CHM

    总的来说,《C/C++函数集合.CHM》是学习和工作中不可或缺的工具,它能帮助你深入理解C/C++函数的使用,提高编程技能,同时,双语版本的设计也增加了其普适性。无论你是自学编程的新手,还是在项目开发中寻求解决方案...

    c c++函数手册.rar

    《C/C++函数手册》将这些知识点以详尽的条目形式呈现,便于开发者快速查找和理解函数的用法,是学习和工作中不可或缺的参考材料。通过深入学习和实践,开发者可以更好地掌握这两种强大的编程语言,提升开发效率和...

    c++函数实例

    C++函数是编程中至关重要的组成部分,它们允许我们将代码组织成可重用的模块,提高代码的可读性和可维护性。本实验旨在帮助初学者理解C++函数的基本概念、参数传递方式以及递归的使用。 首先,我们要明确函数原型...

    经典C++函数手册+(LibraryFunctions).zip

    总的来说,《经典C++函数手册+(LibraryFunctions).zip》是学习和提升C++技能的宝贵资源。通过仔细阅读并实践手册中的内容,开发者可以更熟练地运用C++的标准库,编写出高效、可靠的代码。无论是解决实际问题还是参与...

    C++函数编程20道习题汇总含其详细程序解答_C++_

    这里,我们聚焦于"20道C++函数编程习题及其详细程序解答",这些习题旨在帮助学习者深入理解C++中的函数使用、参数传递、返回值以及函数模板等核心概念。 1. **函数定义与调用**:基础的函数定义包含函数名、返回...

    C/C++函数词典

    《C/C++函数词典》是一款专为C和C++编程者设计的学习工具,它集成了C和C++语言中的各类函数,提供了详尽的解释和示例,帮助程序员快速查询、理解和掌握这些函数的使用。这个软件的重要性在于,它能够帮助初学者减少...

    C C++函数手册.CHM,c++标准库函数(cn).CHM,c++库函数(en).CHM

    《C C++函数手册》可能涵盖了C语言的所有内置函数和C++特有的函数,包括数学运算、字符串处理、内存管理、输入/输出操作等各个方面。 《c++标准库函数(cn)》针对中文用户,详细解读了C++标准库中的各种函数,如容器...

    几个关于c++函数实例

    C++是一种强大的面向对象编程语言,它以其...在提供的"新建文件夹"中,可能包含这些概念的示例代码,通过学习和实践这些实例,可以帮助你更好地理解和运用C++函数。记得结合理论与实践,不断巩固和提升自己的编程技能。

    C++函数详解

    C++函数是编程中的核心元素,它是一种组织代码的方式,允许我们将一段可重用的代码封装起来,便于在程序的不同地方调用。函数在C++中扮演着至关重要的角色,它们提高了代码的可读性、模块化和复用性。在深入探讨C++...

Global site tag (gtag.js) - Google Analytics