为什么类构造函数中的参数没有更改?
Why the parameter doesn't change in the class constructor?
这是我的代码。我不明白为什么它不打印 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
.
但还有几点观察结果:
- 首选英文名称。
valoare
在某些拉丁语或欧洲语言中的意思是"价值",对吧?也许是罗马尼亚语?但是 - 不会说这种语言的人不会知道这一点。由于无论如何您都必须懂英语才能编程,因此对于名称来说,这是一个安全的选择。 - 尽量不要对变量使用名称,这些变量也是不同命名空间中类的名称。例如,您的
vector
与标准库中的std::vector
、类或类模板具有相同的名称。尝试vec
或my_vector
或其他更有特色的东西。 你在漏内存!为什么要用
new
创造价值?只需使用构造,即A vector[] = { A(3), A(4), A(5), A(6) };
就好了。
更一般地说,您应该避免显式调用
new
和delete
,而是首选 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)
相关文章:
- C++:使用运算符 = 调用多参数构造函数
- 通过零参数构造函数创建的 glm::mat4 应该包含哪些值?
- 好奇的混合与可变参数构造函数
- 具有默认值的单个参数构造函数是否与默认构造函数相同?
- 为什么我们需要创建一个单参数构造函数来使用临时的无名称对象
- 在可变参数构造函数中初始化常量数组
- C++ 显式多参数构造函数歧义
- 零一参数构造函数
- 可变参数构造函数中的 SFINAE
- 当没有显式关键字与单参数构造函数一起使用时,编译器可以发出警告
- 可变参数类模板和可变参数构造函数
- 确保模板参数类型与其可变参数构造函数的类型匹配
- C++默认参数构造函数与内联初始化优先级
- 如何在 c++ 中将包含复制构造函数的类的参数构造函数称为私有?
- 自动存储中没有无参数构造函数的类对象和异常
- 警告:用两个参数构造函数返回对象时,表达结果未使用
- 如何在C++中调用无参数构造函数
- 在 c++ 中具有多个参数构造函数的模板类存在问题
- 可变参数构造函数优先于用户提供的移动构造函数,除非默认
- 如何从可变参数构造函数参数构造任何对象?