1. 程式人生 > >c++中int a, int *a=new int和 int *a=new int()

c++中int a, int *a=new int和 int *a=new int()

首先有以下3條程式碼:

int a1;

int *a2=new int;

int *a3=new int();

這裡分一個情況來討論,似乎c++ 98中和c++11中情況不同,分別輸出這些引數,會發現

c++11中每次輸出時,均是0,因此這三條效果上等價,但是第一條是分配在棧空間中,而後面兩條則是在堆空間中。

但根據網上的資料,博主並未進行嘗試,在c++ 98的編譯器中,這三條是不同的,每次a1會輸出一個不定的固定值,a2是不同的數值,a3則是一直為0,根據資料說明,原因在於:

1)a1在棧空間中,編譯器總是會分配當前為空的棧地址,而每次執行時狀況幾乎相同,因此一直分配同一個棧。

 2)和3)對於POD型別,C++98中new TYPE; 分配的TYPE例項的具體 indeterminate value (不確定的值)而 new TYPE(); 則執行 zero-initialize而 C++03中,new TYPE(); 執行 value-initilize,結果卻還是 zero-initilize另外對於沒有顯示宣告建構函式的非POD型別,new TYPE 與 new TYPE() 也是不一樣的,後者會逐欄位zero-initialize而前者不會。

特別注意最後一句,對於非內建型別,c++11中的情況為:若建構函式沒有引數,則()可以省略,因此new Type和new Type()是完全一樣的。

本文僅根據網上的c++98和c++11情況的不同做了一個討論,若有問題,麻煩大家指出,謝謝。

相關推薦

jsvar a=new Object()var a={}有什麽區別嗎?

ext 語言 details () targe new 簡易 end 屬性 應該是沒有區別的,兩者都是生成一個默認的Object對象。js和其它語言一樣,一切對象的基類都是Object,所以,new Object()和簡易的{}是同樣的空對象,就是默認的對象。本來我以為{}

C#對於變量的聲明初始化

最好 編譯 return 它的 con code 數據 類型安全 狀態   C#變量初始化是C#強調安全性的另一個例子。簡單地說,C#編譯器需要用某個初始值對變量進行初始化,之後才能在操作中引用該變量。大多數現代編譯器把沒有初始化標記為警告,但C#編譯器把它當作錯誤來看待。

c#的delegate(委托)event(事件)

sel 指針 添加 自動 關鍵字 only cnblogs 私有 part 委托: 托付其他人做這件事 ,包括 托付自己 ,即 一個方法 可以 調用 沒有關系的其他方法 , 也可以 將委托傳遞過去 ,回調自己的方法 ,且 可以自定義參數 ,非常方便 互相傳值, 適

C++引用(&)的用法應用實例

發的 高效 結果 特殊情況 副本 推薦 全局變量 對象的引用 間接 對於習慣使用C進行開發的朋友們,在看到c++中出現的&符號,可能會犯迷糊,因為在C語言中這個符號表示了取地址符,但是在C++中它卻有著不同的用途,掌握C++的&符號,是提高代碼執行效率和增強

【轉】C++const在函數名前面函數後面的區別

const成員函數 調用 參數傳遞 成員 指向 int 區別 ... urn 一、概念   當const在函數名前面的時候修飾的是函數返回值,在函數名後面表示是常成員函數,該函數不能修改對象內的任何成員,只能發生讀操作,不能發生寫操作。 二、原理:   我們都知道在調用

.Net: C#的委托(Delegate)事件(Event)

一道 中大 每次 summary lang tro 避免 strong lse 委托和事件在 .Net Framework中的應用非常廣泛,然而,較好地理解委托和事件對很多接觸C#時間不長的人來說並不容易。它們就像是一道檻兒,過了這個檻的人,覺得真 是太容易了,而沒有過去的

c++模板的實現(模板類模板函數)

c++ 模板實例化 泛型編程 [TOC] 模板  當我們實現一個交換函數時,我們可以寫成如下。 void Swap(int& x, int& y) { int tmp = x; x = y; y = tmp; }  這裏只能交換兩個整

我的女朋友漏電了–論C++的失敗(failure),缺陷(bug)異常(exception)

