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情況的不同做了一個討論,若有問題,麻煩大家指出,謝謝。
相關推薦
js中var 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++ 中求反正切的函式atan和atan2的差別?
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,因此這三條效果上等價,但是第一條是分配在