本篇博客我简单地总结两条C++中安全地写只读函数的形参的办法。
我认为的只读函数:除了该函数本身的一些功能实现代码外,不含有任何对形参do事情的代码的函数,也即只对形参进行访问(读取)操作的函数,我把该类型的函数称之为只读函数。
一、对于非指针类型的变量(包括int/float/double等内置数据类型以及self-define的自定义类型)
用:const typeName& variableName 来do传参
(其实,本质上引用也是用指针常量来写的,因此上面这样传参就是传的常量指针常量了,非常地安全,妈妈再也不怕我在只读函数的函数体里面修改这个形参的值了!)
请看以下的例子代码:
int a = 1; double b = 2.1;
double add_a_and_b(const int& a,const double& b){//内置类型do只读函数的形参
return a + b;
}
cout << add_a_and_b(a,b) << endl;//result = 3.1
class Person{
public:
int m_Age;
public:
Person(const int& age):m_Age(age){}//内置类型do只读函数的形参
Person(const Person& p){//自定义类型do只读函数的形参
this->m_Age = p.m_Age;
}
}
二、对于指针类型的变量(包括int*/float*/double*等内置的指针数据类型以及self-define的自定义的指针类型)
用:const pointerTypeName* const pointerName 来do传参
(上面这样传参就是传的常量指针常量了,非常地安全,妈妈再也不怕我在只读函数的函数体里面修改这个形参的值了!)
请看以下的例子代码:
int a = 1;double b = 2.1;
int* pa = &a; double* pb = &b;
double add_pa_and_pb(const int* const pa,const double* const pb){
return *a + *b;//内置指针类型do只读函数的形参
}
cout << add_pa_and_pb(pa,pb) << endl;//result = 3.1
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode():val(0),left(nullptr),right(nullptr){}
TreeNode(int v) :val(v), left(nullptr), right(nullptr) {}
};
//打印输出二叉树节点值的函数
void myPrint(const TreeNode* const cur){//self-define指针类型do只读函数的形参
cout << cur->val << endl;
}
如果说有小伙伴对于常量指针,指针常量的知识不理解的话,可以翻阅我之前总结的学习笔记!
补充说明:
当然,对于内置的数据类型来说,你不用const修饰,直接用typeName variableName的方式传进去只读函数中也可以,也不至于降低你代码的效率,但是对于self-define自定义的类型的变量/对象来说,如果你简简单单地用 className variableName传参,将会涉及到该class的构造和析构函数的调用。如果你还用了多态来写代码时,那么只读函数中单单是传个形参都要涉及大量的类的构造和析构函数的调用,这样会大大降低你程序的运行成本和效率!因此,
对于内置的数据类型:
你大可以只用typeName variableName的方式传参进只读函数中。
对于self-define自定义的数据类型:
你就必须要用const pointerTypeName* const pointerName或者const typeName& variableName来传参进只读函数了!
本篇博客总结的知识点部分来自于《Effective C++》term20