C++创建对象有两种方式,在栈上创建对象(Objects on the Stack)和在堆上创建对象(Objects on the Heap)。

假设我们有以下的类:

 1 #include <string>
 2 using std::string;
 3
 4 class SpreadsheetCell{
 5 public:
 6     void setValue(double inValue);
 7     double getValue();
 8     void setString(string inString);
 9     string getString();
10
11 protected:
12     string doubleToString(double inValue);
13     double stringToDouble(string inString);
14
15     double mValue;
16     string mString;
17 };

以及如下的cpp文件:

 1 #include "stdafx.h"
 2 #include "SpreadsheetCell.h"
 3 #include <iostream>
 4 #include <sstream>
 5
 6 using namespace std;
 7
 8 void SpreadsheetCell::setValue(double inValue){
 9     mValue = inValue;
10     mString = doubleToString(mValue);
11 }
12
13 double SpreadsheetCell::getValue(){
14     return mValue;
15 }
16
17 void SpreadsheetCell::setString(string inString){
18     mString = inString;
19     mValue = stringToDouble(mString);
20 }
21
22 string SpreadsheetCell::getString(){
23     return mString;
24 }
25
26 string SpreadsheetCell::doubleToString(double inValue){
27     ostringstream ostr;
28     ostr<<inValue;
29     return ostr.str();
30 }
31
32 double SpreadsheetCell::stringToDouble(string inString){
33     double temp;
34
35     istringstream istr(inString);
36
37     istr>>temp;
38     if(istr.fail() || !istr.eof()){
39         return (0);
40     }
41
42     return temp;
43 }

1. 在栈上创建对象(Objects on the Stack):

语法:

1 ClassName ObjName1, ObjName2(parameter01)// But never OjbName()

顾名思义,用这种方法创建的对象,内存分配到栈里(Stack)。使用 “.” 非 “->” 调用对象的方法。当程度离开对象的使用范围(如方法结束,一个程度块的最后{}),范围内的栈中的对象会自动删除,内存自动回收。这是创建对象最简单的方式,与“int x = 0;”是一样的。如下面例子:

SpreadsheetCell myCell, anotherCell;
myCell.setValue(6);
anotherCell.setValue(myCell.getValue());
cout << “cell 1: “ << myCell.getValue() << endl;
cout << “cell 2: “ << anotherCell.getValue() << endl;//destroy:
int main(int argc, char** argv)
{SpreadsheetCell myCell(5);
  if (myCell.getValue() == 5) {SpreadsheetCell anotherCell(6);} // anotherCell is destroyed as this block ends.cout << “myCell: “ << myCell.getValue() << endl;
  return (0);
} // myCell is destroyed as this block ends.//destroy in reverse order:
{SpreadsheetCell myCell2(4);SpreadsheetCell anotherCell2(5); // myCell2 constructed before anotherCell2
} // anotherCell2 destroyed before myCell2

2.在堆上创建对象(Objects on the Heap):

语法:

ClassName *obj1 = new ClassName();ClassName *obj2 = new ClassName(parameter);delete obj1;delete obj2;

用这种方法创建的对象,内存分配到堆里(Heap)。一般使用“->” 调用对象的方法。箭头操作符”->"将解引用(dereferencing*)和成员使用(member access.)结合起来,下例两个输出,效果等价:

 1 int _tmain(int argc, _TCHAR* argv[])
 2 {
 3     SpreadsheetCell *myCellp = new SpreadsheetCell();
 4
 5     myCellp->setValue(3.7);
 6
 7     cout<<"cell 1: "<<myCellp->getValue()<<" "<<myCellp->getString()<<endl;
 8
 9     cout<<"cell 1: "<<(*myCellp).getValue()<<" "<<(*myCellp).getString()<<endl;
10
11     delete myCellp;
12     return 0;
13 }

在堆中的对象不会自动删除,内存不会自动回收,所以new一个对象使用完毕,必须调用delete,释放内存空间。也就是说,new和delete必须成对出现。

