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