常量和常量引用参数之间有什么区别

时间:2016-04-29 12:29:39

标签: c++ c++11 constructor const

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

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
----------------

3 个答案:

答案 0 :(得分:7)

  

所以,我编写了以下代码,我发现结果没有优势。有人可以解释一下吗?

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

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 &来避免复制,只要复制比引用更昂贵(非pod类型,大于指针的大小。)

答案 1 :(得分:2)

  

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

如果仅使用const而不使用&,则调用复制构造函数。使用const &保证不会创建新的对象副本。

正如下面的评论中所指出的:您没有看到输出的原因是您从未记录过调用副本构造函数。将print打印在类的析构函数中可能是更好的想法来看到效果。

答案 2 :(得分:2)

添加班级成员:

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

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

然后,在检查新输出后,重新评估您对&的影响的位置。