博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++学习 定位new表达式
阅读量:6273 次
发布时间:2019-06-22

本文共 1797 字,大约阅读时间需要 5 分钟。

hot3.png

在cpp中,new主要有3种用法:实例化一个对象;实例化一个数组;定位new表达式。在这里主要讨论第三种用法,定位new表达式。

定位new表达式,就是在内存中new一块地址,然后根据程序的需要,将大小适合的实例对象放到此内存块中操作的方法。在此我借用《cpp primer 3rd》中p347中的例子给予说明,不足之处,恳请各位读者斧正。

首先创建测试用的类Foo

//测试所用的类class Foo{public:    Foo(int val = 0)    {        _val = val;    }    void writeFoo()    {        cout<< "_val is " << _val << "wook";        cout<< endl;    }private:    int _val;};

我们看到Foo有一个private对象_val;有一个打印到console的方法writeFoo。

然后是main函数。

int main(int argc, char *argv[]){    QCoreApplication a(argc, argv);    //创建char数组,大小为3个Foo    char* buf = new char[sizeof(Foo) * 3];    //sizeof(Foo)大小为4    //cout<< sizeof(Foo) << endl;    //实例化Foo对象,并将其放置到buf中第一个Foo“位置”处    Foo* pb = new (buf) Foo(0);    //cout<< pb << endl;    pb->writeFoo();    //实例化Foo对象,并将其放置到buf中第二个Foo“位置”处    Foo* pb3 = new (buf + (sizeof(Foo) * 2)) Foo(2);    //实例化Foo对象,并将其放置到buf中第一个Foo的“第二个位置处”    //Foo* pb3 = new (buf + ((sizeof(Foo) * 2) -3)) Foo(2);    //cout<< pb3 << endl;    pb3->writeFoo();    //cout<< *(buf + ((sizeof(Foo) * 2) - 3)) << endl;    Foo* pb1 = new (buf + sizeof(Foo)) Foo(1);    //cout<< *(buf + sizeof(Foo)) << endl;    /*cout<< "*************" << endl;    cout<< *(buf + ((sizeof(Foo) * 2) - 3)) << endl;    cout<< "*************" << endl;*/    /*for (int index(0); index != (sizeof(Foo) * 3); index++)    {        cout<< "*********   " << index << endl;        cout<< *(buf + index) << endl;        cout<< "*********" << endl;    }*/    //cout<< pb1 << endl;    pb1->writeFoo();    pb3->writeFoo();    //cout<< pb3 << endl;    //cout<< pb1 << endl;    //cout<< pb3 << endl;    //pb3->writeFoo();    return a.exec();}

16/25/44/45四行的输出为:

 1 _val is 0wook 2 _val is 2wook 3 _val is 1wook 4 _val is 2wook

由此可见因为19行的实例化在第三个Foo的“位置”,第28行的实例化在第二个“位置”,两者之间没有重叠处。

转载于:https://my.oschina.net/weiweiqiao/blog/484207

你可能感兴趣的文章
Thinkphp中field和getField
查看>>
AngularJS之初级Route【一】(六)
查看>>
QTP的那些事--采用DOM,描述性编程获取指定的对象
查看>>
linux异步通信之epoll【转】
查看>>
前端自学路线之js篇
查看>>
C++:运算符重载函数之友元运算符重载
查看>>
ANT task之Junit、JunitReport
查看>>
selenium的那些事--运行报错
查看>>
谋求职业发展,是“走”还是“留”
查看>>
SpreadJS 在 Angular2 中支持绑定哪些属性?
查看>>
Lucene 定义
查看>>
硅谷返乡大潮,AI海归大调查:薪酬、发展、故乡情
查看>>
GNU make manual 翻译(八十二)
查看>>
算法学习之顺序结构
查看>>
百度2013年校园招聘题
查看>>
第3章 敏捷项目管理概述
查看>>
设计模式系列-装饰模式
查看>>
Oozie的作用
查看>>
Android -- TabHost、Fragment、状态保存、通信
查看>>
TFS二次开发系列:四、TFS二次开发WorkItem添加和修改、保存
查看>>