我用的visual C++ 2003,是不是编译器的问题呢?
class A{
public:
A():a(0){cout<<"A's default constructor!"<<endl;}
A(int i):a(i){cout<<"A's constructor:a="<<a<<endl;}
A(A &obj){a = obj.a;cout<<"A's copy constructor!"<<endl;}
A& operator=(A&src){
if(this!=&src){
a = src.a;
}
cout<<"eweqeqe"<<endl;
return *this;
}
virtual ~A(){cout<<"A's destructor!"<<endl;}
private:
int a;
};
class B:public A{
public:
B():b(0){cout<<"B's default constructor!"<<endl;}
B(int i,int j):b(j),A(i){cout<<"B's constructor:a="<<i<<",b="<<j<<endl;}
B(B &obj):A(obj),b(obj.b){cout<<"B's copy constructor!"<<endl;}
B& operator=(B&src){
if(this!=&src){
A::operator =(src);
b = src.b;
}
cout<<"ssasasa"<<endl;
return *this;
}
~B(){cout<<"B's destructor!"<<endl;}
private:
int b;
};
……………………………………………………………………………………
测试代码如下:
B b1(2,6);
A a1 = b1;
输出结果:
#############################
A's constructor:a=2
B's constructor:a=2,b=6
A's copy constructor!
A's destructor!
B's destructor!
A's destructor!
############################
5 个解决方案
#1
A a1 = b1;
这样的代码是永远不会调用赋值操作符的^_^
请楼主牢记
A a1 = b1;//这样的话,必然是调用拷贝构造函数(这是规定,请别问为什么)
A a1;
a1 = b1 ; //这样的话,就是调用赋值函数了……
A a1 = b1;这叫做用b1的值 初始化a1,而不是把b1的值 赋给a1^_^
这样的代码是永远不会调用赋值操作符的^_^
请楼主牢记
A a1 = b1;//这样的话,必然是调用拷贝构造函数(这是规定,请别问为什么)
A a1;
a1 = b1 ; //这样的话,就是调用赋值函数了……
A a1 = b1;这叫做用b1的值 初始化a1,而不是把b1的值 赋给a1^_^
#2
编译器一般在高级的问题的实现上可能有分歧,对这种低级问题肯定是自己的问题,要么是自己的理解问题,要么是自己的实现问题。
就搂主这个提问是很基础的,但是也是新手经常迷惑的地方,建议版里弄个FAQ把这些每月出现频率大于5次的问题扔到FAQ
#3
1楼说得很对,正解
#4
(1)A a1 = b1; 好的,如果调用的是赋值操作符,那就相当于a1.operator=(b1)。那a1对象是怎么来的,不可能从天上掉下来,是吧。如果不先把a1对象构造出来,怎么给它赋值呢?因为这个语句要做的事就是创建一个a1对象并用b1初始化它,那既然要创建对象,当然就要调用构造函数了。所以这条语句是直接调用拷贝构造函数A(b1)来创建a1。
(2)A a1;
a1 = b1;
这个很好理解,第1句是调用默认的无参构造函数创建了一个对象a1,是吧。第2句呢,a1对象已经存在了,那a1=b1就相当a1.operator=(b1),调用它的赋值操作符把b1赋值给a1,这里不可能调用拷贝构造函数,是吧,构造函数是用来构造新对象的,这里需要构造什么新对象吗?
其实记住一点就够了,当有一个新对象被定义时,肯定有某个构造函数被调用了。
(2)A a1;
a1 = b1;
这个很好理解,第1句是调用默认的无参构造函数创建了一个对象a1,是吧。第2句呢,a1对象已经存在了,那a1=b1就相当a1.operator=(b1),调用它的赋值操作符把b1赋值给a1,这里不可能调用拷贝构造函数,是吧,构造函数是用来构造新对象的,这里需要构造什么新对象吗?
其实记住一点就够了,当有一个新对象被定义时,肯定有某个构造函数被调用了。
#5
非常感谢楼上各位的解答~~很详细,谢谢
#1
A a1 = b1;
这样的代码是永远不会调用赋值操作符的^_^
请楼主牢记
A a1 = b1;//这样的话,必然是调用拷贝构造函数(这是规定,请别问为什么)
A a1;
a1 = b1 ; //这样的话,就是调用赋值函数了……
A a1 = b1;这叫做用b1的值 初始化a1,而不是把b1的值 赋给a1^_^
这样的代码是永远不会调用赋值操作符的^_^
请楼主牢记
A a1 = b1;//这样的话,必然是调用拷贝构造函数(这是规定,请别问为什么)
A a1;
a1 = b1 ; //这样的话,就是调用赋值函数了……
A a1 = b1;这叫做用b1的值 初始化a1,而不是把b1的值 赋给a1^_^
#2
编译器一般在高级的问题的实现上可能有分歧,对这种低级问题肯定是自己的问题,要么是自己的理解问题,要么是自己的实现问题。
就搂主这个提问是很基础的,但是也是新手经常迷惑的地方,建议版里弄个FAQ把这些每月出现频率大于5次的问题扔到FAQ
#3
1楼说得很对,正解
#4
(1)A a1 = b1; 好的,如果调用的是赋值操作符,那就相当于a1.operator=(b1)。那a1对象是怎么来的,不可能从天上掉下来,是吧。如果不先把a1对象构造出来,怎么给它赋值呢?因为这个语句要做的事就是创建一个a1对象并用b1初始化它,那既然要创建对象,当然就要调用构造函数了。所以这条语句是直接调用拷贝构造函数A(b1)来创建a1。
(2)A a1;
a1 = b1;
这个很好理解,第1句是调用默认的无参构造函数创建了一个对象a1,是吧。第2句呢,a1对象已经存在了,那a1=b1就相当a1.operator=(b1),调用它的赋值操作符把b1赋值给a1,这里不可能调用拷贝构造函数,是吧,构造函数是用来构造新对象的,这里需要构造什么新对象吗?
其实记住一点就够了,当有一个新对象被定义时,肯定有某个构造函数被调用了。
(2)A a1;
a1 = b1;
这个很好理解,第1句是调用默认的无参构造函数创建了一个对象a1,是吧。第2句呢,a1对象已经存在了,那a1=b1就相当a1.operator=(b1),调用它的赋值操作符把b1赋值给a1,这里不可能调用拷贝构造函数,是吧,构造函数是用来构造新对象的,这里需要构造什么新对象吗?
其实记住一点就够了,当有一个新对象被定义时,肯定有某个构造函数被调用了。
#5
非常感谢楼上各位的解答~~很详细,谢谢