关于拷贝赋值操作符

zhangyu21101213 2008-11-28 08:59:45
问题一:
C++PRIMER中有这样一段话:

  按成员赋值与按成员初始化类似如果存在一个显式的拷贝赋值操作符则它被调用
用一个类对象向另一个类对象赋值否则应用缺省的按成员赋值.
  如果存在基类则首先对基类子对象按成员赋值如果基类提供了一个显式的拷贝赋值
操作符则调用它否则递归地对基类和基类子对象的成员应用缺省按成员赋值的动作.
  编译器按声明的顺序检查每个非静态数据成员如果它是非类类型则右边的实例被拷
贝到左边如果它是类类型并且该类定义了显式的拷贝赋值操作符则调用该操作符否
则递归地对基类和成员类对象的成员应用缺省按成员赋值的动作.

我的问题是,有一个基来A,和一个其派生类B如下
class A
{
......

}


class B:public A
{
.......
}

那么,请问,在派生类B中可能显示声明operator=也可能不显示声明,而用默认缺省的!那么在这两种情况下,当调用B的operator=(可能是显示的也可能是缺省的)的时候,它会象构造函数那么样,自动调用基类的显示或者缺省operator=吗?还是无论如何都要在B的operator=函数定义中给出基类operator="的调用语句


问题二:

基类的继承访问权限:public private protect,对派生类 对象 指针 引用 赋值给基类 对象 指针 引用(或者说是转换),有影响吗?

...全文
220 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
就呆在云上 2008-12-01
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zhangyu21101213 的回复:]
谢谢,那么它的执行顺序,是不是和构造函数一样?
[/Quote]
一样
zhaoboif 2008-12-01
  • 打赏
  • 举报
回复
up
zhangyu21101213 2008-12-01
  • 打赏
  • 举报
回复
谢谢,那么它的执行顺序,是不是和构造函数一样?
winingsky 2008-11-30
  • 打赏
  • 举报
回复
mark,学习了
就呆在云上 2008-11-30
  • 打赏
  • 举报
回复
当调用B的operator=(可能是显示的也可能是缺省的)的时候,它会象构造函数那么样,自动调用基类的显示或者缺省operator=吗?

第一题的答案: 确实
cba_v 2008-11-30
  • 打赏
  • 举报
回复
up
zhangyu21101213 2008-11-28
  • 打赏
  • 举报
回复
我不是那个意思,我的意思是调用顺序!
toadzw 2008-11-28
  • 打赏
  • 举报
回复
基类的部分用的是基类的opertor=啊,因为其类在定义后与int这些内置类型都是一样的道理啊,C++力求在定义后使所有的类都达到统一;
第二个问题:这就复杂了,你的这个问题中包含了很多的子问题而且都很大;首先你要了解不同的继承属性的意义,一句话,有些影响;你应该再去多看书;
zhangyu21101213 2008-11-28
  • 打赏
  • 举报
回复
谢谢了,怎么没人看呢?
zhangyu21101213 2008-11-28
  • 打赏
  • 举报
回复
我是楼主,请直接给我第一问题的答案!我现在没办法调试,就直接说答案吧!
jackylea 2008-11-28
  • 打赏
  • 举报
回复
我对此也迷惑
vincent_nicole 2008-11-28
  • 打赏
  • 举报
回复
同意楼上
就呆在云上 2008-11-28
  • 打赏
  • 举报
回复

那么,请问,在派生类B中可能显示声明operator=也可能不显示声明,而用默认缺省的!那么在这两种情况下,当调用B的operator=(可能是显示的也可能是缺省的)的时候,它会象构造函数那么样,自动调用基类的显示或者缺省operator=吗?还是无论如何都要在B的operator=函数定义中给出基类operator="的调用语句

基类的=如果你不显式的调用,系统是不会调用的,因此如果你要达到你的目的那么就应该显示的调用基类的构造函数
比如:
#include<iostream>
#include<fstream>
using namespace std;

class base
{
public:
base(int x = 100) {
a = x;
}
base &operator=(const base& temp) {
this->a = temp.a;
return *this;
}
private:
int a;
};

class der : public base
{
public:
der(int x = 1000) : base(x) {
b = x;
}
der &operator=(const der& temp) {
base::operator =(temp);
this->b = temp.b;
return *this;
}
private:
int b;
};

int main()
{
der a;
der b(111);
a = b;
}


有没有
base::operator =(temp);

差别是很大的,楼主自己试试就晓得了


问题二:

基类的继承访问权限:public private protect,对派生类 对象 指针 引用 赋值给基类 对象 指针 引用(或者说是转换),有影响吗?

有的,起码私有的在派生类里面是不可以直接访问的呵呵
hai040 2008-11-28
  • 打赏
  • 举报
回复
why not 写个程序测试一下

64,647

社区成员

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

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