- #include <iostream>
- using namespace std;
- class B
- {
- public:
- B()
- {
- cout<<"default constructor"<<endl;
- }
- B( B &b)
- {
- cout<<"copy constructor"<<endl;
- }
- ~B()
- {
- cout<<"destructed"<<endl;
- }
- B(int i):data(i)
- {
- cout<<"constructed by parameter " << data <<endl;
- }
- B& operator=(B& b)
- {
- cout<<"======== "<<endl;
- return *this;
- }
- private:
- int data;
- };
- B Play(B b)
- {
- return b;
- }
- int main()
- {
- B(5);
- // 无名对象,先通过B(int)构造,再析构
- B t1=Play(B(4));
- // 载入Play(5)的时候调用B的构造函数B(int),根据参数5构造一个B的实例b
- // 在return b返回的时候调用B的拷贝构造函数构造一个新的临时对象返回
- // return语句离开b的作用域,此时调用b的析构函数
- B t2=Play(t1);
- // 载入Play(t1)时调用调用B的拷贝构造函数,构造对象b
- // return b时先调用B的拷贝构造函数构造一个新的临时对象返回
- // 然后调用b的析构函数
- t2=t1;
- // 局部对象 t1,t2 离开作用域,调用其析构函数
- return 0;
- }
output:
constructed by parameter 5
destructed
constructed by parameter 4
copy constructor
destructed
copy constructor
copy constructor
destructed
========
destructed
destructed
- 一个命名的自动对象,当程序的执行每次遇到它的申明时建立,每次程序离开它出现的块(作用域)时销毁;
- 一个自由存储对象,通过new运算符建立,通过一个delete运算符销毁;
- 一个非静态成员对象,作为另一个类对象的成员,在它作为成员的那个对象建立或销毁时,它也随之被建立或销毁;
- 一个数组对象,在它作为元素的那个数组被建立或销毁的时候建立或者销毁;
- 一个局部静态对象,在程序执行中第一次遇到它的申明时建立一次,在程序终止时销毁一次;
- 一个全局对象,名字空间的对象,类的静态对象,它们只在“程序开始时”建立一次,在程序终止时销毁一次;
- 一个临时对象,作为表达式求值的一部分被建立,在它所出现的那个完整的表达式的最后被销毁;
- 一个在分配操作中由所提供的参数控制,在通过用户提供的函数获得的存储里放置的对象;
- 一个union对象,它不能有构造函数和析构函数。
(以上片段摘自<C++程序设计语言>,P218)
关于 如何计算sizeof(类)
空类:1
没有虚函数:sizeof(数据成员)的和
有虚函数: sizeof(数据成员)的和+sizeof(V表指针)=4
同一进程中的多个线程共享代码段(代码和常量)、数据段(静态和全局变量)和扩展段(堆存储),但是每个线程有自己的栈段。栈段又叫运行时栈,用来存放所有局部变量和临时变量(参数、返回值、临时构造的变量等)。