第七章 函数

1. 函数不能返回另一个函数或者内置数组类型,但是可以返回指向函数的指针,或指向数组元素的指针

int *foo_bar() {/*....*/}

2. 函数必须指定返回类型,至少也要void


3. c++是一种静态强类型语言,每一次函数调用,编译时都会检查实参。


4.如果形参具有非引用类型,则复制实参的值,对形参的修改不会影响实参的值,非引用形参就如何实参的局部副本;如果形参是引用类型,则它只是实参的别名,任何对形参的改动也会影响到实参。

对于指针形参,初始化的时候也是复制实参指针,所以如果将新指针值赋给形参,那么不会改变主调函数中的实参指针,但是如果修改形参指针指向的对象的值,那么此时也会实参指针指向的值。

void reset(int *ip)
{
	*ip = 1;
	ip = 0;
}

通过运行reset函数,那么实参指针依然是原来的值,但是指向的对象的值会变成1。

如果要保护实参指针的值不被修改,那么需要定义const int *ip


5.可以将指向const对象的指针初始化为指向非const对象的指针,但是不可以把指向非const对象的指针初始化为指向const对象的指针。

如:

void use_ptr(const int *p)
{
	//....
}
此时可以用int*也可以用const int *的实参调用use_ptr函数,但是对于上面的reset函数只能传递int* 指针。


6.对于函数的形参是非引用类型的,那么无论形参是否为const,都可以把const和非const实参传递,因为实参是以副本的形式传递的,那么就不会更改到实参中的值,自然就无所谓的const和非const区分。


7.复制实参也不是很多情况下都适合,如果需求要修改实参的值,或者大型对象作为参数传递,那么复制的话就需要花费很大的代价,或者没办法实现对象的复制,那么此时可以将形参定义为引用或者指针类型。


8. 如果函数具有普通的非const引用形参,那么不能传递const对象,因为函数可以修改传递进来的对象,这违背了实参的const特性。

只要函数中不会修改实参对象,那么就应该把函数的形参定义为const类型,要不然这会影响到函数的适用范围,因为这样子就不能使用const对象,比如:

string::size_type find_char(string &s, char c)
{
	/*find specify character*/
}
此时如果使用find_char("Hello World", 'O')那么编译是失败。


9. 指向指针的引用  int  *&v

10. 函数不应该有vector或其他标准库容器类型的形参,调用含有普通的非引用vector形参的函数会复制vector的每一个元素,我们可以把形参声明为引用类型,之后我们学习到通过将指向容器中需要处理的元素的迭代器来传递容器。


11. 数组形参,

void printValues(int *) {}
void printValues(int []){}
void printValues(int [10]){}
这三种方式都是ok的,编译器检查的时候会忽略数组的长度,只是检查类型。但是如果定义长度会引起误解,如果实参数组的长度少于10,那么就会引起越界访问
如果是通过引用传递数组的,那么编译器不会把实参转化为指针,而是传递数组的引用本身,这时候数组大小成为形参和实参类型的一部分,编译器会检查长度是否匹配
void printValues(int (&arr)[10])//保存10个int的数组的引用
void printValues(int &arr[10])//保存10个引用的数组

12. int main(int argc, char *argv[])


13.函数的返回值千万不能返回局部对象的引用,也不能返回局部对象的指针。

14.static局部对象

15.内联函数应该在头文件中定义。因为内联函数的定义对编译器必须是可见的,以便编译器在调用点能够内联展开该函数的代码


16.编译器隐式的将类内定义的成员函数当作内联函数

17.常量成员函数,即在成员函数声明的形参表后面存在const

bool Sales_item::same_isbn(const Sales_item *const this, const Sales_item &rhs) const
{
	return (this->isbn == rhs.isbn);
}
也就是说,this其实是默认隐含形参,后面的const会修饰this  使用的话 total.same_isbn(trans),那么此时隐含的this形参就是指向total的const Sales_item* 类型的指针


const对象、指向const对象的指针或引用只能用于调用其const成员函数,如果尝试用它们来调用非const成员函数,那么是错误的。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章