将指针传递给const ref函数

时间:2015-12-03 08:09:54

标签: c++

为什么以下工作?

#include <iostream>
using namespace std;

class PolyLine {
public:
  PolyLine() = default;
  PolyLine(PolyLine * ptr) {
    std::cout << "Ctor called" << std::endl;
  }

};

void function(const PolyLine& pt) {
}

int main() {

    PolyLine *pobj = new PolyLine();

    function(   pobj );

    return 0;
}

似乎隐式转换以某种方式被调用..为什么我没有得到编译错误?

3 个答案:

答案 0 :(得分:6)

它的工作原理是因为你正在调用隐式转换构造函数,因为当你将某些东西作为参数传递并且你有一个非显式构造函数接受一个参数时会发生这种情况。

如果您不希望在此实例中进行隐式转换,则可以将构造函数标记为explicit

explicit PolyLine(PolyLine * ptr) {
    std::cout << "Ctor called" << std::endl;
}

也就是说,让构造函数获取指向同一类的另一个对象的指针似乎有点奇怪;为什么不使用const PolyLine&

答案 1 :(得分:1)

这就是隐式转换在C ++中的工作方式。如果您将char*传递给接受std::string作为第一个参数的函数,则C ++会使用char*构造函数将std::string转换为std::string

答案 2 :(得分:-3)

如果您将在function (..)中执行任何更改对象状态的操作,那么您将收到编译器错误。如下:

#include <iostream>
using namespace std;

class PolyLine {
public:
  PolyLine() = default;
  PolyLine(PolyLine * ptr) {
    std::cout << "Ctor called" << std::endl;
  }

  void test ()
  {
    _a = 100;
  }

  private:
    int _a;
};

void function(const PolyLine& pt) {
  pt.test ();
}

int main() {

    PolyLine *pobj = new PolyLine();

    function(   *pobj );

    return 0;
}

编译输出:

wbzz@mambet:/tmp$ g++ -std=c++11 main.c 
main.c: In function ‘void function(const PolyLine&)’:
main.c:21:12: error: passing ‘const PolyLine’ as ‘this’ argument of ‘void PolyLine::test()’ discards qualifiers [-fpermissive]
   pt.test ();
            ^