顺便提提,内存的分配方式有三种
      (1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。 
      (2)  在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束后在将这些局部变量的内存空间回收。在栈上分配内存空间效率很高,但是分配的内存容量有限。
       (3) 从堆上分配的。程序在运行的时候用 malloc 或 new 申请任意多少的内存,程序员自己负责在何时用 free 或 delete 释放内存。

参考:

Professional C++, chapter 8

http://blog.csdn.net/cscmaker/article/details/7019977

C++创建对象的两种方式相关推荐

  1. Qt Qml动态创建对象/组件的两种方式

    Qml动态创建对象有两种方式: a.使用Loader b.使用javaScript 1.Loader加载机制: 加载过程: 通过source,来加载qml文件. 通过sourceComponent,来 ...

  2. 创建和应用Java包文件的两种方式

    <Java编程艺术>章节选登.作者:高永强 清华大学出版社 (即将出版) 12.1  包--package       包是Java提供的文件管理机制.包把功能相似的类,按照Java的名字 ...

  3. [转载]javascript创建对象的几种方式

    原文链接:http://qingfeng825.iteye.com/blog/1935648 1. 工厂方法:能创建并返回特定类型对象的工厂函数(factory function). function ...

  4. Dagger2 知识梳理(1) Dagger2 依赖注入的两种方式

    一.资料推荐 最近这几天一直在看有关Dagger2有关的文章,感觉就是这东西真难用.真难懂,数次想要放弃,还好有网上大神的教程帮助,模模糊糊总算能把基本的几个概念跑通了. 这里首先推荐 牛晓伟 的下面 ...

  5. javascript创建对象的几种方式 .

    // 1. 工厂方法:能创建并返回特定类型对象的工厂函数(factory function). function createCar(sColor){ var car = new Object(); ...

  6. Javascript创建对象的几种方式?

    javascript 中常见的创建对象的几种方式: 1. 使用Object构造函数创建: 使用Object构造函数来创建一个对象,下面代码创建了一个person对象,并用两种方式打印出了Name的属性 ...

  7. 创建和应用Java包文件的两种方式(转)

    创建和应用Java包文件的两种方式(转) <Java编程艺术>章节选登.作者:高永强 清华大学出版社 (即将出版) 12.1  包--package    ... 12.1.1  包命名规 ...

  8. js创建对象的七种方式

    JavaScript创建对象的方式有很多,通过Object构造函数或对象字面量的方式也可以创建单个对象,显然这两种方式会产生大量的重复代码,并不适合量产.接下来介绍七种非常经典的创建对象的方式,他们也 ...

  9. python循环展示大写字母_python调用大写函数python中字典的循环遍历的两种方式

    开发中经常会用到对于字典.列表等数据的循环遍历,但是python中对于字典的遍历对于很多初学者来讲非常陌生,今天就来讲一下python中字典的循环遍历的两种方式. 注意: python2和python ...

最新文章

  1. PyInstaller库的使用
  2. oracle创建表+注释
  3. linux资源利用率检查_使用free命令查看实际内存占用(可用内存)
  4. 让人深思......
  5. 数据产品-数据可视化工具Excel之数据透视表
  6. 在本地进行开发工作置chrome谷歌浏览器解决跨域问题
  7. LINUX下载编译OpenH264
  8. python在线翻译小程序_Python 做一个翻译小程序
  9. Symbian操作系统
  10. re2020 bt2020_如何在2020年选择最佳博客平台(比较)
  11. 华为路由器怎么配置DNS?
  12. 数字化时代如何赋能渠道分销?
  13. 《520七夕情人节表白礼物》:虚幻浪漫的爱情故事——❤520表白星空漫漫3D相册❤(HTML+CSS+JavaScript)...
  14. 使用virt-manager创建虚拟机
  15. QPainterPath
  16. 一小时前华为鸿蒙操作系统放出了源代码
  17. 全国首张数字人民币保单成功出单
  18. “RegSvr32 failed with exit code 0x3”问题的解决办法
  19. 关于计算机技能的英语作文,英文简历写作:计算机技能
  20. hbase热点问题解决(预分区)

热门文章

  1. 第27章:MongoDB-索引--唯一索引
  2. ModelSim 使用笔记1
  3. 【BZOJ1899】[Zjoi2004]Lunch 午餐 贪心+DP
  4. 最新Angular2案例rebirth开源
  5. 设计模式----工厂模式
  6. SimulatorXcode模拟器如何使用PC键盘进行输入
  7. EasyUI错误总结1
  8. 浅谈ref与out区别
  9. [基础题] * 9.(*)设计一个Student接口,以一维数组存储一个班级的学生姓名。
  10. sql注入_1-7_绕过注入