zoukankan      html  css  js  c++  java
  • C++创建对象的两种方式

    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

  • 相关阅读:
    为什么我会被淘汰?
    2017-3-27日碎碎念
    (原创)我对未来的人类的发展,以及AI技术发展的一些思考。
    八大排序算法图文讲解
    PE病毒初探——向exe注入代码
    [转]Patch文件结构详解
    芝麻信用商家接入指南
    如何成为一名好的程序员的一些个人经验
    .NET CoreCLR开发人员指南(上)
    七牛云:ckeditor JS SDK 结合 C#实现多图片上传。
  • 原文地址:https://www.cnblogs.com/techyc/p/3257575.html
Copyright © 2011-2022 走看看