C++ 函数参数

C++中函数的参数类型

  • 值传递
  • 引用形参
  • const参数
  • 数组参数

值传递

将实参的值复制一份给形参。主要有两种:1)地址参数——实际是对实参操作。2)非地址参数——形参改变不会影响实参

引用形参

实参的引用,实际操作实参,但不会拷贝对象

优点:

  1. 拷贝某些大的自定义类型的对象时效率低
  2. 某些类型(IO类型)不支持拷贝

比如在IO流中,重载输出运算符<<,将ostream对象的引用穿进去。

1
friend ostream& operator<<(ostream &os, const My_String &str);

3. 还可以用来返回多个参数,将需要修改的参数通过引用形参传进去
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 int MultiRe(int& n1, int& n2)
{
n1 = n1 + 1;
n2 = n2 + 1;
return n1 + n2;
}
int main()
{
int n1 = 1;
int n2 = 1;
int n3 = MultiRe(n1, n2);
cout << "n1 is : " <<n1<< endl;
cout << "n2 is : " << n2<<endl;
cout << "n3 is : " << n3<<endl;
system("pause");
return 0;
}

输出:
1
2
3
n1 is : 2
n2 is : 2
n3 is : 4

n1和n2的值都改变了。

const参数

  1. 如果两个函数只有顶层const(顶层const是针对对象本身)不同,那么不能将两个函数却分开,编译器会报函数重复定义的错误。底层const(常量引用或常量的指针),不会报错

下面两个show函数中,const int n顶层const,会出现重复定义错误。

1
2
void show(const int n)
void show( int n)

修改成底层const
1
2
void show(const int& n)
void show( int& n)

  1. 可以用非常量初始化底层const(当然顶层const也可以),反之不行
  2. **尽量使用常量引用 **

这是因为非常量的引用会给人这样的印象——允许你修改变量;如果形参是非常量引用,那么函数不能接受常量实参

对于const参数主要了解这个const属性到底加在哪?并且在操作中不能违背这个const属性

顶层const修饰对象本身,比如

1
2
3
4
const int n1 = 1 ;
int const n2 = 1 ;
int n;
int *const ptr = &n; //指针本身是常量,ptr指向了n,这个指向不能变,但是可以修改ptr指向的对象的值,也就是n的值。

底层const是const引用或者常量的指针

1
2
3
4
5
int n;
const int& nn = n; //nn是常量的引用
const cn = 1; //cn是常量,只有可以指向常量的指针才可以指向它,比如下面的ptr,
//如果一个非常量的指针指向cn,就违背了cn的const属性
const int* ptr = &cn; //ptr是常量的指针,它可以指向常量和非常量

数组参数

数组的特性:

  1. 数组不允许拷贝
  2. 使用数组通常是将它转化成数组的首地址形式
1
2
3
4
5
6
7
8
9
10
11
void print(const int* arr) //只传数组首地址
{
if(arr)
while (*arr) //通过判断是否到了数组末尾来终止函数
cout << (*arr++) << endl;
}
int main()
{
int arr[] = { 1,2,3,4,5 };
print(arr); //将数组的首地址传进去
}

也可以传递数组的首地址和尾地址的下一位,类似于STL操作

1
void print(const int* start,const int* end);

也可以传递首地址和数组长度

1
void print(const int* arr,const int lenght);

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!