- 可以传递变量、数值和表达式
- 参数不会被修改
- 允许函数修改参数的值,有时非常有用
- 引用不涉及到复制参数的信息,较快
- 可以传递常量引用,防止无目的的修改
- 可以返回多个值
- 非常量引用不能是数值和表达式,只能是变量
- 比较困难清晰说明穿打底的引用是输入、输出还是两者皆是。
- 不能从函数调用确定函数是否被修改;
- 允许函数改变参数的值
- 因为不进行拷贝,速度较快
- 可以返回多个值
- 参数不能为数值或表达式,必须是正常的变量
- 所有参数必须检查是否为空指针
- 较值传递慢
值、引用和地址的返回给函数调用几乎是一样的。
1)值返回是最简单和最安全的方式:
返回的变量或表达式可以包含函数声明的局部变量;
对于结构体和类对象是比较慢的;
2)引用返回
引用返回必须是变量,调用者可以继续使用该引用修改变量,很多时候是比较有用的,而且比较快速;
注意不能返回函数的局部定义的变量引用:
3)地址返回
地址返回只能返回变量的地址,不能是数值和表达的;
地址返回也是比较快速的,不能返回局部变量的地址;
若返回的是调用函数的局部定义变量的地址,编译器会产生警告信息的;
地址常用之一就是返回新的分配内存给调用者:
小结:
一般值返回是足够使用的,足够灵活和安全;
引用返回和地址返回是比较有用的,特别是针对结构体和类对象的动态分配地址;
注意在引用返回和地址返回时,确保返回的不是函数自定义的局部变量的引用或地址。
3、类和结构体的区别
- 类的成员可以使用标识符来控制它们的可访问性
- 结构体默认访问级别是public,类的默认访问级别是private
封装的思想就是将实现细节隐藏,而暴露公有接口。
C++中的访问标识符,可以实现在类中的封装,通常将所有的成员变量私有化
普通的简单类,一般不需要析构函数;因为C++会自动回收垃圾;
如果类中执行了某些动态内存分配,则需要显式定义析构函数,并释放回收垃圾;
析构函数的明确命名规则:
A)函数名和类名一样,并前缀'~';
B)不能带参数(即意味着只有一个析构函数);
C)没有返回类型。
6、常量类对象和常量成员函数
函数的参数可以为常量对象,如内置的基本数据类型一样,类对象也可以声明为常量,所有常量对象的变量必须在创建时初始化,其后不能修改。
上图3个错误,因为程序试图修改常量类对象的变量;
因为常量类对象不能调用非常量成员函数;
常量成员函数-保证不修改任何类变量或调用任何非常量函数。
为了使GetValue常量化,可以在其原型加个const关键字:
注意:
A) 常量成员函数在类外定义时,也必须加const关键字;
B) 任何常量成员函数试图修改类成员变量,或者调用非常量成员函数都是非法的,会产生编译错误。
C) 构造函数不能常量化;
如果同时在类中,对于函数名相同的const函数和非const函数能够构成重载,同时它们被调用的时机为:如果定义的对象是常对象,则调用的是const成员函数,如果定义的对象是非常对象,则调用重载的非const成员函数。