C++构造和析构
2008-09-04 15:15
155 查看
#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
同一进程中的多个线程共享代码段(代码和常量)、数据段(静态和全局变量)和扩展段(堆存储),但是每个线程有自己的栈段。栈段又叫运行时栈,用来存放所有局部变量和临时变量(参数、返回值、临时构造的变量等)。
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
同一进程中的多个线程共享代码段(代码和常量)、数据段(静态和全局变量)和扩展段(堆存储),但是每个线程有自己的栈段。栈段又叫运行时栈,用来存放所有局部变量和临时变量(参数、返回值、临时构造的变量等)。
相关文章推荐
- C++派生类在构造和析构过程中做的事
- c++继承中的构造与析构
- C++子类构造和析构被时,父类构造和析构的调用顺序
- C++的构造和析构顺序
- 请用c++ 实现stl中的string类,实现构造,拷贝构造,析构,赋值,比较,字符串相加,获取长度及子串等功能。
- Primer plus C++ 第十章 对象和类_类的设计进化_构造与析构
- C++构造和析构以及虚函数应用
- C++构造和析构定义的经验总结
- C++构造与析构(9) - 默认构造函数
- C++构造与析构(17) - virtual拷贝构造函数
- C++构造、析构、继承、多态--一道笔试题都考到了
- C++全局构造与析构底层实现
- C++构造与析构-10
- C++中异常处理中的构造和析构
- 对C++中异常处理中的构造和析构的认识
- C++继承的构造和析构
- C++构造,析构,友元类,对象,static成员,复制构造函数,运算符重载杂谈
- C++ 继承的构造与析构
- 一个有关C++中对象构造、析构和虚函数的问题
- C++构造、析构的一些理解