在给函数使用原始变量时,更好的做法是什么:
unsigned long x = 4;
void func1(unsigned long& val) {
val = 5;
}
func1(x);
or:
void func2(unsigned long* val) {
*val = 5;
}
func2(&x);
勒夫:有什么理由选择一个而不是另一个吗?
在给函数使用原始变量时,更好的做法是什么:
unsigned long x = 4;
void func1(unsigned long& val) {
val = 5;
}
func1(x);
or:
void func2(unsigned long* val) {
*val = 5;
}
func2(&x);
勒夫:有什么理由选择一个而不是另一个吗?
当前回答
指针:
可以被分配为nullptr(或NULL)。 在调用站点,如果你的类型本身不是指针,你必须使用&, 显式地修改对象。 指针可以被反弹。
引用:
不能为空。 一旦被束缚,就无法改变。 调用者不需要显式地使用&。有时这被认为是 不好,因为你必须去函数的实现看看 完成参数的修改。
其他回答
如果你有一个参数,你可能需要指出没有一个值,通常的做法是使参数为指针值并传递NULL。
在大多数情况下(从安全角度来看),更好的解决方案是使用boost::可选。这允许您通过引用传递可选值,也可以作为返回值。
// Sample method using optional as input parameter
void PrintOptional(const boost::optional<std::string>& optional_str)
{
if (optional_str)
{
cout << *optional_str << std::endl;
}
else
{
cout << "(no string)" << std::endl;
}
}
// Sample method using optional as return value
boost::optional<int> ReturnOptional(bool return_nothing)
{
if (return_nothing)
{
return boost::optional<int>();
}
return boost::optional<int>(42);
}
通过const引用传递,除非有原因你希望改变/保留你传递的内容。
在大多数情况下,这将是最有效的方法。
确保对不想更改的每个形参都使用const,因为这不仅可以防止您在函数中做一些愚蠢的事情,还可以很好地向其他用户指示函数对传入的值做了什么。这包括当你只想改变所指向的对象时,创建一个const指针…
指针
A pointer is a variable that holds a memory address. A pointer declaration consists of a base type, an *, and the variable name. A pointer can point to any number of variables in lifetime A pointer that does not currently point to a valid memory location is given the value null (Which is zero) BaseType* ptrBaseType; BaseType objBaseType; ptrBaseType = &objBaseType; The & is a unary operator that returns the memory address of its operand. Dereferencing operator (*) is used to access the value stored in the variable which pointer points to. int nVar = 7; int* ptrVar = &nVar; int nVar2 = *ptrVar;
参考
A reference (&) is like an alias to an existing variable. A reference (&) is like a constant pointer that is automatically dereferenced. It is usually used for function argument lists and function return values. A reference must be initialized when it is created. Once a reference is initialized to an object, it cannot be changed to refer to another object. You cannot have NULL references. A const reference can refer to a const int. It is done with a temporary variable with value of the const int i = 3; //integer declaration int * pi = &i; //pi points to the integer i int& ri = i; //ri is refers to integer i – creation of reference and initialization
考虑一下c#的out关键字。编译器要求方法的调用者将out关键字应用于任何out参数,即使它已经知道它们是否存在。这是为了提高可读性。尽管在现代ide中,我倾向于认为这是语法(或语义)突出显示的工作。
指针:
可以被分配为nullptr(或NULL)。 在调用站点,如果你的类型本身不是指针,你必须使用&, 显式地修改对象。 指针可以被反弹。
引用:
不能为空。 一旦被束缚,就无法改变。 调用者不需要显式地使用&。有时这被认为是 不好,因为你必须去函数的实现看看 完成参数的修改。