c++先做個廣告置入,如果喜歡這篇文章,你可以到 zhaoyan.website/blog 去查看於此類似的C/C++文章。我承認有點標題黨了,不過這真的是一篇寫軟件的文章,所以如果你已經抽出了一張面巾紙,那麽趁早再把它完美的放回去。這篇軟件文章很軟,源代碼不多,而且大部分都是偽代碼。所以很適合所有人看。我特

C++帶有預設引數的宣告定義。Qt重寫預設建構函式。C++函式呼叫時實參個數函式定義時的形參個數不一致時的處理。

1、Qt中自動生成的建構函式 (1)Qt中自動生成的建構函式的宣告 class Chat : public QWidget { Q_OBJECT public: explicit Chat(QWidget *parent = 0); //宣告建構函式,可以帶有初始值“=0”

C++的虛表(vtable)虛指標(vptr)示例詳解

1、每個有virtual函式的c++類都有一個vtable,每個類物件都有個vtable的vptr; 2、在vc中,類的繼承是在基類後面追加資料的形式進行繼承的。 測試程式碼如下(在32位系統下的vs2008環境中測試的): class Test { publi

C++讓人忽視的左值右值

前言 為了瞭解C++11的新特性右值引用,不得不重新認識一下左右值。學習之初,最快的理解,莫過於望文生義了,右值那就是賦值號右邊的值,左值就是賦值號左邊的值。在中學的數學的學習中,我們理解的是,左值等價於等號左邊的值,右值等價於等號右邊的值;當我們繼續學習C語言時,等號=不再叫等號,蓋頭換面叫做

c++的匿名物件的去留問題深拷貝淺拷貝

匿名物件的去和留問題: 匿名物件的去和留主要取決於你用什麼去接收這個物件, 具體如下: # include <iostream> using namespace std; class

c++的位運算相關規律總結口訣

位運算應用口訣清零取反要用與,某位置一可用或若要取反和交換,輕輕鬆鬆用異或 左移與右移--<<與>> a<<n <=> a*(2^n)  例如:a<<1 <=> a*2 a>>n <=

C++過載、重寫(覆蓋)隱藏的區別例項分析

本文例項講述了C++中過載、重寫(覆蓋)和隱藏的區別,對於C++面向物件程式設計來說是非常重要的概念。具體分析如下: 1.過載:過載從overload翻譯過來,是指同一可訪問區內被宣告的幾個具有不同引數列(引數的型別,個數,順序不同)的同名函式,根據引數列表確定呼叫哪個函式,過載不關心函式返回型

c++ 求反正切的函式atanatan2的差別?

atan2 返回給定的 X 及 Y 座標值的反正切值。反正切的角度值等於 X 軸與通過原點和給定座標點 (Y座標, X座標) 的直線之間的夾角。結果以弧度表示並介於 -pi 到 pi 之間(不包括 -pi)。 atan2(a, b) 與 atan(a/b)稍有不同,atan2(a,b)的取值範圍介於

控制C++ cout及print輸出的評論回答

論壇的lhslktg朋友發了一個貼,大意是說在他的程式裡面呼叫了很多的cout的輸出,是否能夠使用最快速的方法,使得程式的輸出能夠定向到一個檔案內。我理解這個所謂的快速的方法,就是儘量不要改動原有的程式,至少不要改動程式的內部,而達到這個功能。 有朋友給了一個最好的辦法,就

C#連線SqlServer資料庫並且使用事務using語句的例項

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlClient; namespace test2 {

C++過載、重寫(覆蓋)隱藏的區別

基本概念: 過載:是指同一可訪問區內被宣告的幾個具有不同引數列(引數的型別,個數,順序不同)的同名函式,根據引數列表確定呼叫哪個函式,過載不關心函式返回型別。 示例: class A{ public: void test(int i); voi

c++set的使用:初始化去重、排序

1.set的初始化可以直接用迭代器,set的定義和初始化方式包括: set<T> s;set<T> s(s1);set<T> s(b, e); 其中,b和e分別為迭代器的開始和結束的標記。 例如: #include <stdi

c++int a, int *a=new int int *a=new int()

首先有以下3條程式碼: int a1; int *a2=new int; int *a3=new int(); 這裡分一個情況來討論,似乎c++ 98中和c++11中情況不同,分別輸出這些引數,會發現 c++11中每次輸出時,均是0,因此這三條效果上等價,但是第一條是分配在