相关疑难解决方法(0)

自动生成默认/复制/移动ctor和复制/移动赋值运算符的条件?

我想在编译器通常自动生成默认构造函数,复制构造函数和赋值运算符的条件下刷新内存.

我记得有一些规则,但我不记得了,也无法在网上找到有信誉的资源.有人可以帮忙吗?

c++ copy-constructor default-constructor move-constructor move-assignment-operator

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

我们何时必须使用复制构造函数?

我知道C++编译器为类创建了一个复制构造函数.在这种情况下,我们必须编写用户定义的复制构造函数吗?你能举一些例子吗?

c++ copy-constructor

80
推荐指数
4
解决办法
7万
查看次数

复制构造函数和默认构造函数

在为类定义复制构造函数时,是否必须显式定义默认构造函数?请说明原因.

例如:

class A 
{
    int i;

    public:
           A(A& a)
           {
               i = a.i; //Ok this is corrected....
           }

           A() { } //Is this required if we write the above copy constructor??
};      
Run Code Online (Sandbox Code Playgroud)

另外,如果我们为复制构造函数以外的类定义任何其他参数化构造函数,我们是否还必须定义默认构造函数?考虑上面没有复制构造函数的代码并替换它

A(int z)
{
    z.i = 10;
}
Run Code Online (Sandbox Code Playgroud)

Alrite ....看到答案后,我写了下面的程序.

#include <iostream>

using namespace std;

class X
{
    int i;

    public:
            //X();
            X(int ii);
            void print();
};

//X::X() { }

X::X(int ii)
{
    i = ii;
}


void X::print()
{
    cout<<"i = "<<i<<endl;
}

int main(void)
{ …
Run Code Online (Sandbox Code Playgroud)

c++ constructor copy

14
推荐指数
1
解决办法
2万
查看次数

何时在C++中生成默认构造函数

根据"Inside C++ Object Model",只有当以下四个条件中的任何一个为真时,编译器才会生成复制构造函数(如果程序员没有声明):

  1. 当类包含存在复制构造函数的类的成员对象时(由类设计器显式声明,如前一个String类的情况,或由编译器合成,如类Word的情况)

  2. 当类派生自存在复制构造函数的基类时(同样,显式声明或合成)

  3. 当类声明一个或多个虚函数时

  4. 当类派生自一个或多个基类是虚拟的继承链时

这意味着如果我有一个只有构造函数的类,那么编译器将不会提供复制构造函数.

让我们举一个例子:

class test
{
    test(){}
};
int main()
{
    test obj1;       //statement 1
    test obj2(obj1); //statement 2
}
Run Code Online (Sandbox Code Playgroud)

以上代码工作正常.现在问题来自我在类测试中添加以下行:

test(const test& rhs) = delete;
Run Code Online (Sandbox Code Playgroud)

"= delete"确保不会自动提供复制构造函数.添加上面的行后,我收到了声明2的错误Use of deleted function test::test(const test&).

我的问题是:根据"内部C++对象模型",我不需要上述类的复制构造函数,所以当我明确说不生成复制构造函数(使用删除)时,为什么会出现错误?因为我期望编译器不需要上面类的复制构造函数.

我使用的是gcc 4.6.3版.

c++

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