将c_str临时对象的返回值传递给printf

pass c_str return value of temporary object to printf

本文关键字:值传 返回值 printf 返回 str 临时对象      更新时间:2023-10-16

下面这段代码有效吗?

类A {string m_name;
公众:
字符串getName(){返回m_name;}
}


…printf("% s", object.getName () .c_str ())

object. getname()返回一个临时字符串对象

临时字符串将持续到printf()完成,所以是的,它是安全合法的。

对我来说是有效的,假设get name将返回一个标准字符串对象。

提供的object.getName()按值返回,或按引用保持有效的内容返回:

是的

你的代码,因为我写这个:

class A { string m_name;
public:
string getName() { return m_name; }
}
.....
printf("%s", object.getName().c_str())
......

你问,代码是否有效?

不,代码是无效的,因为

  • 在类定义的末尾缺少一个分号,并且
  • ";…";作为c++代码无效,
  • printf语句的末尾缺少一个分号。

简而言之,代码无法编译。

请在将来发布可编译的代码,以便想要帮助您的人可以按实际情况试用它(并确保这是您所询问的代码)。


现在关于风格问题。

string getName() { return m_name; }

缺少const是不好的风格。

你应该让成员函数const,这样它就可以在const对象上被调用。

而且,在c++中,get前缀在风格上是令人讨厌的。你会写getSin吗?get前缀在Java中是有目的的,但在c++中它只是视觉上的噪音和文本上的冗长,也就是说,它就像在一家高级餐馆里玩沙滩球:在海滩上(Java)很好看的东西在餐馆里(c++)就不那么好看了。

printf("%s", object.getName().c_str());

.c_str()调用在风格上是OK的,因为大多数c++程序员都这样做,并且知道它是OK的。如果它是一个很少使用的结构,那么它可能是糟糕的风格,因为其他人可能会浪费时间检查它是否正式可行。这在形式上是可以的,因为临时符一直持续到完整表达式结束。