VC6下没错,见文件:
C:\Program Files\Microsoft Visual Studio\VC98\MFC\Include\AFX.H
class CString
{
public:
// Constructors // constructs empty CString
CString();
// copy constructor
CString(const CString& stringSrc);
// from a single character
CString(TCHAR ch, int nRepeat = 1);
// from an ANSI string (converts to TCHAR)
CString(LPCSTR lpsz);
// from a UNICODE string (converts to TCHAR)
CString(LPCWSTR lpsz);
// subset of characters from an ANSI string (converts to TCHAR)
CString(LPCSTR lpch, int nLength);
// subset of characters from a UNICODE string (converts to TCHAR)
CString(LPCWSTR lpch, int nLength);
// from unsigned characters
CString(const unsigned char* psz);
...
有ANSI和UNICODE的构造函数。
C:\Program Files\Microsoft Visual Studio\VC98\MFC\Include\AFX.H
class CString
{
public:
// Constructors // constructs empty CString
CString();
// copy constructor
CString(const CString& stringSrc);
// from a single character
CString(TCHAR ch, int nRepeat = 1);
// from an ANSI string (converts to TCHAR)
CString(LPCSTR lpsz);
// from a UNICODE string (converts to TCHAR)
CString(LPCWSTR lpsz);
// subset of characters from an ANSI string (converts to TCHAR)
CString(LPCSTR lpch, int nLength);
// subset of characters from a UNICODE string (converts to TCHAR)
CString(LPCWSTR lpch, int nLength);
// from unsigned characters
CString(const unsigned char* psz);
...
有ANSI和UNICODE的构造函数。
VS2005,新建一个SDI工程,在视图类OnDraw里只加这一条语句:
void CdlgView::OnDraw(CDC* /*pDC*/)
{
CdlgDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
CString str="haah"; // TODO: add draw code for native data here
}
编译错误:
Error 1 error C2440: 'initializing' : cannot convert from 'const char [5]' to 'ATL::CStringT<BaseType,StringTraits>' d:\my documents\visual studio 2005\projects\dlg\dlg\dlgview.cpp 54
CStriing str("haha”)//不报错,因为CString有重载了参数类型为char*类型的构造函数
{
CdlgDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
CString str= TEXT("haah");
// TODO: add draw code for native data here
}
注意: 你第一个解释是错的. CString str="haha" 这里是初始化,不是赋值. 只会调用复制构造函数, 不会调用赋值操作符.
注意: 你第一个解释是错的. CString str="haha" 这里是初始化,不是赋值. 只会调用复制构造函数, 不会调用赋值操作符.是吗?那能否解释一下,啥是复制构造函数啊?复制构造函数不是说,唯一的参数类型是另一个同类型对象的引用吗?
详细请看这里: http://blog.chinaunix.net/uid-25808509-id-354211.htmlCString str="haha" 会先把"haha"生成临时对象, 再调用复制构造函数拷备到str中.想要调用 = 这个赋值符号需要这样:CString Str;
Str = "haha" // 这里才会调用=号, 如果CString中有相关的=号重载,则能正常调用, 没有则会报错.总之要分清初始化与赋值的区别.按我的理解方式: 变量在定义时的=号都是初始化, 而非赋值,
或者:
const char* s = "haah"; // char s[] = "haah"; 这样也可以用,但是两种方式变量s代表的意义不一样,不过不影响下面的赋值
CString str = s;
详细请看这里: http://blog.chinaunix.net/uid-25808509-id-354211.htmlCString str="haha" 会先把"haha"生成临时对象, 再调用复制构造函数拷备到str中.想要调用 = 这个赋值符号需要这样:CString Str;
Str = "haha" // 这里才会调用=号, 如果CString中有相关的=号重载,则能正常调用, 没有则会报错.总之要分清初始化与赋值的区别.按我的理解方式: 变量在定义时的=号都是初始化, 而非赋值,
你这个说法应该也不对,我做了一下测试,class aString
{
public:
TCHAR* pChar;
aString()
{}
aString(aString& s)
{
int l=STRLEN(s.pChar);
pChar=new TCHAR[l+1];
STRCOPY(pChar,s.pChar);
} aString(char*s)
{
operator=(s);
} void operator=(char*s)
{
int l=0;
#ifdef _UNICODE
l=MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,s,-1,NULL,0);
pChar=new TCHAR[l];
MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,s,-1,pChar,l);
#else
int l=strlen(s);
pChar=new char[l+1];
strcpy(pChar,s);
#endif
}
};void CMyTestPrj2View::OnTest632889()
{
aString s="abc";
}其在执行aString s="abc";的时候,运行直接调用 aString(char*s),没有经过拷贝构造,检查s的地址,在执行aString(char*s)时的this地址就是 aString s="abc";中的s地址,你可以试试看
详细请看这里: http://blog.chinaunix.net/uid-25808509-id-354211.htmlCString str="haha" 会先把"haha"生成临时对象, 再调用复制构造函数拷备到str中.想要调用 = 这个赋值符号需要这样:CString Str;
Str = "haha" // 这里才会调用=号, 如果CString中有相关的=号重载,则能正常调用, 没有则会报错.总之要分清初始化与赋值的区别.按我的理解方式: 变量在定义时的=号都是初始化, 而非赋值,
CString str = "haha" 应该是调用有一个const char *参数的构造函数,不是调用复制构造函数。
详细请看这里: http://blog.chinaunix.net/uid-25808509-id-354211.htmlCString str="haha" 会先把"haha"生成临时对象, 再调用复制构造函数拷备到str中.想要调用 = 这个赋值符号需要这样:CString Str;
Str = "haha" // 这里才会调用=号, 如果CString中有相关的=号重载,则能正常调用, 没有则会报错.总之要分清初始化与赋值的区别.按我的理解方式: 变量在定义时的=号都是初始化, 而非赋值,
怎么可能会调用复制构造函数?
应该是调用有const char *参数的类型转换构造函数才对吧。
Error 1 error C2440: 'initializing' : cannot convert from 'const char *' to 'ATL::CStringT<BaseType,StringTraits>' d:\my documents\visual studio 2005\projects\dlg\dlg\dlgview.cpp 55
Error 1 error C2440: 'initializing' : cannot convert from 'const char *' to 'ATL::CStringT<BaseType,StringTraits>' d:\my documents\visual studio 2005\projects\dlg\dlg\dlgview.cpp 55
早说你还在用2005嘛,被1楼的代码给误导了,两个VS版本的CString实现是不一样的,版本越高,功能越多,早期版本的CString的构造和赋值没有实现A/W互转,所以需要自己找其它方法转换。
可以使用CA2T宏转换 CString str = CA2T("haah");
或者用_bstr_tr自动转换 CString str = _bstr_t("haah");
确实, 不是调用复制构造, 是我理解错了. 看来又得复习下基础了.这种初始化是直接调用对应的构造函数, 而不需要调用复制构造函数.确实如果按我理解的, 要先创建临时对象, 再调用复制构造函数, 那就太多余了.我理解的:
CString str("haha");
CString str="haha";应该是调用同一个构造函数。可似乎VS2005下不是这样啊。
Error 1 error C2440: 'initializing' : cannot convert from 'const char *' to 'ATL::CStringT<BaseType,StringTraits>' d:\my documents\visual studio 2005\projects\dlg\dlg\dlgview.cpp 55
早说你还在用2005嘛,被1楼的代码给误导了,两个VS版本的CString实现是不一样的,版本越高,功能越多,早期版本的CString的构造和赋值没有实现A/W互转,所以需要自己找其它方法转换。
可以使用CA2T宏转换 CString str = CA2T("haah");
或者用_bstr_tr自动转换 CString str = _bstr_t("haah");CString str("haha");
CString str="haha";
不是调用同一个构造函数吗?为什么一个错一个不错?
Error 1 error C2440: 'initializing' : cannot convert from 'const char *' to 'ATL::CStringT<BaseType,StringTraits>' d:\my documents\visual studio 2005\projects\dlg\dlg\dlgview.cpp 55
早说你还在用2005嘛,被1楼的代码给误导了,两个VS版本的CString实现是不一样的,版本越高,功能越多,早期版本的CString的构造和赋值没有实现A/W互转,所以需要自己找其它方法转换。
可以使用CA2T宏转换 CString str = CA2T("haah");
或者用_bstr_tr自动转换 CString str = _bstr_t("haah");CString str("haha");
CString str="haha";
不是调用同一个构造函数吗?为什么一个错一个不错?
构造函数中把"haha"转换成了正确的值再赋给成员变量,而=操作符没有这个功能。你可以从CString派生一个类,重载=操作符来解决这个问题。
Error 1 error C2440: 'initializing' : cannot convert from 'const char *' to 'ATL::CStringT<BaseType,StringTraits>' d:\my documents\visual studio 2005\projects\dlg\dlg\dlgview.cpp 55
早说你还在用2005嘛,被1楼的代码给误导了,两个VS版本的CString实现是不一样的,版本越高,功能越多,早期版本的CString的构造和赋值没有实现A/W互转,所以需要自己找其它方法转换。
可以使用CA2T宏转换 CString str = CA2T("haah");
或者用_bstr_tr自动转换 CString str = _bstr_t("haah");CString str("haha");
CString str="haha";
不是调用同一个构造函数吗?为什么一个错一个不错?
构造函数中把"haha"转换成了正确的值再赋给成员变量,而=操作符没有这个功能。你可以从CString派生一个类,重载=操作符来解决这个问题。我验证下来,按照C++的语法,CString str="haha";
这样的语句调用相应参数的构造函数,不会调用=运算符函数。
Error 1 error C2440: 'initializing' : cannot convert from 'const char *' to 'ATL::CStringT<BaseType,StringTraits>' d:\my documents\visual studio 2005\projects\dlg\dlg\dlgview.cpp 55
早说你还在用2005嘛,被1楼的代码给误导了,两个VS版本的CString实现是不一样的,版本越高,功能越多,早期版本的CString的构造和赋值没有实现A/W互转,所以需要自己找其它方法转换。
可以使用CA2T宏转换 CString str = CA2T("haah");
或者用_bstr_tr自动转换 CString str = _bstr_t("haah");CString str("haha");
CString str="haha";
不是调用同一个构造函数吗?为什么一个错一个不错?
构造函数中把"haha"转换成了正确的值再赋给成员变量,而=操作符没有这个功能。你可以从CString派生一个类,重载=操作符来解决这个问题。我验证下来,按照C++的语法,CString str="haha";
这样的语句调用相应参数的构造函数,不会调用=运算符函数。
不能确定每个MFC版本的CString是不是调用同个构造函数
Error 1 error C2440: 'initializing' : cannot convert from 'const char *' to 'ATL::CStringT<BaseType,StringTraits>' d:\my documents\visual studio 2005\projects\dlg\dlg\dlgview.cpp 55
早说你还在用2005嘛,被1楼的代码给误导了,两个VS版本的CString实现是不一样的,版本越高,功能越多,早期版本的CString的构造和赋值没有实现A/W互转,所以需要自己找其它方法转换。
可以使用CA2T宏转换 CString str = CA2T("haah");
或者用_bstr_tr自动转换 CString str = _bstr_t("haah");CString str("haha");
CString str="haha";
不是调用同一个构造函数吗?为什么一个错一个不错?
构造函数中把"haha"转换成了正确的值再赋给成员变量,而=操作符没有这个功能。你可以从CString派生一个类,重载=操作符来解决这个问题。我验证下来,按照C++的语法,CString str="haha";
这样的语句调用相应参数的构造函数,不会调用=运算符函数。
不能确定每个MFC版本的CString是不是调用同个构造函数按照C++的语法,这两个语句是不是调用同一个构造函数?