构造函数复制构造函数经典问题

◆由于构造函数不能被继承,因此,派生类的构造函数中除了对派生类中数据成员进行初始化外,还必须通过调用直接基类的构造函数来对基类中数据成员初 始化,一般地将,对派生类中数据成员初始化放在该派生类构造函数的函数体内,而调用基类构造函数的基类中数据成员初始化放在该构造函数的成员初始化表中。 派生类构造函数的格式如下表示:

<派生类构造函数名>(<参数表>) : <成员初始化表>

{

<派生类构造函数的函数体>

}

其中,<派生类构造函数名>同该派生类的类名。<成员初始化表>中包含如下的初始化项:

①基类的构造函数,用来给基类中数据成员初始化;

②子对象的类的构造函数,用来给派生类中子对象的数据成员初始化;

③派生类中常成员的初始化。

<派生类构造函数的函数体>用来给派生类中的数据成员初始化。

派生类构造函数的调用顺序如下:

①基类构造函数;

②子对象的构造函数;

③成员初始化表中其他初始化项;

④派生类构造函数的函数体。

派生类中析构函数

由于析构函数也不能继承,因此派生类的析构函数中将调用直接基类的析构函数。执行派生类析构函数的顺序正好与指向派生类的构造函数的顺序相反。先调用派生类的析构函数,再调用子对象类的析构函数,最后调用直接基类的析构函数。

#include<iostream>
using namespace std;
class A
{
public:
	A(int x=0)
	{
		a=x;
		cout<<"A Constructor"<<endl;
	}
	A(A&t)
	{
		cout<<"A COPY"<<endl;
	}
	~A()
	{
		cout<<"A Destructor"<<endl;
	}
	void display()
	{
		cout<<a<<endl;
	}
private:
	int a;
};
class B:public A
{
public:
	B(int i):A(i)//B(A i):aa(i)
	{
	    cout<<"B Constructor"<<endl;
	}
	~B()
	{
        cout<<"B Destructor"<<endl;
	}
private:
	A aa;
};
int main()
{

	B b(33);
	b.display();
   return 0;
}

结果:

A Constructor

A Constructor

B Constructor

33

B Destructor

A Destructor

A Destructor

#include<iostream>
using namespace std;
class A
{
public:
	A(int x=0)
	{
		a=x;
		cout<<"A Constructor"<<endl;
	}
	A(A&t)
	{
		cout<<"A COPY"<<endl;
	}
	~A()
	{
		cout<<"A Destructor"<<endl;
	}
	void display()
	{
		cout<<a<<endl;
	}
private:
	int a;
};
class B:public A
{
public:
	B(int i):aa(i)
	{
	    cout<<"B Constructor"<<endl;
	}
	~B()
	{
        cout<<"B Destructor"<<endl;
	}
private:
	A aa;
};
int main()
{

	B b(33);

   return 0;
}

结果:

A Constructor

A Constructor

B Constructor

B Destructor

A Destructor

A Destructor

#include<iostream>
using namespace std;
class A
{
public:
	A(int x=0)
	{
		a=x;
		cout<<"A Constructor"<<endl;
	}
	A(A&t)
	{
		cout<<"A COPY"<<endl;
	}
	~A()
	{
		cout<<"A Destructor"<<endl;
	}
	void display()
	{
		cout<<a<<endl;
	}
private:
	int a;
};
class B:public A
{
public:
	B(A i):aa(i)
	{
	    cout<<"B Constructor"<<endl;
	}
	~B()
	{
        cout<<"B Destructor"<<endl;
	}
private:
	A aa;
};
int main()
{

	B b(33);

   return 0;
}

结果:

A Constructor

A Constructor

A COPY

B Constructor

A Destructor

B Destructor

A Destructor

A Destructor

#include<iostream>
using namespace std;
class A
{
public:
	A(int x=0)
	{
		a=x;
		cout<<"A Constructor"<<endl;
	}
	A(A&t)
	{
		cout<<"A COPY"<<endl;
	}
	~A()
	{
		cout<<"A Destructor"<<endl;
	}
	void display()
	{
		cout<<a<<endl;
	}
private:
	int a;
};
class B:public A
{
public:
	B(A &i):aa(i)//B(A i):aa(i)
	{
	    cout<<"B Constructor"<<endl;
	}
	~B()
	{
        cout<<"B Destructor"<<endl;
	}
private:
	A aa;
};
int main()
{

	A a(3);

	B b(a);
	b.display();

   return 0;
}

结果:

A Constructor

A Constructor

A COPY

B Constructor

0

B Destructor

A Destructor

A Destructor

A Destructor

#include<iostream>
using namespace std;
class A
{
public:
	A(int x=0)
	{
		a=x;
		cout<<"A Constructor"<<endl;
	}
	A(A&t)
	{
		cout<<"A COPY"<<endl;
	}
	~A()
	{
		cout<<"A Destructor"<<endl;
	}
	void display()
	{
		cout<<a<<endl;
	}
private:
	int a;
};
class B:public A
{
public:
	B(A i):aa(i)//B(A i):aa(i)
	{
	    cout<<"B Constructor"<<endl;
	}
	~B()
	{
        cout<<"B Destructor"<<endl;
	}
private:
	A aa;
};
int main()
{

	A a(3);

	B b(a);
	b.display();

   return 0;
}

结果:

A Constructor

A COPY

A Constructor

A COPY

B Constructor

A Destructor

0

B Destructor

