Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么声明变量会调用构造函数_C++_Constructor - Fatal编程技术网

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

C++ 为什么声明变量会调用构造函数,c++,constructor,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文件: 我的问题是,为什么声明变量会调用构造函数?您声明了类类型的对象,但在声明中没有提供初始值设定项。这意味着,如果类具有用户定义的默认

我制作了一个简单的类来表示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文件:


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

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


我看不出您希望看到什么空指针以及在哪里。在代码中没有任何指针。

如果你来自java,你就习惯了堆上分配的所有东西,并使用新的操作符创建类或数据类型的实例,它在C++中不起作用。

Point p;
是同一件事吗

Point p = new Point();
在java中,除了一些显而易见的事情

<>你可以用新的操作符< /P>在C++中实现同样的事情
Point* p = new Point();
但您必须自己负责内存管理和使用

delete p;

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

在实例化对象中

在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);
在爪哇

MyClass obj = new MyClass(); //or
MyClass obj = new MyClass(int,int);
<>学习C++的基础知识,不要把它与java混淆。 <>在C++中,默认构造函数是每个对象中分配的默认值或 每个对象中的默认值

因此,当您在未初始化某些值的情况下创建对象时,该对象将
默认值是否来自默认构造函数

空指针是什么意思?代码中没有指针类型的变量,因此没有任何值可能为NULL的变量。为什么声明变量会调用构造函数?因为C++语言规范要求.C++不是java。我建议你得到一本好的C++书,不要根据你的java背景对C++进行假设。在爪哇,你实际上声明了对对象的引用,这就是为什么它们可以是空的,以及为什么你要做新的点的事情——你将引用绑定到堆上创建的对象上;在C++中,相同的语法声明在这个情况下的实际对象被分配在与函数绑定的堆栈和范围上。在C++中,变量可以是对象,对象可以作为变量出现。指针和引用是必须显式编程的显式语言特性。这是学习一门新语言的无望方法。如果我在Java中做了完全相同的事情,就会发生这种情况,因为我没有显式地调用构造函数。
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);
MyClass obj = new MyClass(); //or
MyClass obj = new MyClass(int,int);
Point(int x = 3, int y = 5); /// default constructor