3

我一直在编程,并且在 c++ 类中发现了奇怪的行为。所以我创建了一个简单的类,其中包含字符串、该类的构造函数和从对象打印字符串的友元方法(显示)。但正如您在 main 函数中看到的那样。我传递给方法(显示)简单的字符串,它可以工作。我发现它很方便,但是如果方法参数是对对象的引用,为什么它会起作用?

#include <iostream>
using namespace std;

class lol
{
  char * str;
public:
  lol(const char * s);
  friend void show(const lol & l);
};

lol::lol(const char * s)        //assign string to object
{
  str = new char[strlen(s)+1];
  strcpy(str,s);
}

void show(const lol & l)        //prints string from object
{   
  cout << l.str;
};

int main()
{
  show("TEST"); //passing string but not an object
  return 0;
};
4

1 回答 1

9

我发现它很方便,但是如果方法参数是对对象的引用,为什么它会起作用?

它之所以有效,是因为您的lol类定义了一个接受 aconst char*并且标记为的构造函数explicit

这授权编译器show("TEST")通过构造一个临时对象类型来解析调用lol,将字符串文字"TEST"作为参数传递给构造函数,并将您的引用参数绑定l到这个临时对象。

为了防止这种隐式的用户定义转换序列,请将您的构造函数标记为explicit

class lol
{
    char * str;
public:
    explicit lol(const char * s);
//  ^^^^^^^^
    friend void show(const lol & l);
};

这样,调用show("TEST") 将导致编译器错误

于 2013-03-28T19:09:55.503 回答