zoukankan      html  css  js  c++  java
  • c++学习 定位new表达式

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

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

    首先创建测试用的类Foo

     1 //测试所用的类
     2 class Foo
     3 {
     4 public:
     5     Foo(int val = 0)
     6     {
     7         _val = val;
     8     }
     9 
    10     void writeFoo()
    11     {
    12         cout<< "_val is " << _val << "wook";
    13         cout<< endl;
    14     }
    15 
    16 private:
    17     int _val;
    18 };

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

    然后是main函数。

     1 int main(int argc, char *argv[])
     2 {
     3     QCoreApplication a(argc, argv);
     4 
     5     //创建char数组,大小为3个Foo
     6     char* buf = new char[sizeof(Foo) * 3];
     7 
     8     //sizeof(Foo)大小为4
     9     //cout<< sizeof(Foo) << endl;
    10 
    11 
    12     //实例化Foo对象,并将其放置到buf中第一个Foo“位置”处
    13     Foo* pb = new (buf) Foo(0);
    14 
    15     //cout<< pb << endl;
    16     pb->writeFoo();
    17 
    18     //实例化Foo对象,并将其放置到buf中第二个Foo“位置”处
    19     Foo* pb3 = new (buf + (sizeof(Foo) * 2)) Foo(2);
    20 
    21     //实例化Foo对象,并将其放置到buf中第一个Foo的“第二个位置处”
    22     //Foo* pb3 = new (buf + ((sizeof(Foo) * 2) -3)) Foo(2);
    23 
    24     //cout<< pb3 << endl;
    25     pb3->writeFoo();
    26     //cout<< *(buf + ((sizeof(Foo) * 2) - 3)) << endl;
    27 
    28     Foo* pb1 = new (buf + sizeof(Foo)) Foo(1);
    29 
    30     //cout<< *(buf + sizeof(Foo)) << endl;
    31 
    32     /*cout<< "*************" << endl;
    33     cout<< *(buf + ((sizeof(Foo) * 2) - 3)) << endl;
    34     cout<< "*************" << endl;*/
    35 
    36     /*for (int index(0); index != (sizeof(Foo) * 3); index++)
    37     {
    38         cout<< "*********   " << index << endl;
    39         cout<< *(buf + index) << endl;
    40         cout<< "*********" << endl;
    41     }*/
    42 
    43     //cout<< pb1 << endl;
    44     pb1->writeFoo();
    45     pb3->writeFoo();
    46 
    47 
    48     //cout<< pb3 << endl;
    49     //cout<< pb1 << endl;
    50     //cout<< pb3 << endl;
    51 
    52     //pb3->writeFoo();
    53 
    54     return a.exec();
    55 }

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

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

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

    未完!

  • 相关阅读:
    RocketMQ主从搭建
    Spring Cloud Sleuth
    Spring Cloud Eureka
    Nacos配置中心使用
    Nacos注册中心使用
    Nacos快速入门
    Nginx配置SSL
    并发工具类
    关于类的线程安全
    Docker 入门学习笔记(一)
  • 原文地址:https://www.cnblogs.com/weiweiqiao99/p/2545710.html
Copyright © 2011-2022 走看看