c++ - 类对象的 vector 是如何初始化的

标签 c++ vector

下面的代码有一个 Screen 类。含成员:光标位置、屏幕宽度、屏幕高度和屏幕内容。它有另一个类 Window_mgr,其中列表是屏幕的集合。每个屏幕在 vector 中都有一个特定的位置。 我会用箭头标出代码中的行,这样你就不需要浏览完整的代码了。

我的问题是,当我们列出初始化 vector (假设为 int)时,我们只需通过以下方式做到这一点:

std::vector<int> ivec{1, 2, 3, 4};

但在下面的代码中,我正在初始化对象类型 Screen 的 vector 。这是什么意思:

VECTOR screens = VECTOR{ {Screen(24, 80, ' '), Screen(32, 56, 'r') }};

我只是在谈论列表初始化中的成员。即 Screen(24, 80, ' ') 和 Screen(32, 56, 'r')。他们是否调用 Screen 类的构造函数版本?如何在不创建对象的情况下调用构造函数。在我看来应该是:

{Screen sr1(24, 80, ' '), Screen sr2(32, 56, 'r')}

或者只是

{(24, 80, ' '), (32, 56, 'r')}

我在互联网上进行了搜索,但无法理解这个概念。谢谢

#include <iostream>
#include <string>
#include <vector>

class Screen{
public:
    using pos = std::string::size_type; 

    Screen() = default; 
    Screen(pos ht, pos wd, char c) : 
        height(ht), width(wd), contents(ht *wd, c)  //in-class initializer
    {}

    char get() const { return contents[cursor]; }
    inline char get(pos ht, pos wd) const;

    Screen &set(char);
    Screen &set(pos, pos, char);

    Screen &move(pos r, pos c); 

    void some_member() const; 

private:
    pos cursor = 0; 
    pos height = 0, width = 0; 
    std::string contents; 
    mutable size_t access_ctr;
};


inline Screen &Screen::set(char c)
{
    contents[cursor] = c; 
    return *this; 
}

inline Screen &Screen::set(pos r, pos c, char ch)
{
    contents[r*width + c] = ch; 
    *this; 
}


void Screen::some_member() const
{
    ++access_ctr; 
}

inline Screen &Screen::move(pos r, pos c)
{
    pos row = r *width; 
    cursor = row + c; 
    return *this;
}

char Screen::get(pos r, pos c) const
{
    pos row = r * width;  
    return contents[row + c];
}    

//---------------------------------
class Window_mgr{
private:
    using VECTOR = std::vector<Screen> ;
    // A Window Manager has has one standard sized blank Screen
    VECTOR screens = VECTOR{ {Screen(24, 80, ' '), Screen(32, 56, 'r') }};  // <-----------------

};
//---------------------------------

int main()
{
    Screen scr{13, 33, 'c'};

    std::cout << scr.get(3, 1); 

    Window_mgr win{}; 


    return 0; 
}

最佳答案

在 C++ 中,通过方法调用构造类的实例是完全有效的(实质上是创建类的匿名实例)。所以语法

VECTOR{ {Screen(24, 80, ' '), Screen(32, 56, 'r') }}

正在用 Screen 的两个实例初始化一个 VECTOR。它还将它们的生命周期绑定(bind)到 VECTOR 的生命周期,而无需复制;它们可以安全地移动,因为它们的范围只是构造函数调用。

关于c++ - 类对象的 vector 是如何初始化的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28727302/

相关文章:

c++ - 为什么我不能从另一个函数中调用匿名命名空间中的函数?

c++ - 将 CSV 文件写入 vector

c++ - Windows调用的DLL与主应用程序如何通信?

c++ - 在 C 中使用 C++ 类

c++ - vc++ 中出现运行时错误,但 gcc 中没有

c++ - 运行时检查失败 #2 - 变量周围的堆栈已损坏 C++

c++ - 静态数组的动态数组

c++ - 在不创建拷贝的情况下访问作为 vector 成员的 map 元素

java - Android如何监控app占用内存

c++ - 通过名称访问结构变量