2013-02-20 115 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