相关疑难解决方法(0)

754
推荐指数
22
解决办法
55万
查看次数

深拷贝与浅拷贝

可能重复:
深拷贝和浅拷贝之间有什么区别?

深拷贝和浅拷贝之间有什么区别.复制构造函数的副本是什么类型的?

c++ clone

52
推荐指数
2
解决办法
13万
查看次数

包含其他对象的类的C++隐式复制构造函数

我知道如果你没有自己实现,编译器有时会提供一个默认的复制构造函数.我很困惑这个构造函数到底是做什么的.如果我有一个包含其他对象的类,其中没有一个具有声明的复制构造函数,那么行为是什么?例如,像这样的类:

class Foo {
  Bar bar;
};

class Bar {
  int i;
  Baz baz;
};

class Baz {
  int j;
};
Run Code Online (Sandbox Code Playgroud)

现在,如果我这样做:

Foo f1;
Foo f2(f1);
Run Code Online (Sandbox Code Playgroud)

默认的复制构造函数会做什么?将编译器生成的复制构造函数Foo调用编译器生成的构造函数Bar进行复制bar,然后调用编译器生成的复制构造函数Baz吗?

c++ contains composition default-copy-constructor

47
推荐指数
2
解决办法
3万
查看次数

为什么const变量可以修改?

我正在编写一本关于运算符重载的示例教科书,它让我想知道返回"常量值"(例如operator+).据我了解,如果我作为a返回任何内容const,则以后无法修改.说我有这个粗略的例子:

#include <iostream>
using namespace std;

class Temp {
    private:
        int val;
    public:
        Temp(){};

        Temp(int v):val(v){};

        const Temp operator+(const Temp& rhs) const {
            return Temp(this->val + rhs.val);
        }
        int getVal() { return this->val; }
        void setVal(int v) { this->val = v; } 
};

int main() {
    Temp t1, t2, t3;
    t1 = Temp(4);
    t2 = Temp(5);
    t3 = t1 + t2;
    cout << t3.getVal() << endl;
    t3.setVal(100);
    cout << t3.getVal() << endl;
}
Run Code Online (Sandbox Code Playgroud)

之后t3 = …

c++ operator-overloading

4
推荐指数
1
解决办法
224
查看次数

std :: containers调用的复制构造函数是否包含复制构造函数?

包含对象指针的任何std :: container(特别是std :: queue)的复制构造函数是否调用成员的复制构造函数以允许深层复制,或者它是否对指针值执行浅复制?

例:

/*******************************************************************************
 * <summary>
 *  Initializes a new instance of the EventHandler class.
 * </summary>
 *
 * <param name="handler">The handler to copy.</param>
*******************************************************************************/
EventHandler::EventHandler(const EventHandler& handler) : _eventQueue(handler._eventQueue) { }
Run Code Online (Sandbox Code Playgroud)

_eventQueue声明为:std::queue<Event*> _eventQueue;其中Event是具有复制构造函数的Base类,并且具有多个具有自己的复制构造函数的派生类.

PS:我喜欢AtomineerUtilsVisualAssistX(尤其是合并时!:D)

编辑:

鉴于下面的答案,这是一个正确的方式来创建原件的副本,使原件未经修改或复制是否与原件相反(简单的修复,但仍然是一个重要的区别)?

EventHandler::EventHandler(const EventHandler& handler) {
    for(size_t i = 0; i < handler._eventQueue.size(); ++i) {
        this->_eventQueue.push(new Event(handler._eventQueue._Get_container().at(i)));
    }
}
Run Code Online (Sandbox Code Playgroud)

c++ containers std deep-copy copy-constructor

1
推荐指数
1
解决办法
1954
查看次数