服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++基础入门教程(六):为什么创建类的时候要用new?

C++基础入门教程(六):为什么创建类的时候要用new?

2021-02-20 15:02C++教程网 C/C++

这篇文章主要介绍了C++基础入门教程(六):为什么创建类的时候要用new?本文讲解了使用new创建动态结构体、为什么要有new、自动存储(自动变量、局部变量)、动态存储、vector和array等内容,需要的朋友可以参考下

今天是关于指针初步介绍的最后一篇,也是能让初学者明白为什么类是new出来的、为什么某些变量会莫名被释放,以及为什么木头会这么聪明。

1.使用new创建动态结构体

还记得我们的结构体吧?之前说过,结构体也是可以通过new来创建存储空间的,返回的是一个指向结构体类型空间的指针。

如下代码:

复制代码 代码如下:

struct Man
    {
        int age;
        int IQ;
    };
    Man* pMan = new Man;
    pMan->IQ = 251;
    cout << pMan->IQ << "\n";
    cout << (*pMan).IQ << "\n";

 

定义一个结构体Man,然后使用new Man来动态创建内存空间,返回一个指针,这个指针指向一块用于存放Man类型的内存空间。
然后调用pMan->IQ给属性赋值,这里的“->”符号我们应该都很属性吧。
 
稍微说明一下,如果不是用new来创建的对象,那么,应该使用.符号来使用属性。
如果使用new创建的对象,则使用->符号来使用属性。
 
但实际上,最终还是.符号,->符号只是语法糖。
因为pMan是指针,所以*pMan是指针所指内存空间上的对象值,于是,调用属性是这样的:(*pMan).IQ
但每次都这么调用,很麻烦,于是就有了pMan->IQ这种方便的形式。
 
所以,大家不要再搞混了.和->了~
一般情况,可以理解为,指针都使用->符号。
 
(这段文字感觉解释地很糟糕,因为我旁边有人在一直说话,我思绪不太安静…)

2.为什么要有new?

为什么要有new?为什么要动态创建对象?为什么有时候不用new,有时候又用new,比如:

复制代码 代码如下:

// Cocos2d-x3.x的Value类,大家都很熟悉了
Value v = Value(100);
// Cocos2d-x的Sprite类,也很属性了
Sprite* sp = new Sprite();

 


为什么有些地方不用new,有些地方又要new呢?
 
这就涉及到自动存储和动态存储了。

3.自动存储(自动变量、局部变量)

自动存储,也叫做自动变量,比如int num = 10; 这个num就属于自动变量。
所谓自动,代表它会自动申请内存,也会自动释放内存,自动变量是保存在栈里的(后进先出)。
 
如果大家觉得很难理解,那么,换一个名称——局部变量。
这个好理解了吧?局部变量在离开函数,或者离开它所属的代码块之后,就会被释放。
 
而Value v = Value(100); 、int num = 10; 这些都是局部变量,一旦离开函数或者离开它的作用域,就会被释放。
比如把int num; 作为成员变量,那么,在这个类被释放的时候,num变量也会被释放。
这就是为什么我们在创建了这么多int、float等基本类型的变量之后,不需要去释放它们。
因为它们是自动被释放的。

4.动态存储

自动变量有很大的好处,那就是不需要我们去管内存方面的事情,但是,有时候我们不希望有这样的自动释放内存。

我们希望自己去控制什么时候释放对象,这时候就要用到new了。

我们都知道,new了之后,如果不调用相应delete的话,申请到的内存空间是永远都不会被释放的。
这就是动态存储了,我们自己来申请内存,自己来释放内存。

当然,内存泄露的罪魁祸首之一也正是new~!

因为正常人都会有疏忽的时候,并且当程序足够庞大、逻辑足够复杂的时候,有些地方调用了new,却疏忽了delete是再正常不过了。
 
当然,new的作用也许不仅于此,书上目前还没深入介绍,我也不多说,免得说错,毕竟C++还是需要严谨一些的~

我不敢乱吹水~

5.vector和array

相信不少初学者会被Cocos2d-x3.x的Vector给弄迷糊了。

