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

时间:2015-06-28 23:22:43

标签: 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) {}

然后我有一个文件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会声明一个变量调用构造函数?

4 个答案:

答案 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

因此,当您创建一个对象而不初始化某些值时,该对象将会 具有来自默认构造函数的默认值