【问题标题】:C++ Reference Confusions (and some copy constructor ones as well)C++ 参考混淆(以及一些复制构造函数)
【发布时间】:2013-06-25 19:04:42
【问题描述】:

所以我有一个关于通过引用传递的问题。我尝试通过引用将对象传递给成员函数,并让该成员函数使用我作为参数传递的引用调用另一个成员函数。但是,编译器说找不到调用的成员函数。为什么呢?下面的代码将以我无法表达的方式描述我的挫败感

    // CODE 1
    class someClass {
        int data;
        public:
        someClass(someClass&);
        someClass someFunction(const someClass&)
    };

    someClass::someClass(someClass &obj) {
        data = obj.data;
    }


    someClass someClass::someFunction(const someClass &obj) {
        someClass demo(obj); // <- this doesn't work
        someClass demo(&obj); // <- neither does this
        someClass demo(*obj); // <- or this
        someClass demo2(*this); // <- this works though 
    }

很难理解这一点,这似乎微不足道,但我非常感谢我可能获得的所有帮助。另外,xcode中发生了一些神秘的事情,当我尝试以下(参考CODE 2)时,它可以工作。知道为什么吗?

    // CODE 2
    class someClass {
        int data;
        public:
        someClass(someClass&);
        void setData(int x) { data = x; }
    };

    int main() {
        someClass first;
        setData(10);
        someClass second;
        second = first;
        //Mysteriously, it worked without overloading the '=' operator. Why?
        //Also, I mentioned XCode just in case someone might say it's compiler specific

        return 0;
    }

【问题讨论】:

  • 我认为你至少需要展示demo和demo2的原型才能获得很多帮助。

标签: c++ reference constructor pass-by-reference


【解决方案1】:

困难似乎如下:

someClass demo(obj); 

您正在尝试将 const 引用传递给需要非 const 引用的函数。典型的模式是让一个复制构造函数接受一个 const 引用参数,这样可以避免这个问题。

someClass demo(&obj); 

在这种情况下,编译器正在寻找一个构造函数,该构造函数接受一个指向某个类的指针,但找不到它。 &amp;obj 返回指向 obj 的指针,而不是对 obj 的引用。

someClass demo(*obj); 

在这种情况下,您尝试取消引用 obj,就好像它是一个指针,但它是一个引用,而不是一个指针。

someClass demo2(*this); 

这是有效的,因为您正在取消引用 this 指针,该指针指向 someClass 的实例。

【讨论】:

  • 所以你说的是因为我在 someFunction 中传递了一个对 obj 的 const 引用,因此是一个 const 引用。 obj 被传递给构造函数,但构造函数不接受 const ref。对象。因此它不起作用?
  • 没错。您可以将非常量引用传递给采用 const 引用的函数,但不能将 const 引用传递给采用非常量引用的函数,因为该函数可能会尝试修改其主体中的引用变量,这如果实际引用(与虚拟参数相反)是 const,则无法做到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
相关资源
最近更新 更多