C++ 复制构造函数形参必须是const吗?等3个问题

下例中,复制构造函数如果不加const会出错,error C2558: class 'Asdf' : no copy constructor available or copy constructor is declared 'explicit'。
(1)我传的asd1不是个临时对象,为什么需要const?
(2)看不出复制构造函数为什么效率比移动构造函数低。
(3)我想把对象本身加到vector中,但是不能以引用形式传?只能用指针?
用的是VS2010的编译器。
求大神详解。谢谢。

#include <iostream>
#include <vector>

using namespace std;

class Asdf
{
public:
    Asdf()
    {
        cout << "Constructor." << endl;
    }

    Asdf(Asdf & asdf1)                //(1)
    {
        cout << "Copy Constructor." << endl;
    }

    Asdf(Asdf && asdf1)           //(2)
    {
        cout << "Move Constructor." << endl;
    }
    int aa;
};

int main()
{
    /*
    vector<Asdf *> vector1;               //(3)
    Asdf * asd1 = new Asdf();
    asd1->aa = 9;
    vector1.push_back(asd1);
    asd1->aa = 10;
    cout << vector1[0]->aa << endl;
    */
    vector<Asdf> vector1;
    Asdf asd1;
    asd1.aa = 9;
    cout << &asd1 << endl;
    vector1.push_back(asd1);                      //(1)
    vector1.push_back(move(asd1));               //(2)
    asd1.aa = 10;
    cout << vector1[0].aa << endl;

    return 0;
}

4个回答

不一定,这个跟编译器有关。。。。。。。。。。。。。。。

Bra_Hancock
Bra_Hancock VS2010的 应该是标准的编译器吧
2 年多之前 回复

http://blog.csdn.net/comhaqs/article/details/38417575



C++11 核心语言功能 


Visual Studio 2010 


Visual Studio 2012 


Visual Studio 2013


右值引用 0.1 版、1.0 版、2.0 版、2.1 版、3.0 版 

2.0 版 

2.1* 版 

2.1* 版 


第一个问题好像是因为你下面定义了vector vector1;而这需要Asdf类中有一个接受const引用的拷贝构造函数。如果没有定义vector,拷贝构造函数像你那样定义是可疑的。
第二个是用了右值引用,省去了一次临时变量开辟空间的时间
第三个,引用是要在初始化时候赋值的,vector当然不能放引用。

Bra_Hancock
Bra_Hancock 回复栗悟饭和龟仙人: 以下理解不知道对不对:“类中有成员是new出空间的情况,如果想做深copy就写个copy构造函数用new开空间,如果想做浅copy就写个move构造函数”
2 年多之前 回复
Druning
栗悟饭和龟仙人 回复栗悟饭和龟仙人: 第二点说错了,vector里面要保留一份对象的拷贝,所以用移动构造函数貌似不会有性能上的提升。
2 年多之前 回复
Druning
栗悟饭和龟仙人 回复Bra_Hancock: 第二点,直接传递参数到函数体时,会有一次实参到形参的拷贝。第三点,vector<Asdf &> vector1;这种定义是不行的吧,如果没记错的话。
2 年多之前 回复
Bra_Hancock
Bra_Hancock 对于(2),即使是左值引用,也是对象本身作参数,函数体内也没有多余的操作啊;对于(3),我写的是vector<Asdf &> vector1;,后面push_back(asd1),这种写法如果是个普通的函数都是可以的,但是在这里就不行。
2 年多之前 回复
 Asdf(Asdf && asdf1) 

 && 称为逻辑与运算符。如果两个操作数都非零,则条件为真。 
Bra_Hancock
Bra_Hancock 这是右值引用……
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问