繁体   English   中英

C ++为类调用构造函数

[英]c++ Calling a constructor for a class

我是C ++较大概念的新手,正在尝试编写一个小程序来测试构造函数和解构函数的行为。 但是,由于关于myClass :: myClass的未定义引用或无法直接调用构造函数的愚蠢错误,我似乎无法使程序编译。

我的代码是这样的:

myClass.h:

#pragma once

class myClass{

int x;

public:
    myClass(int n_x);

    myClass();

    ~myClass();
};

myClass.cpp:

#include <string>
#include "myClass.h"

myClass(int n_x)
:x(n_x)
{
// constructor
std::cout << "A myClass object was created! And x == " << x << "!" << std::endl;
}

myClass()
:x(10)
{
// default constructor
std::cout << "A myClass object was created! And x == " << x << "!" << std::endl;
}

~myClass()
{
// deconstructor
std::cout << "A myClass object was destroyed!" << std::endl;
}

main.cpp:

#include <iostream>
#include "myClass.h"

using namespace std;

void func();
myClass* func2();

int main()
{
cout << "Hello world!" << endl;

myClass obj1;

func();

myClass* obj2 = func2();

delete obj2;

cout << "Goodbye world!" << endl;

return 0;
}

void func()
{
myClass obj1 = myClass(15);
}

myClass* func2()
{
myClass* obj1 = new myClass(5); // using the new operator to allocate memory in free space (the heap)

return obj1;
}

我显然做错了吗? 来自Java背景。

====编辑====找出问题所在。 现在我觉得很蠢。 无论出于何种原因,都会在项目目录中创建myClass.h和myClass.cpp文件,但未在代码树中的代码目录:: blocks中显示它们。 一旦我将文件添加到项目中,它就可以成功编译。

感谢您的时间和答复。 即使我的问题与我的代码没有真正的关系,我仍然从您的答复中学到了一些东西。

在“ myClass.cpp”中,定义函数时需要完全限定函数的名称。

myClass::myClass(int n_x): x(n_x) {
//...
}

编译器不知道您是否在没有完整限定的情况下定义myClass成员函数。 就其而言,您可以定义一些名为myClass自由函数。

另外,您需要包括<iostream>才能使用std::cout

在答案旁边,您已经获得了在正确的名称空间中实现事物的权限,并且由于您似乎想首先了解有关构造函数/析构函数的信息,因此:

当你看到

myClass* whatever = new myClass();

之所以起作用,是因为new运算符是向后传递指针的函数,该指针可以转换为myClass类型的指针。

我不知道任何Java,但是在有印象的人检查过C ++代码之后,我可能会想到Java程序员可能会喜欢显式构造函数。 在C ++中,构造函数被更隐式地处理,子类上的EG构造函数链不需要(甚至不支持)显式调用,它们会自动调用继承链。

长话短说,不要将构造函数和析构函数视为像普通函数那样的实现方法,而应将它们视为强制性的,隐式托管的资源处理程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM