C++创建对象的两种方式
C++创建对象有两种方式,在栈上创建对象(Objects on the Stack)和在堆上创建对象(Objects on the Heap)。
假设我们有以下的类:
#include <string>
using std::string; class SpreadsheetCell{
public:
void setValue(double inValue);
double getValue();
void setString(string inString);
string getString(); protected:
string doubleToString(double inValue);
double stringToDouble(string inString); double mValue;
string mString;
};
以及如下的cpp文件:
#include "stdafx.h"
#include "SpreadsheetCell.h"
#include <iostream>
#include <sstream> using namespace std; void SpreadsheetCell::setValue(double inValue){
mValue = inValue;
mString = doubleToString(mValue);
} double SpreadsheetCell::getValue(){
return mValue;
} void SpreadsheetCell::setString(string inString){
mString = inString;
mValue = stringToDouble(mString);
} string SpreadsheetCell::getString(){
return mString;
} string SpreadsheetCell::doubleToString(double inValue){
ostringstream ostr;
ostr<<inValue;
return ostr.str();
} double SpreadsheetCell::stringToDouble(string inString){
double temp; istringstream istr(inString); istr>>temp;
if(istr.fail() || !istr.eof()){
return ();
} return temp;
}
1. 在栈上创建对象(Objects on the Stack):
语法:
ClassName ObjName1, ObjName2(parameter01)// But never OjbName()
顾名思义,用这种方法创建的对象,内存分配到栈里(Stack)。使用 “.” 非 “->” 调用对象的方法。当程度离开对象的使用范围(如方法结束,一个程度块的最后{}),范围内的栈中的对象会自动删除,内存自动回收。这是创建对象最简单的方式,与“int x = 0;”是一样的。如下面例子:
SpreadsheetCell myCell, anotherCell;
myCell.setValue();
anotherCell.setValue(myCell.getValue());
cout << “cell : “ << myCell.getValue() << endl;
cout << “cell : “ << anotherCell.getValue() << endl; //destroy:
int main(int argc, char** argv)
{
SpreadsheetCell myCell();
if (myCell.getValue() == ) {
SpreadsheetCell anotherCell();
} // anotherCell is destroyed as this block ends.
cout << “myCell: “ << myCell.getValue() << endl;
return ();
} // myCell is destroyed as this block ends. //destroy in reverse order:
{
SpreadsheetCell myCell2();
SpreadsheetCell anotherCell2(); // 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.)结合起来,下例两个输出,效果等价:
int _tmain(int argc, _TCHAR* argv[])
{
SpreadsheetCell *myCellp = new SpreadsheetCell(); myCellp->setValue(3.7); cout<<"cell 1: "<<myCellp->getValue()<<" "<<myCellp->getString()<<endl; cout<<"cell 1: "<<(*myCellp).getValue()<<" "<<(*myCellp).getString()<<endl; delete myCellp;
return ;
}
在堆中的对象不会自动删除,内存不会自动回收,所以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++创建对象的两种方式的更多相关文章
- Java反射获取class对象的三种方式,反射创建对象的两种方式
Java反射获取class对象的三种方式,反射创建对象的两种方式 1.获取Class对象 在 Java API 中,提供了获取 Class 类对象的三种方法: 第一种,使用 Class.forName ...
- Java Core - 创建对象的两种方式
一.通过new关键字创建对象 Hello hello = null; // 声明一个引用 hello = new Hello(); // 创建对象 以上两行代码相当于 Hello hello ...
- Java反射02 : Class对象获取的三种方式和通过反射实例化对象的两种方式
1.Class对象获取的三种方式 本文转载自:https://blog.csdn.net/hanchao5272/article/details/79361463 上一章节已经说过,一般情况下,Jav ...
- js创建对象的几种方式
/** * 顺便重温一下对象的创建方式 * 代码简单说明问题就好 * 概念性的东西这里就不提了,只加上自己简单理解 */ /** * 工厂模式,就是将手动的创建细节封装在一个方法里, * return ...
- Java中创建对象的几种方式
Java中创建对象的五种方式: 作为java开发者,我们每天创建很多对象,但是我们通常使用依赖注入的方式管理系统,比如:Spring去创建对象,然而这里有很多创建对象的方法:使用New关键字.使用Cl ...
- [转载]javascript创建对象的几种方式
原文链接:http://qingfeng825.iteye.com/blog/1935648 1. 工厂方法:能创建并返回特定类型对象的工厂函数(factory function). function ...
- Android请求服务器的两种方式--post, get的区别
android中用get和post方式向服务器提交请求_疯狂之桥_新浪博客http://blog.sina.com.cn/s/blog_a46817ff01017yxt.html Android提交数 ...
- js中创建对象的几种方式
创建对象指创建一个object并给这个对象添加属性和方法,有以下几个方式: 最基本的: var Person={}; Person.name='tom'; Person.age='20'; Perso ...
- 对于String对象,可以使用"="赋值,也可以使用"new"关键字赋值,两种方式有什么区别?
当你看见这个标题的时候,你可能会下意识的去想一下,这两种方式到底有什么样的区别呢? 且看下面的demo,自然便区分开了 /** * */ package com.b510.test; /** * Pr ...
随机推荐
- IOS 杂笔-3 (property参数)
(1)内存管理相关参数 Retain:对对象release旧值,retain新值(适用于OC对象类型) Assign:直接赋值(默认,适用于非oc对象类型) Copy:release旧值,copy新值 ...
- 将spring源码导入到eclipse中
前置条件: 1. 正确安装jdk,并配置好JAVA_HOME.PATH.(我这里安装的是jdk1.8) 2. 正确安装好eclipse.(我的eclipse版本是: Neon Release (4.6 ...
- JDBC demo
package com.zhangbz.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql ...
- 关于IOS多线程的好的技术博客
点击图片就能跳转链接到目标网页. 1.GCD<本人已阅,写的非常好>
- python 连接 mysql
http://blog.csdn.net/yelbosh/article/details/7498641 数据库的连接 模块引入之后我们就需要和数据库进行连接了,实例代码如下: db = MySQLd ...
- mmap 与 read/write
mmap与read/write两条路线对文件的访问比较 我们知道无论是通过mmap或read/write访问文件在内核中都必须经过缓存, 当需要从文件读写内容时,都经过内存拷贝的方式与内核中的缓存进行 ...
- 用PowerDesigner将SQL语句生成实体类
1.首先打开PowerDesigner,点击左上角“File”—>"Reverse Engineer"—>"Database..." 2.选择数据库 ...
- Hadoop Browse the filesystem 无效处理
当我们安装好并正常运行hdfs后输入http://xxxxxxxxx:50070会进入下图所示的页面. 其中Browse the filesystem 是查看文件系统的入口. 但是在发现这个链接一直无 ...
- jquery发送异步请求
var remark = $("#"+id+"remark").val(); var shopid = $("#"+id+"sho ...
- TFS 2015 Update 2功能探索
微软刚刚发布了TFS 2015 update 2的测试包,https://blogs.msdn.microsoft.com/bharry/2016/02/10/team-foundation-serv ...