Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
复制构造函数 我现在正在学习C++,我对警察复制构造函数中发生了什么失去了兴趣。我相信Gun的构造函数只接受整数,但如何将*(ref.pistol)赋值为参数呢?我认为*(ref.pistol)是一个Gun对象,而不是整数。_C++_Copy Constructor_Deep Copy - Fatal编程技术网

复制构造函数 我现在正在学习C++,我对警察复制构造函数中发生了什么失去了兴趣。我相信Gun的构造函数只接受整数,但如何将*(ref.pistol)赋值为参数呢?我认为*(ref.pistol)是一个Gun对象,而不是整数。

复制构造函数 我现在正在学习C++,我对警察复制构造函数中发生了什么失去了兴趣。我相信Gun的构造函数只接受整数,但如何将*(ref.pistol)赋值为参数呢?我认为*(ref.pistol)是一个Gun对象,而不是整数。,c++,copy-constructor,deep-copy,C++,Copy Constructor,Deep Copy,如果您自己没有显式声明一个副本构造函数,编译器总是隐式声明一个副本构造函数(尽管在某些情况下它可以被删除)。您感到困惑的那行调用了这个隐式声明的复制构造函数 这个隐式声明的复制构造函数是公共的,并且(如果使用它的话)它只是执行一个memberwise复制,也就是说,它就像您编写的 class Gun{ private: int bullet; public: Gun(int bnum) : bullet(bnum) { } }; class Police{ private:

如果您自己没有显式声明一个副本构造函数,编译器总是隐式声明一个副本构造函数(尽管在某些情况下它可以被删除)。您感到困惑的那行调用了这个隐式声明的复制构造函数

这个隐式声明的复制构造函数是公共的,并且(如果使用它的话)它只是执行一个memberwise复制,也就是说,它就像您编写的

class Gun{
private:
    int bullet;
public:
    Gun(int bnum) : bullet(bnum) { }
};

class Police{
private:
    Gun * pistol;
public:
    Police(int bNum) : {
        if(bNum>0)
            pistol = new Gun(bNum);
        else
            pistol=NULL;
    }
    Police(const Police& ref){
        pistol=new Gun(*(ref.pistol)); //Confused about this part.

    }
};

如果您自己没有显式声明一个副本构造函数,编译器总是隐式声明一个副本构造函数(尽管在某些情况下它可以被删除)。您感到困惑的那行调用了这个隐式声明的复制构造函数

这个隐式声明的复制构造函数是公共的,并且(如果使用它的话)它只是执行一个memberwise复制,也就是说,它就像您编写的

class Gun{
private:
    int bullet;
public:
    Gun(int bnum) : bullet(bnum) { }
};

class Police{
private:
    Gun * pistol;
public:
    Police(int bNum) : {
        if(bNum>0)
            pistol = new Gun(bNum);
        else
            pistol=NULL;
    }
    Police(const Police& ref){
        pistol=new Gun(*(ref.pistol)); //Confused about this part.

    }
};
我相信Gun的构造函数只接受整数,但如何将*(ref.pistol)赋值为参数呢?我认为*(参考手枪)是枪的物体,不是整数

你说得对,*(参考手枪)是枪,不是整数。 在C++中,你可以使用某些特殊的方法而不声明它们,编译器会为你生成一些(希望)合适的方法。复制构造函数就是其中之一

在警察的复制构造函数中,使用默认的枪复制构造函数创建了一个新的
,然后将其分配给
此->手枪

如果你想明确地说你想要默认的复制构造函数,你可以用Gun来写:

public:
    Gun(const Gun& other): bullet(other.bullet) {}
对于构造函数、析构函数、复制/移动构造函数和赋值运算符也同样适用

我相信Gun的构造函数只接受整数,但如何将*(ref.pistol)赋值为参数呢?我认为*(参考手枪)是枪的物体,不是整数

你说得对,*(参考手枪)是枪,不是整数。 在C++中,你可以使用某些特殊的方法而不声明它们,编译器会为你生成一些(希望)合适的方法。复制构造函数就是其中之一

在警察的复制构造函数中,使用默认的枪复制构造函数创建了一个新的
,然后将其分配给
此->手枪

如果你想明确地说你想要默认的复制构造函数,你可以用Gun来写:

public:
    Gun(const Gun& other): bullet(other.bullet) {}
这同样适用于构造函数、析构函数、复制/移动构造函数和赋值操作符。

*(ref.pistol)
正在访问
Gun
实例,因此代码试图调用
Gun
复制构造函数,但您尚未明确定义一个实例。您只定义了非默认的非复制构造函数,因此编译器可能会忽略创建默认的复制构造函数。您可以显式定义自己的复制构造函数,但:

Gun(const Gun& other) = default;
或者,在C++11及更高版本中:

class Gun{
private:
    int bullet;
public:
    Gun(int bnum) : bullet(bnum) { }
    Gun(const Gun& ref) : bullet(ref.bullet) { }
};
class Police{
private:
    Gun * pistol;
public:
    Police(int bNum) {
        if(bNum>0)
            pistol = new Gun(bNum);
        else
            pistol=NULL;
    }

    Police(const Police& ref) {
        if (ref.pistol)
            pistol=new Gun(*(ref.pistol));
        else
            pistol=NULL;
    }

    ~Police() {
        delete pistol;
    }
};
无论哪种方式,您都可以这样使用它(不要忘记
pistol
可以为空,因此您必须在
Police
复制构造函数中检查它):

并且不要忘记对复制分配操作符应用类似的逻辑(在处理手动深度复制实现时,不要忘记,以及C++11及更高版本中的规则5):

*(ref.pistol)
正在访问
Gun
实例,因此代码试图调用
Gun
复制构造函数,但您尚未明确定义一个。您只定义了非默认的非复制构造函数,因此编译器可能会忽略创建默认的复制构造函数。您可以显式定义自己的复制构造函数,但:

Gun(const Gun& other) = default;
或者,在C++11及更高版本中:

class Gun{
private:
    int bullet;
public:
    Gun(int bnum) : bullet(bnum) { }
    Gun(const Gun& ref) : bullet(ref.bullet) { }
};
class Police{
private:
    Gun * pistol;
public:
    Police(int bNum) {
        if(bNum>0)
            pistol = new Gun(bNum);
        else
            pistol=NULL;
    }

    Police(const Police& ref) {
        if (ref.pistol)
            pistol=new Gun(*(ref.pistol));
        else
            pistol=NULL;
    }

    ~Police() {
        delete pistol;
    }
};
无论哪种方式,您都可以这样使用它(不要忘记
pistol
可以为空,因此您必须在
Police
复制构造函数中检查它):

并且不要忘记对复制分配操作符应用类似的逻辑(在处理手动深度复制实现时,不要忘记,以及C++11及更高版本中的规则5):


=default
语法仅适用于C++11及更高版本。
=default
语法仅适用于C++11及更高版本。没有任何东西阻止自动生成Gun类的复制构造函数。请注意,OP并不是询问编译错误。他想知道为什么这段代码能工作,尽管事实上似乎没有复制构造函数。没有什么能阻止Gun类的复制构造函数的自动生成。请注意,OP并不是询问编译错误。他想知道为什么这段代码是有效的,尽管事实上似乎没有复制构造函数。谢谢你的澄清。只是另一个简单的问题,我意识到pistol是一个私有变量,但是为什么'ref.pistol'编译时没有任何错误?@JiLam感谢您的澄清。还有一个简单的问题,我意识到pistol是一个私有变量,但是为什么'ref.pistol'编译时没有任何错误?@JiLam