下面这段代码是否有效?传递c_str临时对象的返回值printf
class A {string m_name;
public:
string getName(){return m_name; }
}.....
的printf( “%S”,object.getName()。c_str())
......
其中object.getName ()返回一个临时的字符串对象。
下面这段代码是否有效?传递c_str临时对象的返回值printf
class A {string m_name;
public:
string getName(){return m_name; }
}.....
的printf( “%S”,object.getName()。c_str())
......
其中object.getName ()返回一个临时的字符串对象。
临时字符串将持续到printf()
完成,所以是的,这是安全和合法的。
你甚至可以绑定到一个临时的'string const&t = object.getName();'这个参数保持有效,直到参考超出范围。 –
@ edA-qa mort-ora-y:是的,但这不是世界上最可读的代码。 – sharptooth
重新“它是安全的和合法的”,不,它甚至没有语法上的有效性,也不会编译。 –
看起来对我有效,假设获取名称将返回一个标准的字符串对象。
提供object.getName()的值返回,或参照的东西,仍然有效:
是
你的代码,我写这篇文章:
class A { string m_name;
public:
string getName() { return m_name; }
}
.....
printf("%s", object.getName().c_str())
......
你问,代码是否有效?
没有,的代码无效,因为
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++程序员做到这一点,并知道它是确定。如果它是一种很少使用的建筑,那么它可能是不好的风格,因为那时其他人可能浪费时间检查它是否正式正常。这是正式的,因为临时持续到完整表达式的末尾。
@anonymous downvoter:我猜你是其中的一个系列downvoters。如果你不是,那么请尽可能向读者解释你的投票。你究竟做了什么(可能是错误的,但那就是沟通有利于清理)认为是错误的或失踪。 –
'getName'的代码会很方便。 –
回滚一个从根本上改变问题以匹配答案的编辑。 –