我创建了一个简单的类来表示 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 时,否则会出现内存泄漏。如果在释放内存之前发生异常,也会发生内存泄漏,因此不建议使用上面的示例。