我一直在编程,我发现了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;
};
我发现它很方便,但是如果方法参数引用了一个对象,它为什么会起作用?
它的工作原理是因为你的lol类定义了一个接受a的构造函数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") 将导致编译器错误.
| 归档时间: | 
 | 
| 查看次数: | 119 次 | 
| 最近记录: |