为什么声明变量会调用构造函数

Czi*_*erz -1 c++ constructor

我创建了一个简单的类来表示 x、y 坐标。它有一个封装的 int 和以下构造函数:

//point.h
Point(int x = 3, int y = 5); // not zero for example purposes

//point.cpp
Point::Point(int x, int y) : x(x), y(y) {}
Run Code Online (Sandbox Code Playgroud)

然后我有一个文件main.cpp

#include "point.h"
#include <iostream>

int main() {
    Point p;
    std::cout << "x: " << p.getX() << " y: " << p.getY() << std::endl;
    p.setX(7);
    p.setY(9);
    std::cout << "x: " << p.getX() << " y: " << p.getY() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

来自 Java 背景,我预计这会产生一个空指针,但它却打印:

x: 3 y: 5
x: 7 y: 9
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么声明变量会调用构造函数?

小智 5

如果您来自 java,那么您习惯于在堆上分配所有内容并使用 new 运算符创建类或数据类型的实例,它的工作方式与 c++ 不同。

Point p;
Run Code Online (Sandbox Code Playgroud)

是一样的

Point p = new Point();
Run Code Online (Sandbox Code Playgroud)

在java中,除了一些明显的事情。

您可以使用 new 运算符在 C++ 中实现相同的效果

Point* p = new Point();
Run Code Online (Sandbox Code Playgroud)

但是你自己负责内存管理并使用

delete p;
Run Code Online (Sandbox Code Playgroud)

当你不再需要 p 时,否则会出现内存泄漏。如果在释放内存之前发生异常,也会发生内存泄漏,因此不建议使用上面的示例。