现在的位置: 首页 > 综合 > 正文

[C++ Primer] 函数

2018年04月03日 ⁄ 综合 ⁄ 共 1364字 ⁄ 字号 评论关闭

1.在向函数传递大型对象时,使用引用形参可以避免复制从而提高效率,而且某些类类型是无法复制的(标准库IO类),当然传递指针也是可行的。如果使用引用形参唯一的目的是避免复制实参(即不需要修改实参),那么应该将形参定义为const引用,因为非const引用使用不太灵活,这样的形参使得不能使用const对象,也不能用字面值,产生右值的表达式,需要类型转换的对象作为实参。

int incr(int &var)

{

    return ++val;

}

int main()

{

short v1 = 0;

const int v2 = 42;

int v3 = incr(v1);//错误:不能使用需要类型转换的对象作为实参

v3 = incr(v2);//错误:不能使用const对象作为形参

v3 = incr(0);//错误:不能使用字面值作为实参

v3 = incr(v1+v2);//错误:不能使用产生右值的表达式作为实参

}

使用const引用作为形参的好处:const和非const对象都能作为实参

2.函数如果需要传递vector等标准库容器类型的参数时,如果直接调用vector等形参的函数将会复制vector的每一个元素,从避免复制的角度出发应将引用作为形参,然后C++程序倾向传递迭代器来传递容器。

3.通过引用传递数组时,编译器不会将实参转换为指针而是传递数组的引用本身,这样的情况下数组的大小也成为形参实参类型的一部分,编译器会检查数组实参的大小与形参的大小是否匹配。

4.内联函数应该在头文件中定义,这点不同于其他函数。内联函数的实质是在程序中的每个调用点上“内联的”展开,所以内联函数的定义对编译器而言必须是可见的,以便于编译器能够在调用点展开,此时仅有函数原型是不够的。此外,编译器隐式地将在类中定义的函数当作内联函数。

5类成员函数:

      1.const成员函数只能读取而不能修改调用它们对象的数据成员,而const对象,指向const对象的指针或引用只能调用其const成员函数

      2.如果没有为一个类显示定义任何构造函数,编译器将自动为这个类生成默认构造函数,即合成的默认构造函数。如果显示定义了一个构造函数,即使是有参数,那么编译器也不会自动生成合成构造函数,也就是说在调用无参构造函数时将找不到调用的函数出现错误。另外,合成的默认构造函数对于类数据成员会调用其自身的默认构造函数初始化,而对于内置类型和复合类型不会自动初始化,所以必须显示的定义默认构造函数来初始化内置类型和复合类型的数据成员(如果含有这两种类型数据成员的话)。

6函数重载和重复声明:如果两个函数的返回类型和形参表完全相同,则将第二个函数视为第一个函数的重复声明,如果两个函数的形参表完全相同,但返回类型不同,则第二个声明是错误的,函数不能仅仅基于不同的返回类型而实现重载(附:默认实参不会改变形参的个数;const对于非引用形参来讲是等价的,如果形参为引用或者指针那么const与非const是不同的)。

7.函数重载与作用域:在函数局部声明的名字将会屏蔽在全局作用域声明的同名名字,这个关于变量名字的性质对于函数同样成立。如果局部的声明一个函数,该函数将屏蔽而不是重载在外层作用域中声明的同名函数(只要函数名相同,不管返回类型或者形参表是否相同,都会屏蔽掉)。所以重载函数应该在同一作用域中声明。

抱歉!评论已关闭.