【C++总结】函数形参,返回const对象与非const对象,成员函数,函数指针

非引用形参

//交换函数,传递的实参只是参数的副本。并不能起到交换作用
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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值