复制构造函数在这段代码中是如何工作的?
How does the copy constructor work in this code?
我一直在阅读 Bruce Eckel 的“Thinking in C++”并且遇到了复制构造函数。虽然我主要理解复制构造函数的必要性,但我对下面的代码有点困惑:
#include <iostream>
using namespace std;
class foo
{
static int objCount;
public:
foo()
{
objCount++;
cout<<"constructor :"<<foo::objCount<<endl;
}
~foo()
{
objCount--;
cout<<"destructor :"<<foo::objCount<<endl;
}
};
int foo::objCount=0;
int main()
{
foo x;
foo y = x;
return 0;
}
在上面的代码中,构造函数被调用一次,析构函数被调用两次。
这是我不明白的地方:
y
是class foo
的对象,为什么编译器不调用构造函数,然后将x
的内容复制到[=11] =]?
编译器提供的默认复制构造函数在这张图中的什么位置?
y is an object of class foo, so why doesn't the compiler call the constructor and then copy the contents of x into y?
确实如此。
它调用 copy 构造函数,正是为了做到这一点。
Where does the default copy-constructor provided by the compiler fit in this picture?
您没有提供自己的复制构造函数来生成任何输出,因此会调用自动生成的(不会)。
默认构造函数(看起来像 foo()
的构造函数)在复制过程中根本不会被调用。只有复制构造函数(看起来像 foo(const foo&)
的那个)。
每个构造只有 一个 构造函数。好吧,除非你使用委托构造函数,但我们改天再谈。
#include <iostream>
using namespace std;
class foo
{
static int objCount;
public:
foo()
{
objCount++;
cout<<"constructor :"<<foo::objCount<<endl;
}
foo(const foo&)
{
objCount++;
cout<<"copy constructor :"<<foo::objCount<<endl;
}
~foo()
{
objCount--;
cout<<"destructor :"<<foo::objCount<<endl;
}
};
int foo::objCount=0;
int main()
{
foo x;
foo y = x;
return 0;
}
// constructor :1
// copy constructor :2
// destructor :1
// destructor :0
- y is an object of class foo, so why doesn't the compiler call the
constructor and then copy the contents of x into y?
在这种情况下,它不调用构造函数,而是调用复制构造函数(您没有指定但编译器创建了它)。这里新建了一个对象y,所以需要构造(复制构造,因为你用的是其他对象x).
foo y = x;
- Where does the default copy-constructor provided by the compiler fit
in this picture?
您也可以查看this问题。有对编译器隐式创建的其他函数的解释。有时它可能会令人沮丧(尤其是当您使用原始指针时),因此您应该了解这些功能。
我一直在阅读 Bruce Eckel 的“Thinking in C++”并且遇到了复制构造函数。虽然我主要理解复制构造函数的必要性,但我对下面的代码有点困惑:
#include <iostream>
using namespace std;
class foo
{
static int objCount;
public:
foo()
{
objCount++;
cout<<"constructor :"<<foo::objCount<<endl;
}
~foo()
{
objCount--;
cout<<"destructor :"<<foo::objCount<<endl;
}
};
int foo::objCount=0;
int main()
{
foo x;
foo y = x;
return 0;
}
在上面的代码中,构造函数被调用一次,析构函数被调用两次。 这是我不明白的地方:
y
是class foo
的对象,为什么编译器不调用构造函数,然后将x
的内容复制到[=11] =]?编译器提供的默认复制构造函数在这张图中的什么位置?
y is an object of class foo, so why doesn't the compiler call the constructor and then copy the contents of x into y?
确实如此。
它调用 copy 构造函数,正是为了做到这一点。
Where does the default copy-constructor provided by the compiler fit in this picture?
您没有提供自己的复制构造函数来生成任何输出,因此会调用自动生成的(不会)。
默认构造函数(看起来像 foo()
的构造函数)在复制过程中根本不会被调用。只有复制构造函数(看起来像 foo(const foo&)
的那个)。
每个构造只有 一个 构造函数。好吧,除非你使用委托构造函数,但我们改天再谈。
#include <iostream>
using namespace std;
class foo
{
static int objCount;
public:
foo()
{
objCount++;
cout<<"constructor :"<<foo::objCount<<endl;
}
foo(const foo&)
{
objCount++;
cout<<"copy constructor :"<<foo::objCount<<endl;
}
~foo()
{
objCount--;
cout<<"destructor :"<<foo::objCount<<endl;
}
};
int foo::objCount=0;
int main()
{
foo x;
foo y = x;
return 0;
}
// constructor :1
// copy constructor :2
// destructor :1
// destructor :0
- y is an object of class foo, so why doesn't the compiler call the constructor and then copy the contents of x into y?
在这种情况下,它不调用构造函数,而是调用复制构造函数(您没有指定但编译器创建了它)。这里新建了一个对象y,所以需要构造(复制构造,因为你用的是其他对象x).
foo y = x;
- Where does the default copy-constructor provided by the compiler fit in this picture?
您也可以查看this问题。有对编译器隐式创建的其他函数的解释。有时它可能会令人沮丧(尤其是当您使用原始指针时),因此您应该了解这些功能。