为什么类构造函数中的参数没有更改?

Why the parameter doesn't change in the class constructor?

本文关键字:参数 构造函数 为什么      更新时间:2023-10-16

这是我的代码。我不明白为什么它不打印 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;
}

您可能想阅读有关默认参数的信息: https://en.cppreference.com/w/cpp/language/default_arguments

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

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

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

向量中索引 2 处的元素构造为A(5),因此它的值("valoare"(为 5。函数定义中的= 3是默认参数 - 如果您自己未指定一个参数,则使用该参数。所以如果你要写:

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. 更一般地说,您应该避免显式调用newdelete,而是首选 RAII 样式的类 - 它们在构造时分配,在销毁时释放。最简单的方法是切换到使用智能指针

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

它不会3打印值,因为您要为其提供另一个值。

CPP 首选项

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

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)