c++ - 数组对象初始化,其类具有一些 ctor/dtor

标签 c++ arrays constructor copy initialization

我想通过如下初始化语句实现数组对象的初始化。

TestClass array[5] = {
    TestClass("test1"),
    TestClass("test2"),
    TestClass("test3"),
    TestClass("test4"),
    TestClass("test5")
};

根据一些权威书籍如ARM (annotated reference manual) for 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("test2"),
        TestClass("test3"),
        TestClass("test4"),
        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

所以我理解这意味着为了允许对象数组初始化,它需要“复制构造函数”。然后我尝试通过如下引入用户定义(公共(public))复制构造函数来编译上述代码。

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

我想知道的是以下内容,

  1. 为什么我们不能将复制构造函数声明为私有(private)的?

  2. 为什么不调用用户定义的复制构造函数(我预计输出应该在某处包含“Copy Ctor:xxxx”。但我无法理解。所以我理解了用户定义的复制构造函数还没有被调用。)

实际上,我不太确定上面的内容是特定于 GNU GCC 还是 C++ 语言规范...如果你们中的一些人能给我关于上面内容的正确指示,我将不胜感激。

最佳答案

编译器省略了复制,但复制构造函数仍然必须是可访问的。

关于c++ - 数组对象初始化,其类具有一些 ctor/dtor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6176837/

相关文章:

c# - C# 构造函数线程安全吗?

c++ - 使用 malloc 分配比现有内存更多的内存

javascript - 如何在 Javascript 中对对象数组进行排序?

c++ - C++ 中的简单类概念(一副牌)

c++ - 在C++中重新声明数组

php - 将相同的元素压入数组 x 次

Java - 私有(private)内部类的对象作为外部类构造函数的参数

c++ - C++ 中的位集初始化

c++ - C++ 中的异常类不起作用

c++ - QtContainer 中的 QStackedWidget 中的双重删除