2011-09-28 20 views
3

下面这段代码是否有效?传递c_str临时对象的返回值printf

class A {string m_name;
public:
string getName(){return m_name; }
}

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

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

+1

'getName'的代码会很方便。 –

+0

回滚一个从根本上改变问题以匹配答案的编辑。 –

回答

6

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

+0

你甚至可以绑定到一个临时的'string const&t = object.getName();'这个参数保持有效,直到参考超出范围。 –

+0

@ edA-qa mort-ora-y:是的,但这不是世界上最可读的代码。 – sharptooth

+0

重新“它是安全的和合法的”,不,它甚至没有语法上的有效性,也不会编译。 –

2

看起来对我有效,假设获取名称将返回一个标准的字符串对象。

2

提供object.getName()的值返回,或参照的东西,仍然有效:

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是ungood风格。

您应该使会员功能const,以便它然后可以在const对象上调用。

此外,在C++中,get前缀在风格上是一种可憎的东西。你会写getSin吗? get前缀在Java中有一个目的,但在C++中,它只是视觉噪声和文本冗长性,也就是说,它就像在一家高级餐厅玩沙滩球一样:在沙滩上(Java)不错,在餐厅(C++)。

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

.c_str()呼叫文体OK,因为大多数C++程序员做到这一点,并知道它是确定。如果它是一种很少使用的建筑,那么它可能是不好的风格,因为那时其他人可能浪费时间检查它是否正式正常。这是正式的,因为临时持续到完整表达式的末尾。

+0

@anonymous downvoter:我猜你是其中的一个系列downvoters。如果你不是,那么请尽可能向读者解释你的投票。你究竟做了什么(可能是错误的,但那就是沟通有利于清理)认为是错误的或失踪。 –