c 四种不同的对象生存方式 - shkkhd的专栏 - CSDNBlog
来源:百度文库 编辑:神马文学网 时间:2024/06/13 05:14:49
c++四种不同的对象生存方式
在C++ 中,有四种方法可以产生一个对象。第一种方法是在堆栈(stack)之中产生它:
void MyFunc()
{
CFoo foo; // 在堆栈(stack)中产生foo 对象
...
}
第二种方法是在堆积(heap)之中产生它:
void MyFunc()
{
...
CFoo* pFoo = new CFoo(); // 在堆(heap)中产生对象
}
第三种方法是产生一个全域对象(同时也必然是个静态对象):
CFoo foo; // 在任何函数范围之外做此动作
第四种方法是产生一个区域静态对象:
void MyFunc()
{
static CFoo foo; // 在函数范围(scope)之内的一个静态对象
...
}
不论任何一种作法,C++ 都会产生一个针对CFoo 构造式的调用动作。前两种情况,C++
在配置内存-- 来自堆栈(stack)或堆积(heap)-- 之后立刻产生一个隐藏的(你的原
代码中看不出来的)构造式调用。第三种情况,由于对象实现于任何「函数活动范围
(function scope)」之外,显然没有地方来安置这样一个构造式调用动作。
是的,第三种情况(静态全域对象)的构造式调用动作必须靠startup 码帮忙。startup 码
是什么?是更早于程序进入点(main 或WinMain)执行起来的码,由C++ 编译器提供,
被联结到你的程序中。startup 码可能做些像函数库初始化、进程信息设立、I/O stream 产
生等等动作,以及对static 对象的初始化动作(也就是调用其构造式)。
当编译器编译你的程序,发现一个静态对象,它会把这个对象加到一个串行之中。更精
确地说则是,编译器不只是加上此静态对象,它还加上一个指针,指向对象之构造式及
其参数(如果有的话)。把控制权交给程序进入点(main 或WinMain)之前,startup 码
会快速在该串行上移动,调用所有登记有案的构造式并使用登记有案的参数,于是就初
始化了你的静态对象。
第四种情况(区域静态对象)相当类似C 语言中的静态区域变量,只会有一个实体
(instance)产生,而且在固定的内存上(既不是stack 也不是heap)。它的构造式在
控制权第一次移转到其声明处(也就是在MyFunc 第一次被调用)时被调用。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1799548
在C++ 中,有四种方法可以产生一个对象。第一种方法是在堆栈(stack)之中产生它:
void MyFunc()
{
CFoo foo; // 在堆栈(stack)中产生foo 对象
...
}
第二种方法是在堆积(heap)之中产生它:
void MyFunc()
{
...
CFoo* pFoo = new CFoo(); // 在堆(heap)中产生对象
}
第三种方法是产生一个全域对象(同时也必然是个静态对象):
CFoo foo; // 在任何函数范围之外做此动作
第四种方法是产生一个区域静态对象:
void MyFunc()
{
static CFoo foo; // 在函数范围(scope)之内的一个静态对象
...
}
不论任何一种作法,C++ 都会产生一个针对CFoo 构造式的调用动作。前两种情况,C++
在配置内存-- 来自堆栈(stack)或堆积(heap)-- 之后立刻产生一个隐藏的(你的原
代码中看不出来的)构造式调用。第三种情况,由于对象实现于任何「函数活动范围
(function scope)」之外,显然没有地方来安置这样一个构造式调用动作。
是的,第三种情况(静态全域对象)的构造式调用动作必须靠startup 码帮忙。startup 码
是什么?是更早于程序进入点(main 或WinMain)执行起来的码,由C++ 编译器提供,
被联结到你的程序中。startup 码可能做些像函数库初始化、进程信息设立、I/O stream 产
生等等动作,以及对static 对象的初始化动作(也就是调用其构造式)。
当编译器编译你的程序,发现一个静态对象,它会把这个对象加到一个串行之中。更精
确地说则是,编译器不只是加上此静态对象,它还加上一个指针,指向对象之构造式及
其参数(如果有的话)。把控制权交给程序进入点(main 或WinMain)之前,startup 码
会快速在该串行上移动,调用所有登记有案的构造式并使用登记有案的参数,于是就初
始化了你的静态对象。
第四种情况(区域静态对象)相当类似C 语言中的静态区域变量,只会有一个实体
(instance)产生,而且在固定的内存上(既不是stack 也不是heap)。它的构造式在
控制权第一次移转到其声明处(也就是在MyFunc 第一次被调用)时被调用。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1799548
c 四种不同的对象生存方式 - shkkhd的专栏 - CSDNBlog
C armman的专栏 - CSDNBlog
面向对象之关系依赖 - zhangningbo168的专栏 - CSDNBlog
经典的C 库 - xlvector的专栏 - CSDNBlog
c语言词法分析器 - fertiland的专栏 - CSDNBlog
C语言测试题的讲解分析 - 张孝祥专栏 - CSDNBlog
gcc编译c语言中内嵌汇编 - fifan的专栏 - CSDNBlog
在 console mode 中使用 C/C 编译器 - Kevin的专栏 - CSDNBlog
C 各大有名库的介绍(一) - armman的专栏 - CSDNBlog
C 各大有名库的介绍 zz - denny的专栏 - CSDNBlog
网管必须熟悉的几个网络DOS命令 - C&M专栏 - CSDNBlog
C 资源之不完全导引(完整版) - ugg的专栏 - CSDNBlog
用C# 实现C/S模式下软件自动在线升级 - wzq6511的专栏 - CSDNBlog
逆向 C -- 识别类及其构造函数 - FISH 的专栏 - CSDNBlog
伟大的C语言 - - CSDNBlog
拷贝对象的三种方式
虚拟机概论(四)——虚拟机的历史 - WinHerry的专栏 - CSDNBlog
软件工程文档模板----四、概要设计说明书 - lihuaidong521的专栏 - CSDNBlog
Tapestry的介绍 - bfh365的专栏 - CSDNBlog
CFileDialog的详解 - bhw1985的专栏 - CSDNBlog
Xindice的FAQ - TKDD的专栏 - CSDNBlog
多线程的测试 - wuzoujing的专栏 - CSDNBlog
键盘钩子 - lj197912的专栏 - CSDNBlog
J2EE 学习 - fanqinghai的专栏 - CSDNBlog