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

时间:2018-06-09 22:19:22

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

这是我的代码。即使在类构造函数param1变为3,我也不知道它为什么不打印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;
}

3 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:2)

向量中索引2处的元素构造为A(5),因此它的值(&#34; valoare&#34;)为5.函数定义中的= 3default argument - 如果您自己不指定,则使用该avoid calling new and delete explicitly。所以,如果你要写:

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

将打印3

但是还有一些观察结果:

  1. 喜欢英文名字。 valoare表示&#34;价值&#34;用一些拉丁语或欧洲语言,对吧?罗马尼亚人呢?但是 - 不会说那种语言的人不会知道这一点。因为你必须知道英语才能编程,这对于名字来说是一个安全的选择。
  2. 尽量不要为变量使用名称,这些变量也是不同命名空间中的类的名称。例如,您的vectorstd::vector具有相同的名称,是标准库中的类,或者更确切地说是类模板。试试vecmy_vector或其他更具特色的内容。
  3. 你正在泄露记忆!为什么使用new创建值?只需使用构造,即

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

    很好。

  4. 更一般地说,你应该RAII-style,而不是更喜欢smart pointers类 - 它们在构造上分配并在销毁时释放。最简单的方法是切换到使用{{3}}

答案 2 :(得分:1)

  

为什么参数在类构造函数中没有改变?

它不打印值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)