【问题标题】:why we use const char* func() instead of char func() [closed]为什么我们使用 const char* func() 而不是 char func() [关闭]
【发布时间】:2020-06-24 21:26:32
【问题描述】:

作为我是编程新手,我只是想在下面的代码中知道我们为什么要写 const char* what() 而不是 char what 在第 6 行下方。 其次,为什么有人写 MyException& e 而不仅仅是 MyException e 为什么我们在 Catch 块中使用参考。请赐教,因为我对 references 和 const 引用某些东西感到有些困惑.......

#include <iostream>
#include <exception>
using namespace std;
class MyException: public exception{
    public:
const char* what(){
return "C++ exception";}
};
int main()
{
    try{
    throw MyException();}
    catch(MyException e){
    cout<<"Myexception caught"<<endl;
    cout<<e.what()<<endl;
    }
}

【问题讨论】:

  • 每个帖子只问一个问题。你知道charconst char*这两个类型分别代表什么吗?
  • char 是单个字符。当您想发送多于一封信时,它就不是那么有用了。 "C++ exception"String Literal,而字符串字面量是一个常量数组 (const char [exactly_the_right_size]),其字符大小正好适合保存字符串及其终止的 null。这个字符数组将decay指向一个指向常量字符数组的指针(一个const char *
  • 这一切都应该在a non-fraudulent C++ programming text 的早期进行介绍。 Stack Overflow 不是好的参考资料的替代品,整个互联网更有可能让你成为一个糟糕的程序员而不是一个好的程序员。拿一本书。读了这本书。做练习。学习在受控环境中编程,您的学习经验将减少数年。
  • @ThomasSablik 通过引用捕获不仅是关于复制/不复制,而且是关于不切片,尽管在这里无关紧要
  • @idclev463035818 是的,你是对的。我完全忘记了。

标签: c++ reference c++14 constants


【解决方案1】:

这里有两个原因。 char 表示单个字符,例如 a,const char* 可以代表整个字符串,因此您可以:

char getChar() { return 'M'; }
const char* getWord() { return "String"; }

第二个原因是因为类MyException是从std::exception派生的,它有一个override-able (virtual) function called what,所以当我们throw MyExceptioncatch它时,当我们调用what()它返回“C++异常"

使用MyException&amp;是因为我们不需要副本,我们只需要一个引用。复制也可能导致object slicing,这取决于您对捕获的异常所做的操作可能很糟糕。此外,副本会调用可能抛出的构造函数,这将是一团糟。

【讨论】:

  • 通过引用捕获的更重要原因是避免切片(参见isocpp.github.io/CppCoreGuidelines/…)。 OP 代码也可以捕获 std::exception&amp;,但如果 MyException 有成员,则捕获 std::exception 会有问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
相关资源
最近更新 更多