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

时间:2011-09-28 10:18:10

标签: c++

以下代码是否有效?

  

A类{string m_name;
  市民:
  string getName(){return m_name; }   }

     

.....
  printf(“%s”,object.getName()。c_str())
  ......

其中object.getName()返回一个临时字符串对象。

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

如果object.getName()按值返回,或者通过引用仍然有效的内容返回:

答案 3 :(得分:0)

我的代码正如我写的那样:

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对象上调用它。

此外,get前缀在风格上是令人厌恶的,在C ++中。你会写getSin吗? get前缀在Java中有一个目的,但在C ++中它只是视觉噪音和文本冗长,即它就像在一个精致的餐厅玩沙滩球:海滩上的好东西(Java)不是在餐厅这么好(C ++)。

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

.c_str()调用在风格上是正常的,因为大多数C ++程序员都这样做,并且知道它没问题。如果它是一个很少使用的建筑,那么它可能是不好的风格,因为那时其他人可能浪费时间检查它是否正式。这是正式的,因为临时持续到完整表达式结束。