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 ...
随机推荐
- 启动app时全屏显示Default.png
一直很喜欢MJ的讲课视频,今天看了他的博客学到了些东西顺便记录下来. 在默认情况下,app显示Default.png时并非真正的"全屏显示",因为顶部的状态栏并没有被隐藏,比如下面 ...
- iOS开发之网络编程--6、NSURLSessionConfiguration笔记
NSURLSessionConfiguration对象用于初始化NSURLSession对象. 展开请求级别中与NSMutableURLRequest相关的可供选择的方案,我们可以看到NSURLSes ...
- CFStringTransform
Mattt Thompson撰写. Ricky Tan翻译. 发布于2012年8月6日关于一种语言好不好用,你只需要衡量以下两种指标: API 的统一性String 类的实现质量NSString 是基 ...
- java获取时间戳的方法
JAVA 获取当前月的初始时间的时间戳 public static long getMonthFirstDay() { Calendar calendar = Calendar.getInstance ...
- PS网页设计教程XXV——使用Photoshop设计的老式组合布局
作为编码者,美工基础是偏弱的.我们可以参考一些成熟的网页PS教程,提高自身的设计能力.套用一句话,“熟读唐诗三百首,不会作诗也会吟”. 本系列的教程来源于网上的PS教程,都是国外的,全英文的.本人尝试 ...
- cocos2d-x之猜数字游戏
bool HelloWorld::init() { if ( !Layer::init() ) { return false; } visibleSize = Director::getInstanc ...
- CentOS6.3下安装VSFTP服务
CentOS下安装FTP服务器: 第一步,检查服务器端是否已经安装FTP:[root@localhost centos]# rpm -q vsftpd 如果出现的是:[root@localhost c ...
- nyoj 667 碟战 最小割(最大流)
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=677 题意转化:将点0与所有的有间谍的点相连,则题意变为求点0到点n的最小割,直接套最大流 ...
- 简单谈谈RAID
RAID是“Redundant Array of Independent Disk”的缩写,翻译过来叫做独立磁盘的冗余阵列,其实就是磁盘的存储.访问.备份技术.在谈RAID之前,先简单学习一下存储器的 ...
- Palindrome subsequence
Palindrome subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65535 K (Java/ ...