热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

小朋友学C++(16):C++创建对象的3种方式

先看程序:#include<iostream>usingnamespacestd;classA{private:intn;public:

先看程序:

#include 
using namespace std;

class A
{
private:
    int n;
public:
    A(int m)
    {
        n = m;
        cout <<"Constructor method is invoked!" <void printNum()
    {
        cout <<"n = " <int main()
{
    // 第一种 
    A a1(1);            // a1在栈中 
    a1.printNum();

    // 第二种 
    A a2 = A(2);        // a2在栈中 
    a2.printNum();

    // 第三种 
    A *a3 = new A(3);   // a3所指的对象在堆中,但是a3本身放在栈中 
    a3->printNum();
    delete a3;

    return 0;
}

运行结果:

Constructor method is invoked! n = 1 Constructor method is invoked! n = 2 Constructor method is invoked! n = 3

分析:
(1)第一种方法和第二种方法写法略有差异,但本质上是一样的。

(2)一个由C/C++编译的程序占用的内存分为以下四个部分:
① 栈区(stack)–由编译器自动分配释放,存放函数的参数值,局部变量的值等。
② 堆区(heap)–由程序员分配释放。若程序员不释放,程序结束时可能由OS回收。 堆区的大小要远远大于栈区。
③ 全局区(静态区)(static)–全局变量和静态变量的存储是放在一块的。
里面细分有一个常量区,字符串常量和其他常量也存放在此。
该区域是在程序结束后由操作系统释放。
④ 程序代码区–存放函数体的二进制代码。 也是由操作系统进行管理的。

(3)a1和a2,都是局部变量,放在栈里。
指针a3本身放在栈区,但是它指向的对象,即new A(),放在堆里。
用malloc或new出来的对象,都是放在堆里。
cout < cout <<&a3,这样得到的地址,是指针a3本身的地址,在栈里。
(4)new出来的对象,使用完之后,要用delete语句来释放内存。



更多内容请关注微信公众号


推荐阅读
  • 深入解析C++ Atomic编程中的内存顺序
    在多线程环境中,为了防止多个线程同时修改同一数据导致的竞争条件,通常会使用内核级同步对象,如事件、互斥锁和信号量等。然而,这些方法往往伴随着高昂的上下文切换成本。本文将探讨如何利用C++11中的原子操作和内存顺序来优化多线程编程,减少不必要的开销。 ... [详细]
  • C基本语法C程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互。现在让我们简要地看一下什么是类、对象,方法、即时变量。对象-对象具有状态和行为 ... [详细]
  • 深入理解Java反射机制
    本文将详细介绍Java反射的基础知识,包括如何获取Class对象、反射的基本过程、构造器、字段和方法的反射操作,以及内省机制的应用。同时,通过实例代码加深对反射的理解,并探讨其在实际开发中的应用。 ... [详细]
  • GCC(GNU Compiler Collection)是GNU项目下的一款功能全面且高效的多平台编译工具,广泛应用于Linux操作系统中。本文将详细介绍GCC的特点及其基本使用方法。 ... [详细]
  • 本文主要解决了在编译CM10.2时出现的关于Samsung Exynos 4 HDMI HAL库中SecHdmiV4L2Utils.cpp文件的编译错误。 ... [详细]
  • 题目描述墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会像你发布如下指令ÿ ... [详细]
  • 题目描述:给定 n 把雨伞和 m 个人,t 分钟后开始下雨。求在每个人只能使用一把雨伞的情况下,最多有多少人可以拿到雨伞。 ... [详细]
  • 本文探讨了Codeforces 580C题目——Kefa与公园的问题,深入分析了如何在给定条件下帮助Kefa找到合适的餐厅。 ... [详细]
  • 基于OpenCV的小型图像检索系统开发指南
    本文详细介绍了如何利用OpenCV构建一个高效的小型图像检索系统,涵盖从图像特征提取、视觉词汇表构建到图像数据库创建及在线检索的全过程。 ... [详细]
  • 本文介绍了如何在Windows操作系统中安装FFTW库,并详细说明了使用Visual Studio 2010进行4096点快速傅里叶变换(FFT)的步骤。包括下载预编译文件、生成库文件以及配置环境等关键环节。 ... [详细]
  • 本文探讨了如何利用数组来构建二叉树,并介绍了通过队列实现的二叉树层次遍历方法。通过具体的C++代码示例,详细说明了构建及打印二叉树的过程。 ... [详细]
  • 2022年4月15日的算法练习题,包括最长公共子序列和线段树的应用。 ... [详细]
  • 深入解析mt_allocator内存分配器(二):多线程与单线程场景下的实现
    本文详细介绍了mt_allocator内存分配器在多线程和单线程环境下的实现机制。该分配器以2的幂次方字节为单位分配内存,支持灵活的配置和高效的性能。文章分为内存池特性描述、内存池实现、单线程内存池实现、内存池策略类实现及多线程内存池实现等部分,深入探讨了内存池的初始化、内存分配与回收的具体实现。 ... [详细]
  • 本文详细解析 Skynet 的启动流程,包括配置文件的读取、环境变量的设置、主要线程的启动(如 timer、socket、monitor 和 worker 线程),以及消息队列的实现机制。 ... [详细]
  • 基于51单片机的多项目设计实现与优化
    本文探讨了基于51单片机的多个项目的设计与实现,包括PID控制算法的开关电源设计、八音电子琴仿真设计、智能抽奖系统控制设计及停车场车位管理系统设计。每个项目均采用先进的控制技术和算法,旨在提升系统的效率、稳定性和用户体验。 ... [详细]
author-avatar
Mr何冰_874
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有