我做了一个简单的类来表示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) {}
然后我有一个文件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;
}
来自Java背景,我希望这会产生一个空指针,但它会打印出来:
x: 3 y: 5
x: 7 y: 9
我的问题是为什么heck会声明一个变量调用构造函数?
答案 0 :(得分:2)
您声明了类类型的对象,并且未在声明中提供初始化程序。这意味着如果类具有用户定义的默认构造函数,那么该默认构造函数用于初始化对象。这就是C ++的工作原理。语言规范说它发生了,所以它发生了。
我不知道&#34;空指针&#34;你期待看到和在哪里。您的代码中没有任何指针。
答案 1 :(得分:1)
如果你来自java,你习惯于在堆上分配的所有东西,并使用new运算符来创建类或数据类型的实例,它不像c ++那样工作。
Point p;
与
相同Point p = new Point();
在java中,除了一些显而易见的事情。
您可以使用new运算符
在c ++中实现相同的功能Point* p = new Point();
但是你自己负责内存管理并使用
delete p;
当你不再需要p或你会有内存泄漏。如果在释放内存之前发生异常,也会发生内存泄漏,因此不建议使用上述示例。
答案 2 :(得分:0)
在实例化对象时,
在C ++中
MyClass obj; //calls the default constructor. There can only be one.
//either with empty parameter list or with args default.
MyClass obj(int,int); //constructor with non default args.
//equivalent of methods above
MyClass obj = MyClass()
MyClass obj = MyClass(int,int);
//You can now have pointers
MyClass *obj = new MyClass();
MyClass *obj = new MyClass(int,int);
在Java中
MyClass obj = new MyClass(); //or
MyClass obj = new MyClass(int,int);
很好地学习C ++的基础知识,不要将它与Java混淆。
答案 3 :(得分:0)
在C ++中一个默认构造函数是在每个对象中分配的默认值 每个对象中的默认值
Point(int x = 3, int y = 5); /// default constructor
因此,当您创建一个对象而不初始化某些值时,该对象将会 具有来自默认构造函数的默认值