灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:3862回复:1

[C++技术]关于C++ 一些参数传递技巧及建议及局部静态函数

楼主#
更多 发布于:2013-11-05 12:53
1 只有正式参数是引用变量的时候,才是直接修改传递的变量,其他情况都只是传递一份copy(包括指针情况)。
引用参数不予许传递常量参数
[cpp]
void update(float& i);  
  
void g(double d, float r)  
{  
update(2.0f); //  错误,不能是常量参数  
update(r); // OK  
update(d); // 错误,要求类型转换!  
}  
可以修改为void update( const float& i);就没问题了。第二个错误也不会出现了,这是编译器允许的。
2 对于数组,使用引用参数的主要目的是应用在模板中,这样可以从中推算出数组元素的数量:
我们一般传递数组参数都是用两个参数,数组名字和元素个数,但是如下面例子这样就不需要两个参数也可以传递数组了:
[cpp]
template<class T, int N> void f(T(&r)[N])  
{  
    // ...  
}  
    int a1[10];  
    double a2[100];  
void g()  
{  
    f(a1); // T is int; N is 10  
    f(a2); // T is double; N is 100  
}  
 
如何传递参数呢?书中建议:
[1] Use pass-by-value for small objects.对于小对象(指int,double这些对象)使用值传递
[2] Use pass-by-const-reference to pass large values that you don’t need to modify.对于不需要修改的大值(指自定义的类对象)使用常量引用变量参数。
[3] Return a result as a return value rather than modifying an object through an argument.使用返回值优先于使用参数传递修改对象值。
[4] Use rvalue references to implement move  and forwarding 使用右值引用变量参数传递,执行移动和转发功能。右值参数传递如:void f(vector<int>&&);两个&号
[5] Pass a pointer if ‘‘no object’’ is a valid alternative (and represent ‘‘no object’’ by nullptr).要考虑无对象情况,那么使用指针,等于NULL代表无对象,C++11使用nullptr
[6] Use pass-by-reference only if you have to.必要时才使用引用变量参数传递。
3 使用局部静态函数:
好处是不会引起命名冲突,限制于局部使用,其他地方无法使用,而且有全局函数的行为特征。
[cpp]  
<p>#include<iostream></p><p>using namespace std;</p><p>void f(int a)  
{  
  while (a--) {  
  static int n = 0; // initialized once  
  int x = 0; // initialized ’a’ times in each call of f()  
  cout << "n == " << n++ << ", x == " << x++ << '\n';  
 }  
}  
int main()  
{  
 f(3);  
 //cout<<n<<endl;这里无法访问n。  
 return 0;  
}</p>  
结果是:
n == 0, x == 0
n == 1, x == 0
n == 2, x == 0

喜欢0 评分0
天天向上
新手上路
新手上路
  • 注册日期2013-11-23
  • 发帖数13
  • QQ373526679
  • 火币54枚
  • 粉丝0
  • 关注0
  • 最爱沙发
沙发#
发布于:2013-11-23 15:24
嗯 多发些这种知识帖,别太大,小小的几个知识点,很好。第一次沙发。

Do something today that your future self will thank you for.
回复(0) 喜欢(0)     评分
游客

返回顶部