【问题标题】:C++ best way to create constructor and class instance [closed]C ++创建构造函数和类实例的最佳方法[关闭]
【发布时间】:2021-04-14 16:57:39
【问题描述】:

我对 c++ 语言还很陌生,但是我有使用 python 和一点 java 的经验。

由于 c++ 非常强大,而且实现某些行为的方法总是很少,我有 2 个与 oop 相关的问题。

  1. 用参数创建类构造函数的最佳方法是什么? 例如,假设我们有这样的东西:

    结构测试{ 诠释 x; 整数y; };

构造函数有两种流行的方式:

1.

   Test(int x, int y) : x{x}, y{y} { // rest of constructor};
   Test(int x1, int y1) {
     x = x1;
     y = y1;
     // rest of constructor
   }

我应该使用哪一个?为什么?

  1. 哪种风格更像c++来创建类对象,为什么?

    Test* testptr = new Test(1, 1);

Test test = Test(1, 1);

【问题讨论】:

  • 对于这个结构,您可能不需要或不需要构造函数。您可以创建一个像Test myTest{2,3}; 这样的变量,它将x 初始化为2,将y 初始化为3。
  • 对于这样的结构,对于问题 #2,我可能不会使用任何选项。我会再次使用Test myTest{2,3}; 大部分时间。不鼓励在c++ 中使用new,这是一个小结构。
  • 视情况而定,选择哪个选项。你可能还想要std::unique_ptr<Test>
  • 这可能会有所帮助,但它出现在 c++11 之前,其中包括智能指针和不鼓励使用 new 和原始拥有指针的转变:https://stackoverflow.com/questions/1021138/differences-between-dynamic-memory-and-ordinary-memory
  • 请对每个 SO 问题提出一个问题。您有两个非常不同的问题。

标签: c++ oop


【解决方案1】:
  1. 创建struct 的最接近C++ 的方法是struct_name{value1, value2}。而且您不需要声明自己的构造函数。

如果您真的想使用构造函数,请使用带有初始化语法的构造函数。这就是区别。让我们考虑一个具有两个字段的结构。所以它看起来像:{one, two}。当您使用初始化语法时,您在花括号之间编写的实际构造函数代码之前立即创建所需的结构。所以它看起来像:{1, 2}(我们现在有值)。但是,当您在构造函数的主体中初始化这些字段时,它将首先创建一个具有默认值的结构,然后再更改它们。所以它看起来像:{0, 0} ...constructor is working... {1,2}。 好的,关于它的最后一件事是参数声明。您应该使用常量引用,因为它可以防止程序员更改函数体内的这些参数,并且这些变量通过引用传递而不是复制。我们来看两个例子:

void fun1(int a, int b);
void fun2(const int& a, const int& b);

fun1 在此处复制这两个参数,然后在正文中使用它们。但是,fun2 仅获取对变量的引用并直接使用它们的值。另外,因为const,你不能更改它们,所以它是完全安全的。

  1. 现代 C++ 不喜欢 new 运算符。我们只在构造函数中使用它并在析构函数中调用delete 运算符。但是,不建议在其他情况下使用 new 运算符,因为它更难防止内存泄漏,并且违反了 RAII 习惯用法。如果您确实必须使用原始指针,请考虑将它们放在 smart pointers 中。

【讨论】:

  • 太棒了!这就是我想听到的。当我有许多要初始化的字段的复杂类以及要调用的一些方法时,如何使用构造函数。我还应该使用初始化器语法吗? 2. 好的,所以使用原始指针+new 是有风险且不必要的。不过Test test = Test(1, 1);可能无效,unique_ptr创建类实例怎么样?
  • 使用const int& 代替int 的部分是无稽之谈。此外,虽然使用 init list 的建议很好,但对于这种特定情况,关于 {0, 0} ...constructor is working... {1,2} 的解释是不准确的。
  • @RobertKwiatkowski 除非你有充分的理由,否则不要使用普通或智能指针。 new 效率低下。 Test test = Test(1, 1); 高效但过于冗长。
  • 好的,但请记住这个测试过于简单了。我想知道当我有很多字段、方法等时我应该如何初始化类实例,以及如何处理我现在所知道的简单结构,感谢你们。
  • @RobertKwiatkowski,1. 如果可以,最好立即初始化字段。如果您需要进行额外的计算,请将代码放在构造函数的主体中。 2.不,实际上它比使用指针更有效。取消引用会导致性能问题,因此您不应每次都使用它。顺便说一下,编译器通常会自行选择放置变量的位置。检查this线程以获取更多信息。
猜你喜欢
  • 2021-02-03
  • 2010-11-16
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多