[英]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.