向各位老大请教一个类初始化的问题。为啥不掉用我的拷贝构造函数呢。谢谢。

yakeezhao 2011-09-08 04:42:03
下面代码的代码,在VC6及VC2008上测试(我这里只有VC这一种编译器), 结果很奇怪,请各位老大不吝赐教。多谢多谢。

#include <iostream>
using namespace std;
class mystring
{
public:
mystring(char* p = NULL)
{
cout << "mystring(char*) = " << (NULL != p ? p : "NULL") << endl;
if(NULL == p)
{
m_pdata = new char[1];
*m_pdata = 0;
}
else
{
int ilen = strlen(p);
m_pdata = new char[ilen + 1];
strcpy(m_pdata, p);
}
}
~mystring()
{
if(NULL != m_pdata)
{
delete []m_pdata;
m_pdata = NULL;
}
}
mystring(const mystring& obj)
{
cout << "mystring(mystring&) = " << obj.m_pdata << endl;
mystring(obj.m_pdata);
}
const mystring& operator = (const mystring& rhs)
{
cout << "mystring operator = " << rhs.m_pdata << endl;
mystring(rhs.m_pdata);
return *this;
}
public:
char* m_pdata;
};
class mybase
{
public:
virtual ~mybase(){};
mybase() : m_sf8("base")
{
cout << "myfunc8_base : default constructor is necessary in parent class" << endl;
m_sf82 = "base2";
}
private:
mystring m_sf8;
mystring m_sf82;
};
class myderived : public mybase
{
public:
myderived(mystring& sf8) : m_sf8(sf8)
{
cout << "myderived : myderived(mystring&) : m_sf8 = " << m_sf8.m_pdata << endl;
}
private:
const mystring& m_sf8;
};
int main(int argc, char* argv[])
{
mystring ms81("1");
myderived m8d2(ms81);
return 0;
}

运行结果为:
1 -- mystring(char*) = 1
2 -- mystring(char*) = base
3 -- mystring(char*) = NULL
4 -- myfunc8_base : default constructor is necessary in parent class
5 -- mystring(char*) = base2
6 -- mystring operator = base2
7 -- mystring(char*) = base2
8 -- myderived : myderived(mystring&) : m_sf8 = 1

请教:
第 3 行 “mystring(char*) = NULL”是由哪句代码触发的呢?
第 5 行 “mystring(char*) = base2”又是由哪句代码导致的呢?
我觉得那两行结果不该出现啊。倒是代码 ‘myderived(mystring& sf8) : m_sf8(sf8)‘,我觉得应该触发mystring的拷贝构造函数 ’mystring(const mystring& obj)‘,可是这句却没出现。这是怎么一会事啊?类的初始化还真的很晕啊。谢谢各位了。
...全文
225 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yakeezhao 2011-09-08
  • 打赏
  • 举报
回复
终于搞明白了。多谢各位大侠指点,尤其感谢 LCL_data 老大。
m_sf82 = "base2";的确导致输出第 5,6,7 句。
因为我没有定义 const mystring& operator = (const char* p) 的操作。m_sf82 = "base2";在调用const mystring& operator = (const mystring& rhs)的时候,先用"base2"构造出一个临时的mystring实例,才真正调用const mystring& operator = (const mystring& rhs)。

结帖啦。再次感谢大家。 :D
十八道胡同 2011-09-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yakeezhao 的回复:]
引用 6 楼 lcl_data 的回复:

mystring(char*) = NULL 是在初始化mystring m_sf82;


多谢 LCL_data 老大。老大能不能再指点一下 第5行 “mystring(char*) = base2”是怎么回事呢?多谢。
[/Quote]
要理解这个,你先理解下
mystring ms81="1";
cout<<"------------------------------"<<endl;
mystring ms222;
ms222="bbbbbbbb";
cout<<"------------------------------"<<endl;
为什么2种定义mystring 实例的方法调用的方法会不同。。
yakeezhao 2011-09-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lcl_data 的回复:]

引用 7 楼 lcl_data 的回复:
m_sf82 = "base2";
这句触发了mystring的构造函数mystring(char* p = NULL)

和=重载函数
[/Quote]

这样的话,会得到第6行和第7行的输出结果。那么第五行是由谁导致的呢?
十八道胡同 2011-09-08
  • 打赏
  • 举报
回复
mystring ms82=ms81;这样可以调用拷贝构造函数
当用一个已经初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用,
yakeezhao 2011-09-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lcl_data 的回复:]

mystring(char*) = NULL 是在初始化mystring m_sf82;
[/Quote]

多谢 LCL_data 老大。老大能不能再指点一下 第5行 “mystring(char*) = base2”是怎么回事呢?多谢。
十八道胡同 2011-09-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lcl_data 的回复:]
m_sf82 = "base2";
这句触发了mystring的构造函数mystring(char* p = NULL)
[/Quote]
和=重载函数
十八道胡同 2011-09-08
  • 打赏
  • 举报
