什么是好的做法时,给人一种功能的原始变量工作:

unsigned long x = 4;

void func1(unsigned long& val) {
     val = 5;            
}
func1(x);

或者:

void func2(unsigned long* val) {
     *val = 5;
}
func2(&x);

IOW:是否有任何理由选择一个比另一个?

有帮助吗?

解决方案

我的经验法则是:

如果你想用它们进行指针运算(例如,递增指针地址以逐步执行数组),或者你必须传递NULL指针,请使用指针。

否则使用参考文献。

其他提示

我真的认为你将会从中受益建立的下列功能叫编码指南:

  1. 在所有其他地方,总是 const-正确的。

    • 注:这意味着,除其他事项外,只有出价值(见项目3)和价值传递的价值(见项目4)可缺少的 const 说明符。
  2. 只有通过一价值通过的指针,如果价值0/NULL是一个有效的输入,在目前上下文中。

    • 理由1:作为 一个呼叫, 你看,无论你通过 必须 在可用的状态。

    • 理由2:作为 , 你知道什么来 在可用的状态。因此,没有空-检查或差错处理需要作用,值。

    • 理由3:原则1和2将 编译器强制执行.总是捉错误,在编制时间如果可以的话。

  3. 如果一个函数是一个值,然后通过它的参考。

    • 理由:我们不想打破的项目2...
  4. 选择"通过价值"在"通常量参考"如果价值是POD(普通老Datastructure 的)或者小型足够的(存储器聪明-)或以其他方式够便宜(时间上)复制。

    • 理由:避免不必要的副本。
    • 注: 足够小的足够便宜 不绝对不好缺少计量标准又不理.

这最终会成为主观的。到目前为止的讨论很有用,但我认为没有正确或果断的答案。很大程度上取决于风格指南和当时的需求。

虽然使用指针有一些不同的功能(无论是否可以为NULL),但输出参数的最大实际差异纯粹是语法。 Google的C ++风格指南( https://google.github.io/styleguide/cppguide.html#例如,Reference_Arguments )仅指定输出参数的指针,并且仅允许const的引用。推理是可读性:具有值语法的东西不应该具有指针语义。我并不是说这必然是对或错,但我认为这是一个风格问题,而不是正确性。

如果要修改变量的值,则应传递指针。 尽管技术上传递引用或指针是相同的,但在用例中传递指针更具可读性,因为它“广告”了该值将由函数更改的事实。

如果你有一个参数,你可能需要指出缺少一个值,通常的做法是使参数成为指针值并传入NULL。

在大多数情况下(从安全角度来看)更好的解决方案是使用提升::可选。这允许您通过引用传递可选值,也可以作为返回值。

// 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);
}

指针

  • 一指针是一个变量,拥有记忆的地址。
  • 指针宣言》中包括的一个基本类型、*和变量名称。
  • 指针可以指以任何数量的变量生
  • 指针,目前并不指向一个有效的存储位置给出的价值null(其零)

    BaseType* ptrBaseType;
    BaseType objBaseType;
    ptrBaseType = &objBaseType;
    
  • 这是一元的操作者返回存储地址的其操作数。

  • 取消引用操作员(*)用于访问的价值存在的可变其指针指向。

       int nVar = 7;
       int* ptrVar = &nVar;
       int nVar2 = *ptrVar;
    

参考

  • 基准(&)是喜欢别名现有的变量。

  • 基准(&)就像是一个指定自动取消引用的.

  • 它通常用于功能的参数清单和功能返回值。

  • 基准必须被初始化时,它创建的。

  • 一旦参考初始化为对象,就不能将改为提及另一个对象。

  • 你不能拥有空的参考。

  • Const参考可以参考const int。这样做是与一个临时变量与价值的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
    

enter image description here

enter image description here

引用是一个隐式指针。基本上,您可以更改引用指向的值,但不能将引用更改为指向其他内容。所以我的2美分是,如果您只想更改参数的值,请将其作为参考传递,但如果您需要将参数更改为指向其他对象,请使用指针传递它。

考虑C#的out关键字。编译器要求方法的调用者将out关键字应用于任何out args,即使它已经知道它们是否存在。这旨在增强可读性。虽然使用现代IDE,我倾向于认为这是语法(或语义)突出显示的工作。

通过const引用,除非您有理由更改/保留您传入的内容。

在大多数情况下,这将是最有效的方法。

确保在您不希望更改的每个参数上使用const,因为这不仅可以保护您不会在函数中做一些愚蠢的事情,而且可以向其他用户提供一个很好的指示,该函数对传入的值执行的操作。这包括当你只想改变指向...的什么时,制作指针const。

指针:

  • 可以分配 nullptr (或 NULL).
  • 在呼叫的网站必须使用 & 如果你的类型不是指自己, 使得明确要修改对象。
  • 指针可能反弹。

参考文献:

  • 不能空。
  • 一旦结,不能改变。
  • 呼叫者不需要明确使用 &.这被认为是有时 不好因为你必须去的执行情况的功能来看看 你的参数进行修改。

引用类似于指针,除了您不需要使用前缀&#8727;访问引用引用的值。另外,在初始化之后,不能引用引用不同的对象。

引用对于指定函数参数特别有用。

有关详细信息,请参阅“A Tour of C ++”。通过“Bjarne Stroustrup” (2014)第11-12页

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top