非引用形参
//交换函数,传递的实参只是参数的副本。并不能起到交换作用
void swap(int a, int b) {
int m = a;
a = b;
b = m;
}
指针形参
//可以起到交换作用
void swap(int *a, int *b) {
int m = *a;
*a = *b;
*b = m;
}
引用形参
//可以起到交换作用
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
const形参
用const修饰形参,避免实参被修改
string::size_type length(const string &str) {
return str.size();
}
用数组作为形参
//1
void m(int a[]) {
cout << a[0] << endl;
}
//2
void m(int *a) {
a[0] = 3;
cout << a[0] << endl;
}
int a[] = {1, 2, 3};
m(a);
也可以使用const数组形参
一般使用非const形参,实参会复制一份传递。
但是针对数组,数组会悄悄转为指针,参数传递是这个指针的副本,指向数组第一个元素,更改这个值,也就可以改变数组元素的值,这里不能通过计算得到数组的大小,必须使用第二个参数来告诉函数传进来的数组的大小
int a[] = {1, 2, 3, 4, 5};
cout << a << endl;
cout << sizeof(a) << endl;//20
//必须显示的把数组元素大小传进去
int sum(int arr[], int n) {
int total = 0;
cout << sizeof arr << endl;//4 是一个元素的大小
for (int i = 0; i < n; i++) {
total += arr[i];
}
return total;
}
返回非const对象
把要返回的对象复制一个副本返回回去
const string getString(const string &str1, const string &str2) {
return str1.size() < str2.size()? str1 : str2;
}
返回cons对象
没有复制直接返回原对象,但是千万不要返回局部对象的引用,因为函数运行完这些对象要销毁
const string &getString(const string &str1, const string &str2) {
return str1.size() < str2.size()? str1 : str2;
}
类的成员函数
class Person {
public:
bool isAgeSame(const Person &person) const {
return age == person.age;
} ;
private:
string name;
int age;
};
Person p;
p.isAgeSame(person);
//cosnt成员函数不能修改调用者。
bool isAgeSame(const Person &person) const {
return age == person.age;
} ;
当调用p.isAgeSame(person);会有一个隐含的this形参,相当于
bool isAgeSame(const Person &this, const Person &person) const;
后面的const表示const成员函数,不能修改this对象。
函数指针
//定义一个函数
int m(int a) {
return a;
}
int (*pf)(int);//声明一个函数指针,只需要把函数名换成(*pf)
auto f = m;//使用auto的一个函数指针
pf = m;//函数指针赋值必须要写在main方法里面
f(5);
(*pf)(5);
使用函数指针可以把函数作为函数的参数
//声明一个函数
int m(int a) {
return a + 1;
}
//使用函数指针作为函数的参数
int change(int num, int (*pf)(int) ) {
return (*pf)(num);
}
int main() {
//把函数传进去
cout << change(5, m) << endl;
return 0;
}