C++中关于形参带不带*的问题。。。。

来源:百度知道 编辑:UC知道 时间:2024/05/29 01:51:27
setUsername(String* username)
setUsername(String username)

两者有什么区别?分别在什么情况下适用?

setUsername(String* username)
接受一个指向String类的指针,在C中按指针传递往往是为了节约程序对系统资源的开销,让程序跑的更快,如果使用setUsername(String username),那么setUsername在接受该参数时会复制传入如象String 的一份拷贝,而如果String是一个很大的结构的话,这个复制的过程将会大大增加程序对内存及其他资源的开销,在C++中更好的方法是按引用传递,这样又节约了一个指针的开销。

传递原则:
在C++中如果不对传入的对象做任何更改的话应该使用按const引用传递,如 void func(const int& a);

如果要做任何改动的话就使用按引用传递,如void func(int& a);

如果函数的返回值不能作为左值的话就应该返回一个const或者const 引用,如
const int& func(const int& a){return a;}
或者
const int func(const int& a){int temp = a;return temp++;}
这样就避免了func(a)=b的写法;

如果类的成员函数不对类的数据成员做任何更改的话就应该将函数声明为const函数如:
const int& func(const int&a)const;

归纳:在C++中,函数参数的传递首先考虑按引用传递,其次是在任何你可以使用指针的地方尽量避免使用并思考用其他的方法替换,Koenig & Moo 夫妇在为想成为更好的 C++ 程序员的人提出的3条建议中第1条就是"避免使用指针",你相信吗?指针正是 C 的核心呀。C 的宏、位运算、结构、联合、数组、强制类型转换、指针,在 C++ 程序中都应该尽量避免(在少量涉及底层的程序设计中例外),C++ 语法上强调的是类、对象、模板、标准库、引用、异常和 const 关键字,思想上强调的是面向对象和泛型。