`
guoyiqi
  • 浏览: 968314 次
社区版块
存档分类
最新评论

C++创建对象的两种方法

 
阅读更多

在C++里,有两种方法创建对象:

方法一

ClassName object(param);

这样就声明了一个ClassName类型的object对象,C++会为它分配足够的存放对象所有成员的存储空间。

注意:为节省存储空间,C++创建对象时仅分配用于保存数据成员的空间,而类中定义的成员函数则被分配到存储空间中的一个公用区域,由该类的所有对象共享。

例如,我定义了一个这样的类:

class Rec
{
public:
Rec(int width,int height);
~Rec();
int getArea();

private:
int Rwidth;
int Rheight;
};

当你Rec myRec(5,5);这样创建一个myRec对象,然后打印出sizeof(myRec);的时候,会得到 8 这个结果。

因为myRec中有2个int类型的数据成员,一个int成员占4个字节,所以myRec对象占8个字节。

这种方法创建的对象,内存分配是分配到栈中的,由C++缺省创建和撤销,自动调用构造函数和析构函数

注意:该方法创建的对象调用类方法时,必须用“.”,而不能用“->”.如myRec.getArea();

=============================================================================================

方法二

ClassName *object=new ClassName(param);

delete object;

这种方法跟java有点类似,相同的是,它们都是在堆上分配内存来创建对象的(与上不同);不同的是,C++用new创建对象时返回的是一个对象指针,object指向一个ClassName的对象,C++分配给object的仅仅是存放指针值的空间。而且,用new 动态创建的对象必须用delete来撤销该对象。只有delete对象才会调用其析构函数。

注意:new创建的对象不是用“*”或“.”来访问该对象的成员函数的,而是用运算符“->”;

例如:Rec *rec=new Rec(3,4);

rec->getArea();

delete rec;

顺便提一下:

一般来说,编译器将内存分为三部分:静态存储区域、栈、堆。静态存储区主要保存全局变量和静态变量,栈存储调用函数相关的变量、地址等,堆存储动态生成的变量。在c中是指由malloc,free运算产生释放的存储空间,在c++中就是指new和delete运算符作用的存储区域。

分享到:
评论

相关推荐

    Java创建对象与C++创建对象的比较

     1、C++创建对象方式  在C++中我们可以采用如下两种方式来创建对象, 1 Dog dog;//Dog为类名 2 Dog *p = new Dog();  这两种方式在C++中都能完成对象的创建,但是在内存中的处理却完全不同。  对于...

    C++和QML交互

    Qt 提供了两种在 QML 环境中使用 C++ 对象的方式: 1. 在 C++ 中实现一个类,注册到 QML 环境中, QML 环境中使用该类型创建对象 2. 在 C++ 中构造一个对象,将这个对象设置为 QML 的上下文属性,在 QML 环境中直接...

    C++面向对象编程小例子

    用户可以任选石头、剪子、布中的一种,计算机也随机产生3种物件之一,根据“石头赢剪子,剪子赢布,布赢石头”的规则判定胜负,另外,默认为一局定胜负,如果有可能,实现三局两胜的规则。 3. 生成一个Rectangle类...

    如何把C++对象绑定到Lua轻量级

    从程序员的角度上来看,把一个脚本语言嵌入到游戏中最主要的问题是如果为脚本语言提供对宿主对象的访问(通常是C/C++对象)。在选择一个脚本语言的时候有两个关键的特性:嵌入相关问题和绑定相关问题。而这些是Lua...

    现代C++程序设计

    5.5.1 复习:两种机制 5.5.2 为什么要强调指针的重要性 5.6 queue类 5.7 总结 5.8 练习 复习题 第6章 数组 6.1 使用单个数据变量 6.2 数组基础 6.2.1 数组的索引值从0开始 6.2.2 使用for循环和数组来实现的电话账单...

    清华大学 C++教程

    【重点和难点】  本章的重点在于两种程序设计方法的理解,以及Visual C++ IDE的使用。  其中面向对象程序设计的基本思想、基本概念及主要特征也是本章学习的难点。 【学习方法】  本章概念和...

    C++可调用对象详解

     C++11有两种办法传递可变形参(其实学了模板以后可以用模板的自动递归来展开所传递的参数,这个后面再说)。  1. 第一种是initializer_list,这是一个标准库类型(其实是个模板)。  std::initializer_l

    新手学习C++入门资料

    布尔型变量是有两种逻辑状态的变量,它包含两个值:真和假。如果在表达式中使用了布尔型变量,那么将根据变量值的真假而赋予整型值1或0。要把一个整型变量转换成布尔型变量,如果整型值为0,则其布尔型值为假;反之...

    C++实验报告.doc

    我公司为仪器生产企业,目前生产摄像机和行车记录仪两种产品,分别销售给用户。 摄像机包含摄像、图像质量设定、编码算法等属性。 将摄像机增加相应芯片(具有操作菜单、自动拍摄、车速传感器、源代码等功能)后,...

    使用C++实现语音识别

    微软的语音识别,在这里我们简称它为SR(speech recognition),SR分为两种模式的监听:第一种模式:任意监听,即随意输入语音,监听对象将最为接近的字或者词,句反馈出来;

    《C++编程艺术》教程+代码

    2.1.3 两种方法都可以使用 7 2.2 在C++中创建垃圾回收器 7 2.3 选择垃圾回收的算法 8 2.3.1 引用计数 9 2.3.2 标记并清除 9 2.3.3 复制 9 2.3.4 采用哪种算法 9 2.3.5 实现垃圾回收器 10 2.3.6 是否使用多线程 10 ...

    javascript如何创建对象

    对象分为系统对象和自定义对象两种。我们可以通过调用系统构造函数来创建出系统对象,如:array|date等。自定义对象必须自己创造,无法利用系统函数来创造。 javascript创建对象  一、直接创建 //直接创建 //...

    C/C++中退出线程的四种解决方法

    2.调用 _endthreadex()函数 或 ExitThread()函数(最好不要):如果使用这两种方法退出线程, 则不会执行线程函数的return语句, 所以就不会调用线程函数作用域内申请的类对象的析构函数, 会造成内存泄露. 剩下两

    C++MFC教程

    在Windows中有各种GUI对象(不要和C++对象混淆),当你在进行绘图就需要利用这些对象。而各种对象都拥有各种属性,下面分别讲述各种GUI对象和拥有的属性。 字体对象CFont用于输出文字时选用不同风格和大小的字体。可...

    C++典型句柄类的实现

    演示了继承中的易错点,演示了两种常用C++句柄类的封装方式,前者适用于类的基类指针管理以便实现多态,后者不仅管理基类指针还管理子类对象的创建。

    【全新正版】现代C++程序设计(原书第2版)

    5.5.1 复习:两种机制 5.5.2 为什么要强调指针的重要性 5.6 queue类 5.7 总结 5.8 练习 复习题 第6章 数组 6.1 使用单个数据变量 6.2 数组基础 6.2.1 数组的索引值从0开始 6.2.2 使用for循环和数组来实现的电话账单...

    零起点学通C++多媒体范例教学代码

    8.4.2 在堆中创建对象 8.4.3 在堆中删除对象 8.4.4 访问堆中的数据成员 8.4..5 在构造函数中开辟内存空间 8.4.6 对象在栈与堆中的不同 8.5 this指针 8.6 指针的常见错误 8.7 指针运算 8.7.1 指针的加减运算 8.7.2 ...

    零起点学通C++学习_多媒体范例教学代码

    8.4.2 在堆中创建对象 8.4.3 在堆中删除对象 8.4.4 访问堆中的数据成员 8.4..5 在构造函数中开辟内存空间 8.4.6 对象在栈与堆中的不同 8.5 this指针 8.6 指针的常见错误 8.7 指针运算 8.7.1 指针的加减运算 ...

Global site tag (gtag.js) - Google Analytics