2013-02-20 91 views
1

我該怎麼辦在下面的代碼對象明確初始化...顯式聲明的對象

#include"iostream" 
using namespace std; 

class per{ 
    char *name; 
    int a; 
public: 
    per(int x = 0,char *str = 0):a(x),name(str){} 

    char* get() 
    { 
     return name; 
    } 
}; 
int main() 
{ 

    per obj(100,"test"); // works fine 
    // now if i want a explicit initialization for above how will i do? 
    // example -- per obj = (100,"test"); 
    // but i am getting error or may be not aware how to use 
    return 0; 
} 

回答

1

讓我們來討論什麼是在註釋代碼中的實際問題,即per obj = (100,"test");。這不會被初始化,因爲該語句首先被評估爲100,(我的意思是逗號運算符),然後進行初始化。

so現在的作業per obj = (100,"test");將看起來爲per obj = "test";。這會導致編譯錯誤,因爲預期的第一個參數是int而不是char *。您應該很幸運,因爲編譯問題而將此問題解決。只需改變構造函數中的初始化順序,這將消失。導致一個主要的bug未被注意到。基本上你所期望的以及編譯器如何處理這個語句在這種情況下是不同的。

3

條款如何

per obj = per(100,"test"); 

直接副本初始化

您的初始化也是明確的。

+0

我需要明確的......上面的代碼不起作用......我得到錯誤1> c:\ users \ badshah \ documents \ visual studio 2010 \ projects \ practice \ practice \ smart_class.cpp(34):錯誤C2440:'初始化':無法從'const char *'轉換爲'per' 1>沒有構造函數可以採用源類型,或構造函數重載解析模糊 – 2013-02-20 18:41:31

+0

適用於g ++! – Dilawar 2013-02-20 18:53:56

+1

@Badshah - 你可能會在類中嘗試'const char *',因爲字符串常量是const。 – 2013-02-20 18:56:09

0

如果你的編譯器支持C++ 11,你可以這樣做:

per obj = { 100, "test" }; 
+0

我也試過,但也沒有工作我正在使用Visual C++ Express 2010 – 2013-02-21 02:15:18