簡體   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