【问题标题】:What is the difference between constant and constant reference argument常量和常量引用参数有什么区别
【发布时间】:2016-08-24 14:50:38
【问题描述】:

我见过很多人将他们的函数参数设置为:

function(const myType &myObj)

我不明白他们为什么在类型后面使用&

看来const 足以阻止构造函数被调用。

因此,我编写了以下代码,但我认为结果没有任何优势。谁能解释一下?

#include <iostream>
using namespace std;

class myclass
{
public:

    myclass()
    {
        cout<<"constructor is called\n";
    }

    int field;
};

void func1(myclass a)
{
    cout<<"func1: "<<a.field<<"\n";
}


void func2(const myclass a)
{
    cout<<"func2: "<<a.field<<"\n";
}


void func3(const myclass &a)
{
    cout<<"func3: "<<a.field<<"\n";
}

int main ()
{
    myclass obj;
    obj.field=3;
    cout<<"----------------\n";
    func1(obj);
    cout<<"----------------\n";
    func2(obj);
    cout<<"----------------\n";
    func3(obj);
    cout<<"----------------\n";
    return 0;
}

结果:

constructor is called
----------------
func1: 3
----------------
func2: 3
----------------
func3: 3
----------------

【问题讨论】:

标签: c++ c++11 constructor constants


【解决方案1】:

因此,我编写了以下代码,但我认为结果没有任何优势。谁能解释一下?

问题是你从来没有设置你的复制构造函数来输出任何东西来查看是否复制了。如果我们添加

myclass( const myclass & foo) : field(foo.field)
{
    cout<<"copy constructor is called\n";
}

输出将是

constructor is called
----------------
copy constructor is called
func1: 3
----------------
copy constructor is called
func2: 3
----------------
func3: 3
----------------

Live Example

如您所见,如果您不通过引用,则会复制。


唯一的区别

void func1(myclass a)

void func2(const myclass a)

在第二个示例中,aconst。不过,确实没有理由这样做;既然是副本,改不改也没关系。如果你有一个可以使用 const 对象的函数,那么我建议通过 const &amp; 来避免复制,只要复制比引用更昂贵(非 pod 类型,它大于指针的大小)。

【讨论】:

  • 这对优化很重要。
  • 对于通过引用传递的原始类型可能比复制慢
  • @NathanOliver,您是否要我列举在恒定上下文中可能发生的所有优化?
【解决方案2】:

添加类成员:

myclass(myclass const &)
{
    cout<<"copy constructor is called\n";
}

~myclass()
{
    cout<<"destructor is called\n";
}

然后,在检查新输出后,重新评估您对 &amp; 的影响的立场。

【讨论】:

    【解决方案3】:

    似乎 const 足以阻止构造函数被调用。

    如果您只使用const 而没有使用&amp;,则会调用复制构造函数。使用const &amp; 保证不会生成新的对象副本。

    正如下面的 cmets 所指出的:您看不到输出的原因是因为您从未记录过调用复制构造函数。将 print 放入类的析构函数中可能会更好地查看效果。

    【讨论】:

    • 你的大部分答案都是关于复制省略,这与这个问题完全没有关系
    猜你喜欢
    • 2012-10-22
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 2011-01-14
    • 2011-01-04
    • 2011-03-14
    • 2011-05-27
    相关资源
    最近更新 更多