我一直在编程,我发现了c ++类中的奇怪行为。所以我创建了一个包含字符串的简单类,该类的构造函数和从对象打印字符串的friend方法(show)。但正如你在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;
};
答案 0 :(得分:9)
我发现它很方便,但是如果方法参数是对象的引用,它为什么会起作用?
这是有效的,因为您的lol
类定义了一个接受const 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")
will result in a compiler error。