源地址:http://topic.csdn.net/u/20100618/16/f505efc3-fcdf-4ca8-a699-b26b8aa7acc4.html  #10楼

关键是意识到学习还是要自己动手主动去验证求解问题

-------------------------------------------------------------------------

当基类中“显示定义了拷贝构造函数和赋值操作符时”
当派生类中“显示定义了拷贝构造函数和赋值操作符时”
如果派生类中的拷贝和赋值构造函数中没有“显示指定基类的拷贝和赋值构造函数”,即:派生类只是把自己的成员进行了赋值

问1:当定义派生类对象时,依次使用派生类的拷贝初始化、赋值操作符时,基类的拷贝构造函数和赋值操作符会不会隐式调用?
只有基类的构造函数会自动调用,拷贝和赋值不会自动调用;派生类拷贝构造时,自动调用的是基类的构造函数而不是拷贝构造函数;
即基类的拷贝和赋值需要显式调用

问2:基类的拷贝初始化、赋值操作符的形参必须是(const 类型 &)吗?如果不是const 或 不是引用,还会隐式调用吗?
可以不是const,但不是引用不行,编译器会报错,不过你没理由不用const

#include <iostream>
using namespace std;

struct Base
{
    int a; 
    Base():a(12){cout<<"Base construct"<<endl;}
    Base (int n):a(n) {}
    //Base(const Base& b):a(b.a) {cout<<"Base copy construct"<<endl;}
    Base(Base& b):a(b.a) {cout<<"Base copy construct"<<endl;}
    //Base(Base b):a(b.a) {cout<<"Base copy construct"<<endl;}//error

    Base & operator=(const Base& b) {a=b.a;cout<<"Base operator ="<<endl;return *this;}  //原程序中漏掉return *this ,因为需要返回自身函数类型的引用
};
struct Derived:public Base
{
    int d;
    Derived():d(7){cout<<"Derived construct"<<endl;}
    Derived(int i,int j):Base(i),d(j) {}

    //Derived(Derived& b):Base(b),d(b.d){cout<<"Derived copy construct"<<endl;}  //正确 参考C++primer P488引用转换
    Derived(Derived& b):d(b.d){cout<<"Derived copy construct"<<endl;}
    //Derived& operator=(const Derived& b){d=b.d;cout<<"Derived operator ="<<endl;}
    Derived & operator=(const Derived& b){d=b.d;Base::operator=(b);cout<<"Derived operator ="<<endl;return *this;}
};

int main(void)
{
    Derived d(3,9),d1(d),d2;//此处创建d2时会调用Base()构造函数,Derived()构造函数

    cout<<d.a<<endl;
    cout<<d1.a<<endl;

    d2=d;
    cout<<d.a<<endl;
    cout<<d2.a<<endl;

    system("pause");  //system("pause")就是从程序里调用“pause”命令;而“pause”这个系统命令的功能很简单,就是在命令行上输出一行类似于“Press any key to exit”的字,等待用户按一个键,然后返回。
    return 0; }

 

 

 

 

posted on 2012-07-18 18:35  nkxyf  阅读(1636)  评论(0编辑  收藏  举报