【问题标题】:Why the parameter doesn't change in the class constructor?为什么类构造函数中的参数不变?
【发布时间】:2018-06-09 22:19:21
【问题描述】:

这是我的代码。我不明白为什么它不打印 3,即使在类构造函数中 param1 变为 3。

#include <iostream>

using namespace std;

class A{

    int valoare;
public:

    A(int param1 = 3):valoare(param1){}
    int getValoare(){return this -> valoare;}
};

int main()
{

    A vector[] = {*(new A(3)), *(new A(4)), *(new A(5)), *(new A(6))};
    cout << vector[2].getValoare();
    return 0;
}

【问题讨论】:

  • param1 仅在您不提供参数的情况下才会变为 3,而实际上您确实这样做了。对于vector[2],此参数为5
  • 你有立即的内存泄漏!您是否可能来自必须使用new 来创建新对象的 Java 或 C# 背景?在 C++ 中你不需要那个。做例如A(3) 没有 new 完全没问题。
  • 至于你的问题,不要再猜测 C++ 中的含义,get a few good books 好好学习。
  • vector[2] 是使用 *(new A(5)) 初始化的,它赋予其 valoare 成员值 5。并且还会导致内存泄漏 - 通过使用 A(5) 初始化来避免泄漏。

标签: c++ c++11 constructor default-arguments


【解决方案1】:

您可能想了解默认参数:https://en.cppreference.com/w/cpp/language/default_arguments

当您为具有默认参数的函数指定参数时,它会覆盖该默认值。因此,您的代码将打印出 5。

附带说明一下,您的代码存在内存泄漏,因为您使用 new 关键字分配了内存并且从未将其删除。您应该更改 Vector 的声明,即在堆栈上分配内存,如下所示:

Vector = {A(3), A(4), A(5), A(6)}

【讨论】:

    【解决方案2】:

    向量中索引 2 处的元素构造为 A(5),因此它的值(“valoare”)为 5。函数定义中的 = 3default argument - 如果您不这样做,则使用它t 自己指定一个。所以如果你要写:

    std::cout << A().getValoare();
    

    这将打印3

    但还有一些观察是有序的:

    1. 首选英文名称。 valoare 在某些拉丁语或欧洲语言中的意思是“价值”,对吧?也许是罗马尼亚语?但是 - 不会说那种语言的人不会知道这一点。因为无论如何你都必须懂英语才能编程,所以这是一个安全的名字选择。
    2. 尽量不要为变量使用名称,这些名称也是不同命名空间中的类的名称。例如,您的vector 与标准库中的std::vector 同名,是一个类,或者更确切地说是一个类模板。试试vecmy_vector 或其他更有特色的东西。
    3. 你在泄漏内存!为什么要使用new 来创造价值?只需使用构造,即

      A vector[] = { A(3), A(4), A(5), A(6) };
      

      没问题。

    4. 1234563最简单的做法是切换到使用smart pointers

    【讨论】:

      【解决方案3】:

      为什么类构造函数中的参数没有变化?

      它不会打印值3,因为你给了它另一个值。

      来自cppreference

      使用默认参数代替函数调用中缺少的尾随参数:

      void point(int x = 3, int y = 4);
      
      point(1,2); // calls point(1,2)
      point(1);   // calls point(1,4)
      point();    // calls point(3,4)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-06
        • 1970-01-01
        • 1970-01-01
        • 2014-06-18
        • 2011-02-25
        • 1970-01-01
        相关资源
        最近更新 更多