A Destructor

A Destructor

A Destructor

#include<iostream>
using namespace std;
class A
{
public:
	A(int x=0)
	{
		a=x;
		cout<<"A Constructor"<<endl;
	}
	A(A&t)
	{
		cout<<"A COPY"<<endl;
	}
	~A()
	{
		cout<<"A Destructor"<<endl;
	}
	void display()
	{
		cout<<a<<endl;
	}
private:
	int a;
};
class B:public A
{
public:
	B(){cout<<"B Constructor"<<endl;}
	~B()
	{
        cout<<"B Destructor"<<endl;
	}

private:
	A aa;
};
int main()
{
	B b;
   return 0;
}

结果:

A Constructor

A Constructor

B Constructor

B Destructor

A Destructor

A Destructor

时间: 2024-10-12 20:58:30

构造函数复制构造函数经典问题的相关文章

C++学习基础六——复制构造函数和赋值操作符

1.什么是复制构造函数 复制构造函数:是构造函数,其只有一个参数,参数类型是所属类的类型,且参数是一个const引用. 作用:将本类的成员变量赋值为引用形参的成员变量. 2.什么是赋值操作符 赋值操作符:返回值是本类的引用类型,参数类型是所属类的类型,且参数是一个const引用. 作用与复制构造函数相同. 其声明如下: 1 Sales_item& operator=(const Sales_item& rig); 3.什么情况下需要我们自己实现复制构造函数和赋值操作符? 一般情况下,C++

关于C++类中的土著民:构造函数,复制构造函数,析构函数

我们初学C++时可能会对类的构造函数,复制构造函数,析构函数有点疑问.整理如下(个人见解,如有错误,还望指正.): 1.构造函数 根据构造函数的定义知它的作用是初始化类的数据成员或内嵌类的对象,所以它的参数表就应该是它要初始化的对象类型.构造函数分三类:默认构造函数.构造函数.委托构造函数. 默认构造函数 默认构造函数没有返回值,没有参数表,没有函数体,如果类内没有显式的定义构造函数,系统会自动生成默认构造函数,如果已经定义了构造函数,但仍需要默认构造函数,可以在默认构造函数参数表后加defau

C++ Primer 学习笔记_54_类与数据抽象 --复制构造函数、赋值操作符

复制控制 --复制构造函数.赋值操作符 引言: 当定义一个新类型时,需要显式或隐式地指定复制.赋值和撤销该类型的对象时会发生什么– 复制构造函数.赋值操作符和析构函数的作用!      复制构造函数:具有单个形参,该形参(常用const修饰)是对该类类型的引用.当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式的使用复制构造函数:当将该类型的对象传递给函数或者从函数返回该类型的对象时,将隐式使用复制构造函数.     析构函数:作为构造函数的互补,当对象超出作用域或动态分配的对象被删除

函数重载与复制构造函数

函数重载与复制构造函数   一.函数重载 1.普通函数重载 用main函数多次重复调用一个相同名字但是不同类型的函数来处理不同类型的数据. 如 void func(int); void func(double); float func(float); void func(double); 2.成员函数的重载 我们可以将函数的重载推广到类的成员函数. Class  boy { Public: void  sum(); void  sum(int  x, int  y); } 二.函数的默认参数 在

何时调用C++复制构造函数和拷贝构造函数(转)

1. 何时调用复制构造函数 复制构造函数用于将一个对象复制到新创建的对象中.也就是说,它用于初始化过程中,而不是常规的赋值过程中.类的复制构造函数原型通常如下: class_name(const class_name&); 它接受一个指向类对象的常量引用作为参数.例如,String类的复制构造函数的原型如下: String(const String&); 新建一个对象并将其初始化为同类现有对象时,复制构造函数都将被调用.这在很多情况下都可能发生,最常见的情况是将新对象显示地初始化为现有的对

C++基础知识(八)---函数返回值(返回值,返回指针,返回对象,返回引用)---引用---复制构造函数(拷贝构造函数)

一.函数返回值 1.返回值: int test () { int a=1; return a; } 返回值时最简单的方式,它的操作主要在栈上,变量a在函数结束后会删除,为了返回a的值,系统会在内部建立一个临时变量保存a的值,以返回给调用该函数的表达式,调用结束后变量便不再存在.如果a是简单地数据类型也无所谓,不是很占用内存,如果a是大的自定义类型的数据,那么对a的复制将会占用比较大的内存.函数返回值是右值,不能进行运算符操作. 2.返回指针: int *test2() { int *b=new

剑指offer 复制构造函数

复制构造函数: A(const A &other){value=other.value;} 也就是传值参数改为常量引用. #include<iostream> using namespace std; class A { private: int value; public: A(int n){value=n;} A(const A &other){value=other.value;} void print(){ cout<<value<<endl;

复制构造函数

// 复制构造函数.cpp : 定义控制台应用程序的入口点.//复制构造函数:类(const 类&对象(随便起))/*Box(const Box&box){length = box.length;width = box.width;height = box.height;}*/ #include "stdafx.h"#include<iostream>using namespace std;class Box{private:    int length; 

C++复制构造函数和赋值符的区别

From  http://blog.csdn.net/randyjiawenjie/article/details/6666937 感谢原作者分享. class CTest{public: CTest(); //构造函数 CTest(const CTest &); //复制构造函数 CTest & operator = (const CTest &); //赋值符}; CTest::CTest(){ cout<<"Constructor of CTest&qu