第七章 函数

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成员函数,那么是错误的。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第三章介绍了Scala的函数和方法,以及它们的区别。具体内容如下: 1. 函数和方法的区别:函数是一段可以独立调用的代码,它可以像变量一样被传递、返回和赋值;而方法是属于某个对象或类的一段代码,它必须通过对象或类来调用。 2. 函数的定义方式:可以使用def关键字定义函数,也可以使用匿名函数(lambda表达式)。 3. 函数的参数:Scala的函数可以没有参数,也可以有多个参数。参数可以有默认值,也可以是可变参数。 4. 函数的返回值:Scala的函数可以没有返回值,也可以有返回值。返回值类型可以显式声明,也可以自动推断。 5. 方法的定义方式:方法必须定义在对象或类中,使用def关键字表示。方法可以有访问修饰符和参数列表,也可以有返回值类型和方法体。 6. 方法的参数:和函数一样,方法可以有多个参数,也可以有默认值和可变参数。 7. 方法的返回值:方法必须有返回值类型,如果没有显式声明,则默认返回Unit类型。 8. 函数和方法的调用:函数可以直接调用,也可以通过变量、高阶函数等方式调用;方法必须通过对象或类来调用。 9. 函数式编程的特点:函数式编程强调函数的纯粹性、不可变性和高阶函数的使用,它能够简化代码、提高可读性和可维护性。 总之,Scala的函数和方法都是非常重要的编程工具,它们可以让我们更加灵活地组织代码,提高开发效率和代码质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值