第七章:函数

来源:互联网 发布:宁静知乎 编辑:程序博客网 时间:2024/05/01 12:11

1.如果使用引用形参的唯一目的是避免赋值实参,则将形参定义为const引用.

 

2.应该将不需要修改的引用形参定义为const引用.普通的非const引用形参在使用时不太灵活,这样的形参既不能用const对象初始化,也不能用字面值或产生右值的表达式参数实例化.

 

3.通常函数不应该有vector或者其他的标准库容器类型的形参.C++倾向通过传递指向容器中需要处理的元素的迭代器来传递容器.

 

4.当编译器检查数组形参关联的实参时,它只会检查实参是不是指针、指针的类型和数组元素的类型是否匹配,而不会检查数组的长度.

 

5.如果形参是数组的引用,编译器不会将数组实参转化为指针,而是传递数组的引用本身.这种情况下,数组大小成为形参和实参类型的一部分.编译器检查数组实参的大小与形参的大小是否匹配.

 

6.确保函数的操作不超出数组实参边界的技巧:

1).在数组本身存放一个标志来检测数组的结束.(C语言的字符串就是利用这种方式)

2).传递指向数组的第一个和最后一个元素的下一位的指针.(类似于迭代器)

3).显示传递表示数组大小的实参

 

7.函数的返回值用于初始化在调用函数处创建的临时对象(在求解表达式时,如果需要一个地方存储其运算结果,编译器会创建一个没有命名的对象).函数返回值类型的处理方法:

       1).如果是非引用,在调用函数的地方会将函数的返回值复制给临时对象,当函数返回非引用类型时,其返回值既可以是局部变量又可以是求解表达式的结果

2).返回值为引用时,没有复制返回值,返回的是对象的本身

注意:千万不要返回局部变量的引用

 

8.代码:

char &get_value(string &str,string::size_type ix)

{

       return str[ix];

}

void main()

{

       string s("a value");

       cout<<s<<endl;

       get_value(s,0) = 'A';

       cout<<s<<endl;

}

 

9.自动变量相当于局部变量.内联函数应该在头文件中定义,这一点与其他函数一致.这样可以确保在调用函数是所使用的定义是相同的,并且保证在调用点该函数的定义对编译器可见.

 

10.在类的成员函数中声明const,在成员函数中,不能修改对象本身的成员变量.另外,const对象、指针const对象的指针或引用只能被const成员函数调用

11.如果没有为一个类显式定义任何构造函数,编译器将会为这个类自动生成默认的构造函数.另外,在全局定义的成员变量或静态定义的成员变量,默认为0.(即与非类的变量一致)

 

12.const引用的形参的函数与有非const引用形参的函数是不同的.

 

13.重载函数的匹配情况:

1).编译器找不到与实参最佳匹配的函数,并生成调用该函数的代码.

2).找不到形参与函数调用的实参匹配的函数;在这种情况下,编译器将给出编译错误信息

3).找到多个与实参匹配的函数,在这种情况下,编译器也将产生编译错误.(即所谓的二义性).

 

14.重载确定的三个步骤:

1).候选函数:确定该调用所考虑的重载函数集;

2)选择可行函数:从候选函数中选择一个或多个函数,他们能够用该调用中指定的实参来调用.

可行函数的满足条件:

①  函数的形参个数与该调用的实参的个数相同

②  ②每个实参的类型必须与对应形参的类型匹配,或者可被隐式转换为对应的形参类型

3)寻找最佳匹配

4).含有多个形参的重载确定

15.指向函数的指针,向其他指针一样,函数指针也指向某个特定的类型,函数类型由其返回的类型即形参确定,与函数名无关.

使用typedef来简化其定义,:

typedef  bool (*pFun)(参数列表)//这种形式在dll中常常使用.

该定义表示pFun指针,它指向返回bool类型并带有参数 的指针

允许将形参定义为函数类型,但函数的返回类型则必须是指向函数的指针,而不能是函数.

 

原创粉丝点击