簡體   English   中英

對象和實例之間的區別:C ++

[英]Difference between Object and instance : C++

我在SO上發表了一些帖子,最后我得出的結論是,當我們有類似的東西:

Person name;

name是class person的對象。

它實例化時成為實例:

name=new Person();

我是C ++的初學者,到目前為止我已經看到我們可以訪問函數和變量,如:

Person name;
name.getValue;
name.callFunction();

我們不需要為此使用new運算符。 那么我們可以說在C ++中可以忽略對象和實例之間的區別因素嗎?

在C ++中,“對象”和“實例”幾乎可以互換使用。

有一個classinstance的通用編程設計模式。 class包含有關的所有信息, instance在那只class

在C ++中,當您聲明一個classstruct ,編譯器會生成描述如何創建class instance的代碼,數據布局是什么,並提供一些可用於與該instance交互的方法(包括破壞) )。

virtual方法和繼承似乎將一些方法和布局移動到實例:但數量非常有限。 相反,每個實例都保存指向virtual類數據的指針。 在某些語言中,您可以在運行時替換實例的單個方法:但不能在C ++中替換。

當您創建classstruct的實例時,它可以通過堆棧上的自動命名變量(如Foo f; ),匿名自動命名變量(如some_function( Foo(17,22) ) ),實例上免費商店(如new Foo(17, 22) ),或通過placement- new (這是std::vectorstd::make_shared創建實例的方式)。

令人困惑的是,在C ++中有一個單獨的並行class - instance模式 - class template - class class templateclass ,實例化是實例。 template參數和特化表示在編譯時如何“構造” class es。 class template上的模式匹配提供了與實例無關的有限數量的屬性(模式中的“類屬性”)。 (可以說函數模板函數是模式的另一個實例)。

如果你看一下C ++ 1y關於概念精簡的提議,你會看到對象和實例在C ++中可能意味着不同的東西。

int x = 0;
int& foo = x;
int* bar = &x;

x既是對象又是int類型的實例。

fooint&類型的實例,但是調用foo對象可能是錯誤的! 它是一個引用 - 別名,或某個對象的不同名稱(在本例中為x )。

bar是指向int的指針, intint*類型的實例,並且將其稱為對象可能是正確的。

這是一個有用的區別:如果類型是引用類型,則類型不必表示對象類型。 對象類型在許多重要方面的行為與引用類型不同。

現在,一些類型具有“引用語義”,因為它們在許多方面表現得像引用,但實際上是class es。 這種類型的實例更好地稱為引用或對象嗎? 在可怕的情況下,某些實例混合了引用和對象語義:這通常是一個壞跡象。

通過3.9 [類型]中的最新標准 ,我們在C ++中有各種類型。 它們描述了對象類型是什么:

類型描述對象(1.8),引用(8.3.2)或函數(8.3.5)

對象類型是(可能是cv限定的)類型,它不是函數類型,不是引用類型,也不是void類型。

因此,調用函數類型或引用類型“對象”的事物的“實例”似乎是不正確的。 請注意,訪問函數或引用實例的“表示”基本上是不可能的:引用別名到它們引用的對象中,並使用函數的名稱衰減為指向函數的指針(和指向函數的指針基本上是不透明的句柄,可以讓你調用它們。

所以可以說函數不是實例,引用不是實例。

第三方面,我們討論了class template和函數template的實例化。 14.7是“模板實例化和專門化”,實例化( template )的點都是標准的正式術語。

首先,您應該知道“對象”和“實例”之間沒有區別。 他們是同義詞。 在C ++中,您還可以調用基本類型的實例,如intdouble “objects”。 C ++的設計原則之一是可以使自定義類型(即類)的行為與原始類型完全相同。 事實上,在C ++中,人們通常更喜歡引用“類型”而不是“類”。

所以,它應該是類型對象 既然我們已經解決了這個問題,我恐怕必須告訴你,你的結論是錯誤的。

Person是一種類型 name是一個(命名不太好)的變量,用於訪問該類型的對象

整行的C ++代碼如下所示:

Person name;

這意味着:“創建一個Person類型的對象,讓我通過名稱變量訪問它”。

new Person()要復雜得多。 您可能熟悉Java等語言中的new關鍵字,但在C ++中,它是一個非常不同的野獸。 這意味着創建了Person類型的新對象,但這也意味着您有責任稍后銷毀它 它還為新創建的對象提供了一種不同類型的句柄:一個所謂的指針 Person指針看起來像這樣:

Person*

指針本身就是一個類型, Person*Person類型不兼容。 (我告訴過你這會更復雜:))

當您嘗試編譯以下行時,您會注意到不兼容性:

Person name = new Person();

它不會編譯; 您將收到一條錯誤消息。 你必須這樣做:

Person* name_ptr = new Person();

然后你必須使用不同的語法訪問Person所有成員:

name_ptr->getValue();
name_ptr->callFunction();

最后,請記住在這種情況下必須顯式銷毀對象:

delete name_ptr;

如果你忘了這一點,就會發生不好的事情。 更准確地說,您的程序運行的時間越長,可能會使用越來越多的內存。

我認為指針對於你的C ++理解水平來說還是太先進了。 遠離它們直到你真正需要它們。

對象和實例是同一個東西的兩個單詞。

“對象”和“實例”幾乎可以互換。 在C ++中,對象正式是任何存儲區域。 “實例”不是正式定義的術語,但我們通常稱為“類型X實例”,最常用於類類型。

Foo f;

該聲明創建一個名為f的對象。 對象的類型是Foo 你可以說對象fFoo一個實例。

您嘗試區分這些術語是不正確的。 您實際指出的兩件事是創建對象的兩種不同方式。

Person name;

在這種情況下,我們正在創建Person類型的對象name

Person* name = new Person();

在這種情況下,我們創建一個Person*類型的對象name (指向Person指針)。 我們還使用表達式new Person()創建另一個Person類型的對象。 這個表達式返回一個指針,我們用它初始化name對象。

這很簡單但非常重要

舉一個例子:對象的一般含義是什么? 它只是占據了一些空間......請記住我們現在談論Java或C ++中的Object

例如:這里我正在創建Object Student std = new Student();

其中Student是一個Classstd是一個Object,因為我們在 keyWord的幫助下為std創建了一個內存,這意味着它在內部占用了內存中的一些空間,我們稱之為std as Object

如果你不為對象創建內存,那么我們將該對象稱為實例

例如:學生標准;

這里學生是一個類, std是一個實例(意思是一個只是副本的類),除非我們為此創建一個內存,否則我們不會做任何事情。

多數關於對象和實例:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM