c ++中的类变量赋值

时间:2015-11-24 17:52:40

标签: c++

以下代码中的注释部分会打印一些不明确的值。

未注释的版本打印:

1:one

这意味着如果在将对象添加到向量之前为类变量赋值,则会打印指定的值。但是如果我在将对象添加到向量后分配值,则它不会打印指定的值。

#include<iostream>
#include<stdio.h>
#include<vector>
#include<string>

using namespace std;

class T
{

    public:
    string t;
    int n;

};

int main()
{
    /**
    std::vector<T>::iterator it;
    vector<T>li;
    it = li.begin();
    T t1;
    it = li.insert(it,t1);
    t1.n = 1;
    t1.t = "one";
    it = li.begin();
    T t2;
    it = li.insert(it+1,t2);
    it = li.begin();
    T t3;
    it = li.insert(it+2,t3);

    cout << li.at(0).n << ":" << li.at(0).t << endl;
    */
    std::vector<T>::iterator it;
    vector<T>li;
    it = li.begin();
    T t1;
    t1.n = 1;
    t1.t = "one";
    it = li.insert(it,t1);
    it = li.begin();
    T t2;
    it = li.insert(it+1,t2);
    it = li.begin();
    T t3;
    it = li.insert(it+2,t3);

    cout << li.at(0).n << ":" << li.at(0).t << endl;
}

对于Java,它不是那样的。相反,无论在将对象添加到向量之前还是之后分配成员变量,都将打印该值。如何实现类似Java的功能?

2 个答案:

答案 0 :(得分:1)

在行

T t1;
it = li.insert(it,t1);

你声明变量t1并将其副本插入向量中,但你做的是在插入之前初始化变量,这意味着副本在向量未初始化。

以后再做

cout << li.at(0).n << ":" << li.at(0).t << endl;

您在矢量中打印出未初始化副本的值,这会导致未定义行为。未初始化的局部变量的内容/值是 indeterminate 并且看起来是随机的。

完成 的复制后,

答案 1 :(得分:1)

C ++中的

structclass与其他类型的行为相同。它们只是一组类型。因此,当您声明T t1;时,编译器看到的几乎就像

// grouped together in the name `t1`
string t;
int n;

因此,当您在向量中发送t1时,它与Java中的int完全相同,它会复制它。

您可以对此做些什么?

有两种解决方案。您可以更改向量内的T的值,如下所示:

li[0] = {"aString", 23}

或者你可以插入指针。指针就像java中的对象一样。实际上,java中的对象是指针,但值是隐藏的。它看起来像这样:

vector<unique_ptr<T>> li;

// make unique is just a wrapper around the new to make a std::unique_ptr
li.emplace_back(make_unique<T>("aString", 23));

我真的建议您使用emplace_back而不是迭代器和insert。它将使您的代码更清晰,更快。