问题描述
|
我想通过使用初始化语句来实现数组对象的初始化,如下所示。
TestClass array[5] = {
TestClass(\"test1\"),TestClass(\"test2\"),TestClass(\"test3\"),TestClass(\"test4\"),TestClass(\"test5\")
};
根据一些权威书籍,如ARM(带注释的参考手册)中的C ++,似乎说这是初始化具有构造函数/析构函数的对象数组的方法。在此之后,我刚刚创建了以下示例代码,然后看看会发生什么。
#include <iostream>
#include <sstream>
#include <string>
class TestClass
{
public:
TestClass(const char* name) : name_(name)
{
std::cout << \"Ctor(const char*) : \" << name_ << std::endl;
}
~TestClass()
{
std::cout << \"Dtor() : \" << name_ << std::endl;
}
TestClass() : name_(\"\")
{
}
void print()
{
std::cout << \"obj:\" << name_ << std::endl;
}
private:
TestClass(const TestClass& rhs);
std::string name_;
};
int main()
{
TestClass array[5] = {
TestClass(\"test1\"),TestClass(\"test5\")
};
for (unsigned int i = 0; i < sizeof(array)/sizeof(array[0]); ++i) {
array[i].print();
}
return EXIT_SUCCESS;
}
至于第一次使用GNU GCC(4.1.2)编译上述源代码的尝试,由于生成如下内容而失败。
error: ‘TestClass::TestClass(const TestClass&)’ is private
因此,我知道这意味着为了允许对象数组初始化,将需要“复制构造函数”。然后,我尝试通过如下引入用户定义的(公共)副本构造函数来编译以上代码。
TestClass::TestClass(const TestClass& rhs) : name_(rhs.name_)
{
std::cout << \"copy Ctor : \" << name_ << std::endl;
}
我可以成功地编译源代码。但是,当我执行上面构建的程序时,得到以下输出。
Ctor(const char*) : test1
Ctor(const char*) : test2
Ctor(const char*) : test3
Ctor(const char*) : test4
Ctor(const char*) : test5
obj:test1
obj:test2
obj:test3
obj:test4
obj:test5
Dtor() : test5
Dtor() : test4
Dtor() : test3
Dtor() : test2
Dtor() : test1
我很想知道的是以下内容,
为什么我们不能将复制构造函数声明为私有?
为什么不调用用户定义的副本构造函数(我希望输出应该在某处包含\“ copy Ctor:xxxx \”。但是我无法理解。)因此,我了解到用户定义的副本构造函数尚未被使用调用。)
实际上,我不太确定以上内容是特定于GNU GCC还是C ++语言规范...如果您中的某些人可以为我提供以上内容的正确指针,将不胜感激。
解决方法
不论编译器是否使用复制构造函数,它都必须是可访问的-即它不能是私有的。在这种情况下,编译器可以通过直接使用const char *构造函数来避免使用复制构造函数,但仍需要可访问的复制ctor。这是ARM未涵盖的事情,已经过时了。
, 编译器将保留副本,但是副本构造函数仍然必须可访问。