CString my2(my);调用默认拷贝构造函数num++;不会被执行。这种情况需要自己实现深拷贝构造函数,重载赋值运算符拷贝构造函数的参数为什么是引用呢?CString::CString(constString& s);因为按引用传递不产生对象副本,如果按值传递, 则拷贝构造函数还要调用拷贝构造函数,形成递归调用。
void AllocBuffer(int nLen); //给CStringData分配内存,不带记数器 void CopyBeforeWrite(); //带引用记数的复制自己深拷贝 void AllocBeforeWrite(int nLen); //给CStringData分配内存,带记数器 void AssignCopy(int nSrcLen, LPCTSTR lpszSrcData);//分配内存,并拷贝lpszSrcData内容 //把nCopyIndex开始...
LPTSTR GetBuffer(int nMinBufLength); //重新分配内存,在拷贝原来的数据 void ReleaseBuffer(int nNewLength=-1); //在[nNewLength]='/0',对内存大小没有改变 LPTSTR GetBufferSetLength(int nNewLength); //重新分配内存,在拷贝原来的数据 void FreeExtra(); //深拷贝自己,然后--原来的引用记数器 LPTSTR Lo...
LPTSTR GetBuffer(int nMinBufLength); //重新分配内存,在拷贝原来的数据 void ReleaseBuffer(int nNewLength=-1); //在[nNewLength]='\0',对内存大小没有改变 LPTSTR GetBufferSetLength(int nNewLength); //重新分配内存,在拷贝原来的数据 void FreeExtra(); //深拷贝自己,然后--原来的引用记数器 LPTSTR Lo...
Mystring& operator=(const Mystring& s) {//对=进行深拷贝。if (str = s.str)//判断两个字符串是否相等return *this;//相等则无需完成赋值操作,直接返回。if (str)//当字符串未被赋值时,判断其是否为空,不为空,则删除它的的空间delete[] str;if (s.str) {str = new char[strlen(s.str) + ...
没有定义实现深层复制(深拷贝)的复制构造函数 C. 构造对象a时实参与形参类型不符 D. 系统不能生成默认的复制构造函数 相关知识点: 试题来源: 解析 B C++语言中当一个新对象被另一个已存在的同类型对象初始化时要调用复制构造函数,语句'MyS-trmg b(a),"符合此条件将调用类MyString的复制构造函数,但是...
原型: char* strcpy (char *s1, const char *s2); 作用: 将字符串 2 复制到字符数组 1 当中去 说明: 字符数组 1 的长度应不小于字符串2的长度 “字符数组 1″ 必须写成数组名形式,”字符串 2” 可以为字符数组名,也可以是一个字符串常量
LPTSTR GetBufferSetLength(int nNewLength);//重新分配内存,在拷贝原来的数据 void FreeExtra();//深拷贝自己,然后--原来的引用记数器 LPTSTR LockBuffer();//引用计数器=-1,加锁 void UnlockBuffer();//解锁,引用计数器=1 //比较 int Compare(LPCTSTR lpsz) const;//区分大小写比较 ...
BSTR是非引用计数的,两次引用同一字符串的内容必须指向两个单独的BSTR,也就是说BSTR本身实现的是深拷贝。 按照COM规则,调用者负责释放传出[out]参数的内容。 CComVariant定义了33个赋值函数,所有都有如下步骤: 释放当前资源 设置新的vt 储存数据 所以下面代码会抛出异常: ...
可以用CString.Format("%s",char *)这个方法来将char *转成CString。 或者: CString strtest; char * charpoint; charpoint="give string a value"; strtest=charpoint; // 直接赋值 ///cstring TO char * 要把CString转成char *,用操作符(LPCSTR)CString就可以了。