Vector是Cocos2d-x封装的一个类,而vector是C++里提供的一个类。

一个首字母大写,一个首字母小写,不要再弄错喇~
 
C++的vector是一种动态数组的实现,我们都知道,数组在声明的时候就要确定数组的大小,除非是使用new的方式。

vector就是使用new来申请内存的,但它已经封装好了,不需要我们去处理内存释放的问题。
 
vector的使用方式很简单:

 

复制代码 代码如下:

// 可以在声明的时候就进行初始化
    vector<int> v = {1, 2};
    // 可以动态地添加新的元素进去
    v.push_back(5);
    // 使用at来获取某个元素
    cout << v.at(2);
    // 也可以像数组一样获取某个元素
    cout << v[2];

 

注意,使用vector要引入头文件:#include <vector>
既然是动态数组,那就肯定可以动态添加和删除元素。
获取元素的方式有两种,一种是使用at,这种方式比较安全,会检查下标是否合法。
也可以使用普通数组的方式来获取元素,这种方式比较危险,不会检查下标是否合法。
 
好了,vector就不多说了~
 
另外还有一个array类,这是C++11新增的。
vector是动态数组,效率自然要逊色一些。
而普通数组使用起来可能不太方便和安全。
于是,array诞生了,array也是固定长度的数组,但是使用起来可能更方便和安全:

复制代码 代码如下:

array<int, 2> arr = { 1, 2 };
    cout << arr.at(1);

 

声明的方式比较特别,需要制定数组类型和大小,因为是固定长度的数组,大小也是不能变的。
获取元素的方式依旧有两种,使用at或者普通数组的方式,两种方式的区别和vector一样。

6.结束

好了,书籍第四章的内容到这里就结束了。
这一章的内存比较杂乱,算是什么知识都介绍了一些吧,但都不太深入。
最近事很多,希望能继续坚持。

延伸 · 阅读

精彩推荐
  • C/C++C++之重载 重定义与重写用法详解

    C++之重载 重定义与重写用法详解

    这篇文章主要介绍了C++之重载 重定义与重写用法详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    青山的青6062022-01-04
  • C/C++详解c语言中的 strcpy和strncpy字符串函数使用

    详解c语言中的 strcpy和strncpy字符串函数使用

    strcpy 和strcnpy函数是字符串复制函数。接下来通过本文给大家介绍c语言中的strcpy和strncpy字符串函数使用,感兴趣的朋友跟随小编要求看看吧...

    spring-go5642021-07-02
  • C/C++深入理解goto语句的替代实现方式分析

    深入理解goto语句的替代实现方式分析

    本篇文章是对goto语句的替代实现方式进行了详细的分析介绍,需要的朋友参考下...

    C语言教程网7342020-12-03
  • C/C++C/C++经典实例之模拟计算器示例代码

    C/C++经典实例之模拟计算器示例代码

    最近在看到的一个需求,本以为比较简单,但花了不少时间,所以下面这篇文章主要给大家介绍了关于C/C++经典实例之模拟计算器的相关资料,文中通过示...

    jia150610152021-06-07
  • C/C++c++ 单线程实现同时监听多个端口

    c++ 单线程实现同时监听多个端口

    这篇文章主要介绍了c++ 单线程实现同时监听多个端口的方法,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下...

    源之缘11542021-10-27
  • C/C++C语言中炫酷的文件操作实例详解

    C语言中炫酷的文件操作实例详解

    内存中的数据都是暂时的,当程序结束时,它们都将丢失,为了永久性的保存大量的数据,C语言提供了对文件的操作,这篇文章主要给大家介绍了关于C语言中文件...

    针眼_6702022-01-24
  • C/C++C语言实现电脑关机程序

    C语言实现电脑关机程序

    这篇文章主要为大家详细介绍了C语言实现电脑关机程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    xiaocaidayong8482021-08-20
  • C/C++学习C++编程的必备软件

    学习C++编程的必备软件

    本文给大家分享的是作者在学习使用C++进行编程的时候所用到的一些常用的软件,这里推荐给大家...

    谢恩铭10102021-05-08