c++ 为 class 调用构造函数

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 文件已创建并位于我的项目目录中,但未显示在 code::blocks 的项目树中。一旦我将文件添加到项目中,它就成功编译了。

感谢您的宝贵时间和答复。尽管我的问题与我的代码并没有真正的关系,但我仍然从您的回复中学到了一些东西。

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

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

编译器不知道您在定义 myClass 的成员函数时没有完全限定。就它而言,您可以定义一些名为 myClass.

的自由函数

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

除了您已经得到的关于以正确的名称 space 实施事物的答案之外,并且由于您似乎首先想了解更多关于 constructor/destructor 的信息:

当你看到

myClass* whatever = new myClass();

之所以有效,是因为 new 运算符是返回指针的运算符,该指针可以转换为 myClass 类型的指针。

我什么都不知道 Java,但是在我的印象中,我印象中可能有一些类似显式构造函数的东西 Java 程序员可能已经习惯了。在 C++ 中,构造函数更隐式处理,例如子类上的构造函数链不需要(甚至不支持)显式调用,它们会自动调用继承链。

长话短说,不要像普通函数一样对待构造函数和析构函数,就像要实现的方法一样,而是像强制性的、隐式管理的资源处理程序一样对待它们。