有关拷贝构造函数

时间:2021-11-28 19:28:23
1 对象是不是不能够象这样赋值
class t1;
class t2;
t2 = t1;
2 在钱能那本书中在使用无名对象中,有一种形式
student refs = "Randy";
这种初始化形式合法吗?

各位高手能不能谈谈对拷贝构造函数的理解

14 个解决方案

#1


你为啥不用拷贝构造函数?

class t1
{
  public t1(t2 t2object)
  {
   ......
  }
}

t2 t2boject new t2(......) ; 
t1 t1object = new t1(t2object) ; 


#2


1.只要你重载了operator=就可以这么赋值
2.student refs = "Randy";
  这种形式就会引发student的一种相应的构造函数的调用

#3


1楼的好像JAVA用得很熟啊~~
问题1:应该可以的,不过如果有自己的拷贝构造函数最好;
问题2:看不懂。

#4


没看到那段代码和JAVA特别有联系呀,C++里面也是这样用.
t1( const t1& a )
{

}

student& student::operator=( const char* p )
{
....
}

#5


2 那种初始化的方法我是在钱能那本书上看到的,所以有点奇怪。
to : akiko(弥弥) 按照他那本书上说确实是调用了相应的构造函数,可是这种写法有什么依据吗?应该怎样解释?

SeainBlue(爱海) 你的代码我好像没看懂。
解释一下好吗?

#6


To:alfredlp(逛荡)

无名对象是通过直接调用构造函数产生的,你的写法有误!!!
应该是:
Student refs = Student("Jenny");

#7


假设有一个
class X
{
public:
X():i(0){}
int i;
};
有以下的代码
double d=1.1;
X x=d;//这时编译器会抱怨找不到合适的构造函数
class中如加上
X(const int& j):i(j){}
X x=d;//这时编译器发现有且只有一个可选的构造函数,但是要做double到int的隐式类型转换,由于有精度的损失,所以会有一个警告.
class中如再加上
X(const double& d):i(int(d)){}
X x=d;//这时编译器发现有且有二个可选的构造函数,由于X(const double& d):i(int(d)){}的类型匹配最好,所以就会调用这个.

由于不知道Student的实现,所以之能说会引发一种相应构造函数的调用.假设编译器发现没有任何一种可选函数,就会抱怨.

#8


同意everandforever(Forever) 的说法

#9


akiko(弥弥) 谢谢你详细的讲解,是不是可以说编译器允许student refs = "Randy";这种格式的初始化,虽然它长得有些奇怪?,另外这条语句确实是在说明无名对象的部分出现的,那是把它看成先建立无名对象再拷贝构造。还是直接看成是调用构造函数?或者它们的效果是等同的?

为什么传递参数的时候大家更偏爱引用的形式?

#10


student refs="Randy";//将调用拷贝构造函数。
refs="Cline";//将调用operator=操作符。

#11


student refs="Randy";//是直接调用最匹配的构造函数,而不是建立无名对象再调用拷贝构造函数.

#12






hMouseProc = (HOOKPROC)GetProcAddress(hinstDLL, "_MyMouseProc@12");


"_MyMouseProc@12“  是什么意思?

#13


hMouseProc = (HOOKPROC)GetProcAddress(hinstDLL, "_MyMouseProc@12");


"_MyMouseProc@12“  是什么意思?=>动态库中的MyMouseProc函数的地址,因为在MyMouseProc函数的定义中没有使用extern "C",所以编译后的函数名称会有变化。在你的例子中,就变成了_MyMouseProc@12,不过这种做法太难读懂,强烈反对!

在DLL的定义中加上extern "C"之后,在GetProcAddress时使用"MyMouseProc"字串即可,可读性要好得多。

#14


好像不是这样的
在dll中是这样定义的
#ifdef HOOK_MOUSE_DLL_EXPORTS
#define HOOK_MOUSE_DLL_API __declspec(dllexport)
#else
#define HOOK_MOUSE_DLL_API __declspec(dllimport)
#endif


