Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c++;返回实例变量的方法可以访问变量中的数据,但不能更改它,但编译时不会生成错误 我已经15年没有做过任何C++编程了,所以我有点生疏了。 我注意到,返回实例变量的C++方法可以访问变量中的数据,但不改变它,但是在编译时没有用G++生成错误。我在下面附上了一个简单的例子来说明这种行为。返回实例变量的函数的返回可用于访问ivar中的信息,但当返回用于更改ivar时(例如,anA.aVec().push_back(100);),ivar不会更改_C++_Function_Return Value_Instance Variables - Fatal编程技术网

c++;返回实例变量的方法可以访问变量中的数据,但不能更改它,但编译时不会生成错误 我已经15年没有做过任何C++编程了,所以我有点生疏了。 我注意到,返回实例变量的C++方法可以访问变量中的数据,但不改变它,但是在编译时没有用G++生成错误。我在下面附上了一个简单的例子来说明这种行为。返回实例变量的函数的返回可用于访问ivar中的信息,但当返回用于更改ivar时(例如,anA.aVec().push_back(100);),ivar不会更改

c++;返回实例变量的方法可以访问变量中的数据,但不能更改它,但编译时不会生成错误 我已经15年没有做过任何C++编程了,所以我有点生疏了。 我注意到,返回实例变量的C++方法可以访问变量中的数据,但不改变它,但是在编译时没有用G++生成错误。我在下面附上了一个简单的例子来说明这种行为。返回实例变量的函数的返回可用于访问ivar中的信息,但当返回用于更改ivar时(例如,anA.aVec().push_back(100);),ivar不会更改,c++,function,return-value,instance-variables,C++,Function,Return Value,Instance Variables,澄清;为什么anA.aVec().size()有效,而anA.aVec().push_back(100)无效?类似地,为什么anA.aB().i()起作用,而anA.aB().setI()不起作用 我可以解决这个问题,但我想知道: 这种行为在编译器中是一致的吗 GCC中是否有警告此问题的错误或警告标志 行为背后的根本原因和/或理由是什么 这是我的密码: #include <cstdlib> #include <vector> using namespace std;

澄清;为什么
anA.aVec().size()
有效,而
anA.aVec().push_back(100)
无效?类似地,为什么
anA.aB().i()
起作用,而
anA.aB().setI()
不起作用

我可以解决这个问题,但我想知道:

  • 这种行为在编译器中是一致的吗
  • GCC中是否有警告此问题的错误或警告标志
  • 行为背后的根本原因和/或理由是什么 这是我的密码:

    #include <cstdlib>
    #include <vector>
    
    using namespace std;
    
    class B{
        int _i = 0;
    
    public:
        B(void){ }
        int i(void){return _i;}
        void setI(int anInt){ _i = anInt; }
    };
    
    class A{
        vector<int> _aVec;
        B _aB;
    
    public:
        vector<int> aVec(void){ return _aVec; }
        B aB(void){ return _aB; }
        void pushBack(int anInt){ _aVec.push_back(anInt);}
        void setBI(int i){ _aB.setI(i); }
    };
    
    int main(int argc, char** argv) {
        int rows = 10;
        int cols = 8;
        srand(time(NULL));
    
        A anA;
        cout << "aVec size:" << anA.aVec().size() << "\n";
        anA.aVec().push_back(100);
        cout << "aVec size:" << anA.aVec().size() << "\n";
        anA.pushBack(100);
        cout << "aVec size:" << anA.aVec().size() << "\n";
    
        cout << "Bi:" << anA.aB().i() << "\n";
        anA.aB().setI(1);
        cout << "Bi:" << anA.aB().i() << "\n";
        anA.setBI(1);
        cout << "Bi:" << anA.aB().i() << "\n";
    
        return 0;
    }
    
    anA.aVec()

    将其更改为返回引用以避免创建副本:

    vector<int> & aVec(void){ return _aVec; }
    
    vector&aVec(void){return\u aVec;}
    
    anA.aVec()。push_back(100)
    不“工作”,因为
    aVec
    方法返回向量的副本

    将其更改为返回引用以避免创建副本:

    vector<int> & aVec(void){ return _aVec; }
    
    vector&aVec(void){return\u aVec;}
    
    为什么
    anA.aVec().size()
    有效,而
    anA.aVec().push_back(100)
    无效?
    类似地,为什么
    anA.aB().i()
    起作用,而
    anA.aB().setI()
    不起作用

    anA.aVec()
    anA.aB()
    按值返回对象。对象的副本将返回给调用函数

    anA.aVec().size()
    anA.aB().i()
    工作,因为它们只是返回一条信息

    anA.aVec().push_back(100)
    anA.aB().setI()
    也可以工作,但它们修改的是临时对象,而不是作为
    anA
    成员变量的对象

    为什么
    anA.aVec().size()
    有效,而
    anA.aVec().push_back(100)
    无效?
    类似地,为什么
    anA.aB().i()
    起作用,而
    anA.aB().setI()
    不起作用

    anA.aVec()
    anA.aB()
    按值返回对象。对象的副本将返回给调用函数

    anA.aVec().size()
    anA.aB().i()
    工作,因为它们只是返回一条信息

    anA.aVec().push_back(100)
    anA.aB().setI()
    也可以工作,但它们修改的是临时对象,而不是作为
    anA
    成员变量的对象问题在于:

    vector<int> aVec(void){ return _aVec; }
    
    向量aVec(void){return\u aVec;}
    它返回一个_aVec的副本,所以只需在“vector”之后添加“&”,它将作为引用返回

    vector<int>& aVec(void){ return _aVec; }
    
    vector&aVec(void){return\u aVec;}
    
    问题在于:

    vector<int> aVec(void){ return _aVec; }
    
    向量aVec(void){return\u aVec;} 它返回一个_aVec的副本,所以只需在“vector”之后添加“&”,它将作为引用返回

    vector<int>& aVec(void){ return _aVec; }
    
    vector&aVec(void){return\u aVec;}
    
    谢谢大家(1201节目,安东·马利舍夫,R萨胡,迪克里)。我通过切换到指针来修复它,但是引用更干净……应该记住这一点。您不必在Python和Java中思考太多:-),谢谢大家(1201程序,Anton Malyshev,R Sahu,DiCri)。我通过切换到指针来修复它,但是引用更干净……应该记住这一点。您不必在Python和Java中考虑太多:-)。