回复
m_sf82 = "base2";
这句触发了mystring的构造函数mystring(char* p = NULL)
十八道胡同 2011-09-08
  • 打赏
  • 举报
回复
mystring(char*) = NULL 是在初始化mystring m_sf82;
yakeezhao 2011-09-08
  • 打赏
  • 举报
回复
我的意思是说,为什么会有第3行“mystring(char*) = NULL”和第5行 “mystring(char*) = base2的输出呢?

我觉得应该出现"mystring(mystring&) = 1",但是却没有出现?
yakeezhao 2011-09-08
  • 打赏
  • 举报
回复
谢谢老大的回复。可是我还是不太明白。老大能说详细点吗?谢谢
十八道胡同 2011-09-08
  • 打赏
  • 举报
回复
mystring ms81("1");
cout<<"------------------------------"<<endl;
myderived m8d2(ms81);

->

mystring(char*) = 1  1
------------------------------
mystring(char*) = base 1
mystring(char*) = NULL 1
myfunc8_base : default constructor is necessary in parent class
mystring(char*) = base2 1
mystring operator = base2 3
mystring(char*) = base2 1
myderived : myderived(mystring&) : m_sf8 = 1 4
Press any key to continue . . .




十八道胡同 2011-09-08
  • 打赏
  • 举报
回复
// ConsoleApplication15.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <iostream>
using namespace std;
class mystring
{
public:
mystring(char* p = NULL)
{
cout << "mystring(char*) = " << (NULL != p ? p : "NULL") << " "<< 1<<endl;
if(NULL == p)
{
m_pdata = new char[1];
*m_pdata = 0;
}
else
{
int ilen = strlen(p);
m_pdata = new char[ilen + 1];
strcpy(m_pdata, p);
}
}
~mystring()
{
if(NULL != m_pdata)
{
delete []m_pdata;
m_pdata = NULL;
}
}
mystring(const mystring& obj)
{
cout << "mystring(mystring&) = " << obj.m_pdata <<" "<< 2<< endl;
mystring(obj.m_pdata);
}
const mystring& operator = (const mystring& rhs)
{
cout << "mystring operator = " << rhs.m_pdata << " "<<3<<endl;
mystring(rhs.m_pdata);
return *this;
}
public:
char* m_pdata;
};
class mybase
{
public:
virtual ~mybase(){};
mybase() : m_sf8("base")
{
cout << "myfunc8_base : default constructor is necessary in parent class" << endl;
m_sf82 = "base2";
}
private:
mystring m_sf8;
mystring m_sf82;
};
class myderived : public mybase
{
public:
myderived(mystring& sf8) : m_sf8(sf8)
{
cout << "myderived : myderived(mystring&) : m_sf8 = " << m_sf8.m_pdata << " "<< 4<<endl;
}
private:
const mystring& m_sf8;
};
int main(int argc, char* argv[])
{
mystring ms81("1");
myderived m8d2(ms81);
return 0;
}


mystring(char*) = 1 1
mystring(char*) = base 1
mystring(char*) = NULL 1
myfunc8_base : default constructor is necessary in parent class
mystring(char*) = base2 1
mystring operator = base2 3
mystring(char*) = base2 1
myderived : myderived(mystring&) : m_sf8 = 1 4
Press any key to continue . . .

这样清晰了吧
  • 打赏
  • 举报
回复
#include <iostream>  
using namespace std;
class mystring
{
public:
mystring(char* p = NULL)
{
cout << "mystring(char*) = " << (NULL != p ? p : "NULL") << endl;
if(NULL == p)
{
m_pdata = new char[1];
*m_pdata = 0;
}
else
{
int ilen = strlen(p);
m_pdata = new char[ilen + 1];
strcpy(m_pdata, p);
}
}
~mystring()
{
if(NULL != m_pdata)
{
delete []m_pdata;
m_pdata = NULL;
}
}
mystring(const mystring& obj)
{
cout << "mystring(mystring&) = " << obj.m_pdata << endl;
mystring(obj.m_pdata);
}
const mystring& operator = (const mystring& rhs)
{
cout << "mystring operator = " << rhs.m_pdata << endl;
mystring(rhs.m_pdata);
return *this;
}
public:
char* m_pdata;
};
class mybase
{
public:
virtual ~mybase(){};
mybase() : m_sf8("base")
{
cout << "myfunc8_base : default constructor is necessary in parent class" << endl;
m_sf82 = "base2";
}
private:
mystring m_sf8;
mystring m_sf82;
};
class myderived : public mybase
{
public:
myderived(mystring& sf8) : m_sf8(sf8)
{
cout << "myderived : myderived(mystring&) : m_sf8 = " << m_sf8.m_pdata << endl;
}
private:
const mystring& m_sf8;
};
int main(int argc, char* argv[])
{
mystring ms81("1");
myderived m8d2(ms81);
return 0;
}

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