extern "C" HOOK_MOUSE_DLL_API LRESULT CALLBACK MyMouseProc(int nCode, WPARAM wParam, LPARAM lParam)

#1


你为啥不用拷贝构造函数?

class t1
{
  public t1(t2 t2object)
  {
   ......
  }
}

t2 t2boject new t2(......) ; 
t1 t1object = new t1(t2object) ; 


#2


1.只要你重载了operator=就可以这么赋值
2.student refs = "Randy";
  这种形式就会引发student的一种相应的构造函数的调用

#3


1楼的好像JAVA用得很熟啊~~
问题1:应该可以的,不过如果有自己的拷贝构造函数最好;
问题2:看不懂。

#4


没看到那段代码和JAVA特别有联系呀,C++里面也是这样用.
t1( const t1& a )
{

}

student& student::operator=( const char* p )
{
....
}

#5


2 那种初始化的方法我是在钱能那本书上看到的,所以有点奇怪。
to : akiko(弥弥) 按照他那本书上说确实是调用了相应的构造函数,可是这种写法有什么依据吗?应该怎样解释?

SeainBlue(爱海) 你的代码我好像没看懂。
解释一下好吗?

#6


To:alfredlp(逛荡)

无名对象是通过直接调用构造函数产生的,你的写法有误!!!
应该是:
Student refs = Student("Jenny");

#7


假设有一个
class X
{
public:
X():i(0){}
int i;
};
有以下的代码
double d=1.1;
X x=d;//这时编译器会抱怨找不到合适的构造函数
class中如加上
X(const int& j):i(j){}
X x=d;//这时编译器发现有且只有一个可选的构造函数,但是要做double到int的隐式类型转换,由于有精度的损失,所以会有一个警告.
class中如再加上
X(const double& d):i(int(d)){}
X x=d;//这时编译器发现有且有二个可选的构造函数,由于X(const double& d):i(int(d)){}的类型匹配最好,所以就会调用这个.

由于不知道Student的实现,所以之能说会引发一种相应构造函数的调用.假设编译器发现没有任何一种可选函数,就会抱怨.

#8


同意everandforever(Forever) 的说法

#9


akiko(弥弥) 谢谢你详细的讲解,是不是可以说编译器允许student refs = "Randy";这种格式的初始化,虽然它长得有些奇怪?,另外这条语句确实是在说明无名对象的部分出现的,那是把它看成先建立无名对象再拷贝构造。还是直接看成是调用构造函数?或者它们的效果是等同的?

为什么传递参数的时候大家更偏爱引用的形式?

#10


student refs="Randy";//将调用拷贝构造函数。
refs="Cline";//将调用operator=操作符。

#11


student refs="Randy";//是直接调用最匹配的构造函数,而不是建立无名对象再调用拷贝构造函数.

#12






hMouseProc = (HOOKPROC)GetProcAddress(hinstDLL, "_MyMouseProc@12");


"_MyMouseProc@12“  是什么意思?

#13


hMouseProc = (HOOKPROC)GetProcAddress(hinstDLL, "_MyMouseProc@12");


"_MyMouseProc@12“  是什么意思?=>动态库中的MyMouseProc函数的地址,因为在MyMouseProc函数的定义中没有使用extern "C",所以编译后的函数名称会有变化。在你的例子中,就变成了_MyMouseProc@12,不过这种做法太难读懂,强烈反对!

在DLL的定义中加上extern "C"之后,在GetProcAddress时使用"MyMouseProc"字串即可,可读性要好得多。

#14


好像不是这样的
在dll中是这样定义的
#ifdef HOOK_MOUSE_DLL_EXPORTS
#define HOOK_MOUSE_DLL_API __declspec(dllexport)
#else
#define HOOK_MOUSE_DLL_API __declspec(dllimport)
#endif


extern "C" HOOK_MOUSE_DLL_API LRESULT CALLBACK MyMouseProc(int nCode, WPARAM wParam, LPARAM lParam)