2015-06-28 110 views
-4

我做了一个简单的类来表示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确实声明了一个变量调用构造函数?

+3

你是什么意思,“空指针”?代码中没有指针类型的变量,所以没有可能具有“NULL”值的任何变量。 '为什么heck声明一个变量调用构造函数?'因为C++语言规范要求。 –

+2

C++不是Java。我建议你得到一本好的C++书,并且不要根据你的Java背景对C++做出假设。 – Blastfurnace

+0

在C++中,您并不需要执行'new Point()'来实例化对象。当你声明'Point P'时,它会在堆栈内存中创建一个对象,因为你的构造函数具有默认值,所以构造函数被调用,你的'x'和'y'得到默认值 – user007

回答

1

如果你是从你习惯于在堆上被分配一切的java到来,使用new运算符创建一个类或数据类型的实例,它并不像在C++的工作。

Point p; 

是一回事

Point p = new Point(); 
在java中

,除了一些明显的事情。

可以实现在C同样的事情++使用new运算符

Point* p = new Point(); 

但是你必须照顾内存管理自己,并使用

delete p; 

,当你不再需要p或你会有内存泄漏。如果在释放内存之前发生异常,内存泄漏也会发生,因此不建议使用上述示例。

2

你声明的类类型的对象,并在声明中没有提供初始化。这意味着如果该类具有用户定义的默认构造函数,那么该默认构造函数用于初始化该对象。这就是C++的工作原理。语言规范说它发生了,所以它发生了。

我看不出有什么“空指针”你希望看到在哪里。代码中没有任何指针。

+0

这就是如果我在Java中完成同样的事情会发生什么,因为我没有明确地调用构造函数。 – Czipperz

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混淆。

+0

MyClass obj();不是一个好主意 –

0

在C++甲一个默认的构造是一个缺省值分配中的每个对象或 默认值中的每个对象

Point(int x = 3, int y = 5); /// default constructor 

所以当你创建对象而不初始化一些值的对象将 有默认值来自默认的构造函数

相关问题