程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了查询成员初始化大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决查询成员初始化?

开发过程中遇到查询成员初始化的问题如何解决?下面主要结合日常开发的经验,给出你关于查询成员初始化的解决方法建议,希望对你解决查询成员初始化有所启发或帮助;

当我在做Hackerrank c++练习时,我在讨论部分偶然发现了这段代码:

class BadLengthException : public std::runtime_error
{
public:
    BadLengthException(int length) : std::runtime_error{std::to_String(length)}
    { }
};

我真的不明白在成员初始化器部分之后发生了什么,准确地说是这部分:

std::runtime_error{std::to_String(length)}

有人能解释一下这行代码对我有什么作用吗?我从未见过成员初始化的这种用法。我看惯了:

Foo(int num) : bar(num) {};

所以请尽可能清楚地解释它。感谢您的时间!

解决方法

您是从标准异常类 std::runtime_error 继承的。

在这段代码中:

 class BadLengthException : public std::runtime_error
 {
  public:
      BadLengthException(int length) std::runtime_error{std::to_String(length)}
      { }
};

您正在根据 std::runtime_error 定义一个新的异常类。

std::runtime_error 将字符串消息作为输入,您可以在 runtime_error_object.what() 块中使用 catch 打印该消息。因此,这就是将 length 变量转换为 std::string 的原因。您可以阅读有关 here 的更多信息。

最后:

Foo(int num) : bar(num) {};

这是构造函数列表初始值设定项语法。用于初始化类的成员变量。您可以阅读有关 here 的更多信息。

,

首先,请注意基类与初始化列表中的任何其他成员具有相同的成员语法。比如说,你有一个基类:

class Base {
  int m_val;
public:
  explicit Base(int val) : m_val(val) {};
  int val() const { return m_val; }
};

现在,您想在派生类中初始化 @H_541_5@m_val - 您不能,因为它是 Base 私有的。但是你可以通过显式初始化派生类“环绕”的基类实例来初始化它:

class Derived {
  int m_myVal;
public:
  Derived() : Base(42),m_myVal(12) { 
    assert(val() == 42 && m_myVal == 12); 
  }
};

在 C++11 中,您可以使用新语法进行初始化。它被称为统一初始化语法。以上可以改写如下:

class Base {
  int m_val;
public:
  explicit Base(int val) : m_val{val} {};
  int val() const { return m_val; }
};

// Approach 1
class Derived {
  int m_dval;
public:
  Derived() : Base{42},m_myVal{12} { 
    assert(val() == 42 && m_myVal == 12); 
  }
};

// Approach 2
class Derived {
  int m_dval = 12;
public:
  Derived() : Base{42} { 
    assert(val() == 42 && m_myVal == 12); 
  }
};

因此,您的代码在上下文中:

namespace my {
  // We make our own classes,equivalent to those in std::,for purpose of exposition:
  class exception {
  public:
    exception() noexcept = default;
    virtual ~exception() = default;
    virtual const char* what() const noexcept { return ""; }
  };

  class runtime_error {
    std::string m_what;
  public:
    explicit runtime_error(const std::string &what) : m_what(what) {}
    const char* what() const noexcept override { return m_what.c_str(); }
  };
}

class BadLengthException : public my::runtime_error {
public:
  // pre-C++11 syntax
  BadLengthException(int length) : my::runtime_error(std::to_String(length)) {
    assert(what() == std::to_String(length));
  }
  // or,with C++11 syntax
  BadLengthException(int length) : my::runtime_error{std::to_String(length)} {
    assert(what() == std::to_String(length));
  }
};  

在那里,@H_541_5@my::runtime_error 是参基类编写的,以便将参数传递给其构造函数。

在上面的代码中,assert 不仅是对调试版本的运行时检查,它们还记录了有关代码的真实陈述。用英语阅读它们有一种明确的方式 - 一项很好的技能。

有一种自然的趋势是写评论关于程序的预期状态:

// Don't do this

Derived::Derived() : Base{42} {
  // Here val() is 42 and m_myVal is 12
}

这不是惯用的 C++:关于状态的注释会有所帮助,但永远不会用于代码不仅正式提出真实的陈述(断言),而且还可以在运行时对其进行验证.此外,断言可以被代码优化器和静态分析工具利用。当一个人获得开悟时,通常会看到以下内容:

// Don't do this: don't repeat yourself (DRY)

Derived::Derived() : Base{42} {
  assert(val() == 42 && m_myVal == 12);
  // Here val() is 42 and m_myVal is 12
}

惯用的方式是只用一个断言 - 不需要评论,它按原样很容易理解。

Derived::Derived() : Base{42} {
  assert(val() == 42 && m_myVal == 12);
}

大佬总结

以上是大佬教程为你收集整理的查询成员初始化全部内容,希望文章能够帮你解决查询成员初始化所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: