第10课 C++中的新成员

1. 动态内存分配

(1)C++通过new关键字进行动态内存申请,是以类型为单位来申请空间大小的

(2)delete关键字用于内存释放

▲注意释放数组时要加[],否则只释放这个数组中的第1个元素。

【实例分析】C++中的动态内存分配

#include <stdio.h>

int main()
{
    int* p = new int;

    *p = 5;
    *p = *p + 10;

    printf("p = %p\n", p);  //p保存堆上开辟空间的地址
    printf("*p = %d\n", *p);//15

    delete p;

    p = new int[10];//申请10个int型空间

    for(int i=0;i<10; i++)
    {
        p[i] = i + 1;
        printf("p[%d] = %d\n", i, p[i]);
    }

    delete[] p; //注意:释放数组时[]不能漏掉

    return 0;
}

2. new关键字

(1)对比new和malloc


new


malloc


性质


是个关键字,属C++的一部分


是由C库提供的函数


申请单位


以具体类型为单位


字节为单位


内存初始化


申请单个类型变量时可进行初始化


不具备内存初始化的特性

(2)new关键字的初始化

  int* pi = new int(1);

float* pf = new float(2.0f);

char* pc = new char(‘c‘);

【编程实验】初始化动态内存

#include <stdio.h>

int main()
{
    int* pi = new int(1); //开辟1个int型空间,并初始化为1
    //int* pa = new int[1];//注意,这时申请一个数组,与前一行含义不同

    float* pf = new float(2.0f);
    char* pc = new char(‘c‘);

    printf("*pi = %d\n", *pi); //1
    printf("*pf = %f\n", *pf); //2.000000
    printf("*pc = %c\n", *pc); //c

    delete pi;
    delete pf;
    delete pc;

    return 0;
}

3. C++中的命名空间

(1)在C语言中只有一个全局作用域

  ①C语言中所有的全局标识符共享同一个作用域

  ②标识符之间可能发生冲突

(2)C++中提出了命名空间的概念

  ①命名空间将全局作用域分成不同的部分

  ②不同命名空间中的标识符可以同名而不会发生冲突

  ③命名空间可以相互嵌套

  ④全局作用域也叫默认命名空间

(3)C++命名空间的定义:namespace Name {}

(4)命名空间的使用

  ①使用整个命名空间:using namespace name;

  ②使用命名空间中的变量using name::variable;

  ③使用默认命名空间中的变量: ::variable

【实例分析】命名空间的使用

#include <stdio.h>

namespace First
{
    int i = 0;
}

namespace Second
{
    int  i = 1;

    //命名空间的嵌套
    namespace Internal
    {
        struct P
        {
            int x;
            int y;
        };
    }
}

int main()
{
    using namespace First;//使用First整个命名空间
    using Second::Internal::P;//使用命名空内部的P结构体

    printf("Fisrt::i = %d\n", i); //0。可以直接写i,因为使用了First整个命名空间
    printf("Second::i = %d\n", Second::i);//1。须带命名空间的名字

    P  p = {2, 3};

    printf("p.x = %d\n", p.x);//2
    printf("p.y = %d\n", p.y);//3

    return 0;
}

4. 小结

(1)C++中内置了动态内存分配的专用关键字

(2)C++中的动态内存分配可以同时进行初始化

(3)C++中的动态内存分配是基于类型进行的

(4)C++中命名空间概念用于解决名称冲突问题

时间: 2024-10-06 04:56:33

第10课 C++中的新成员的相关文章

Delphi RAD Studio 10.2.3中的新功能:FireMonkey用户界面模板

新版的ide中包含了移动端的18个模板,增强了用户体验,并让开发更加快捷. 界面如下: (1)登录模板截图 (2)定制Jet iOS风格 (3)自定义Sterling风格 (4)Sterling iOS风格的 原文地址:https://www.cnblogs.com/windel/p/8685919.html

第10课 初探 Qt 中的消息处理

1. Qt消息模型 (1)Qt封装了具体操作系统的消息机制 (2)Qt遵循经典的GUI消息驱动事件模型 2. 信号与槽 (1)Qt中定义了与系统消息相关的概念 ①信号(Signal):由操作系统产生的消息 ②槽(Slot):程序中的消息处理函数 ③连接(Connect):将系统消息绑定到消息处理函数(映射规则) (2)Qt中的消息处理机制 (3)Qt的核心——QObject::connect函数 ①函数原型 bool connect(const QObject* sender, //发送对象 c

向Java枚举类型中添加新方法

除了不能继承enum之外,可将其看做一个常规类.甚至可以有main方法. 注意:必须先定义enum实例,实例的最后有一个分号. 下面是一个例子:返回对实例自身的描述,而非默认的toString返回枚举实例的名字. public enum Color { RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4); // 成员变量 private String nam

.NET Framework 4 中的新 C# 功能

C# 编程语言自 2002 年初次发布以来已经有了极大的改善,可以帮助程序员编写更清晰易懂.更容易维护的代码.这种改善来自于不断加入的新功能,例如泛型类型.可为空的值类型.lambda 表达式.迭代器方法.分部类以及其他大量有用的语言结构.而且,这些改变还经常伴随着为 Microsoft .NET Framework 库提供相应的支持. C# 4.0 延续了这种不断提高易用性的趋势.这款产品大大简化了许多常见任务,包括泛型类型.传统的互操作以及处理动态对象模型.本文旨在为深入调查探讨这些新功能.

【译】.NET Core 3.0 中的新变化

.NET Core 3.0 是 .NET Core 平台的下一主要版本.本文回顾了 .Net Core 发展历史,并展示了它是如何从基本支持 Web 和数据工作负载的版本 1,发展成为能够运行 Web.桌面.机器学习.容器.IoT 等的版本 3.0. .NET Core 1 .NET Core 的历史可追溯到几年前,版本 1 是在 2016 年推出,旨在生成第一版开放源代码和跨平台(Windows.macOS 和 Linux)的 .NET.灵感来源于只能使用开放源代码框架的客户,以及需要在 Li

C++--第16课 - 继承中的构造与析构

第16课 - 继承中的构造与析构 1. 赋值兼容性原则 (1)      子类对象可以当作父类对象使用. (2)      子类对象可以直接赋值给父类对象. (3)      子类对象可以直接初始化父类对象. (4)      父类指针可以直接指向子类对象. (5)      父类引用可以直接引用子类对象. 子类就是特殊的父类 #include <cstdlib> #include <iostream> using namespace std; class Parent { pro

C# 8.0中的新功能

微信公众号:Fintech极客 作者为软件开发工程师,就职于金融信息科技类公司,通过CFA一级,分享计算机和金融相结合领域的技术和知识. C# 8.0中的新功能 C# 8.0已经推出来好长一段时间了, 由于公司目前主要使用的还是6.0版本,加上之前个人事情较多,一直没有总结,今天主要查看和测试微软官方文档中的内容:https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8 只读成员(Readonly members) 在st

第73课 Qt中的多线程编程

1. QThread类 (1)QThread是一个跨平台的多线程解决方案 (2)QThread以简洁易用的方式实现多线程编程 2. QThread中的关键成员函数 (1)virtual void run() :线程函数,用于定义线程功能(执行流). (2)void start():启动函数,将线程入口地址设置为run函数.启动线程,新线程开始执行run函数. (3)int exec():进入事件循环,直至调用exit().返回线程退出事件循环的返回码. (4)void terminate():强

结构体中最后一个成员为[0]或[1]长度数组(柔性数组成员)的用法

结构体中最后一个成员为[0]长度数组的用法:这是个广泛使用的常见技巧,常用来构成缓冲区.比起指针,用空数组有这样的优势:(1).不需要初始化,数组名直接就是所在的偏移:(2).不占任何空间,指针需要占用int长度空间,空数组不占任何空间.“这个数组不占用任何内存”,意味着这样的结构节省空间:“该数组的内存地址就和它后面的元素地址相同”,意味着无需初始化,数组名就是后面元素的地址,直接就能当指针使用. 这样的写法最适合制作动态buffer,因为可以这样分配空间malloc(sizeof(struc