C++中类和动态内存分配

new关键字

在C++中,内存分为栈和堆。栈中的对象生命周期较短,往往在作用域结束后就会销毁,而堆中的对象生命周期较长,只有当使用delete或者程序结束时才会销毁。而new则是将我们创建的对象分配到堆中,使对象可以跨作用域使用。

类成员

部分引用类型的类成员就会用到new,例如String中的char*指针,这样类就可以处理不同长度的字符串,而不是在类设计时固定一个数组的长度,但是在类构造中使用new一定要记得释放和同步,如果构造函数中使用new则在析构函数用要使用delete。

String::String(){ stp = new char[length + 1];}

String::~String(){ delete stp; stp = NULL;}

 

类的赋值运算符和复制构造函数

这个还挺重要的,因为在C++中不使用new也可以创建类对象,但是是分配在栈中的,这样在使用指针的时候就会出现一些问题。

String function(String stp){

String myString;  //隐式调用默认构造函数在栈中创建一个myString对象 

stp = myString;

return stp;

}    //当该作用域结束时,该对象会被销毁,而其也会相应的调用其析构函数

在上述例子中,我们是可以获得一个返回的String对象的,但是当调用其中的指针读取字符时则会出现问题,首先:

1.当需要赋值时会创建一个临时变量,然后调用复制构造函数将myString对象中的成员对象复制到临时变量中。

2.在使用复制构造函数时,只会简单的进行浅拷贝,对于基本类型是值拷贝,而引用类型则是地址的拷贝。

3.赋值运算符还是会进行一次对象的赋值,所以还需要重写赋值运算符,因为不清楚程序是否会调用还是保险为好。

当使用stp = myString;时

可能会用到复制构造函数,也可能用到赋值运算符,在这种情况下可以使用两者都进行重写。

重写复制构造函数:

Class_name(const Class_name&);

重写赋值运算符:

Class_name& Class_name::operator=(cosnt Class_name&);

例子:

String(const String& str){

        delete[] this->stp;

        this->stp = new char[length + 1];

        for(int i = 0; i < size;i++){

                        this->stp[i] = str.stp[i];

        }

}

使用上述构造函数和赋值运算的重写,将类对象中的引用类型进行值的拷贝,这样当赋值时临时对象的销毁就不会引起空指针或者内存泄漏的问题。

成员初始化列表

 C++构造函数提供了一种可以用来初始化数据成员的特殊语法,就是使用成员初始化列表。

语法:

String::String(int qs):qSize(qs),items(0),front(NULL),real(NULL){

                        

}

这种方式可以初始化非静态的const对象。

或者直接在类中定义初始化

class String{

        private:

        enum{Q_SIZE = 10};

        Node* front = NULL;

        int items = 0;

        const int qSize = Q_SIZE;

}

 

自动应用类型转换

 将一个标准类型变量赋给另一种标准类型变量时,如果两者类型兼容,则C++自动将这个值转换为接收变量的类型。

只接受一个参的构造函数才能作为转换函数。

String(double db);

String(int i);

String(char a);

当声明以上构造函数时,使用下面方式会进行隐式的调用对应的构造函数,将其他类型转为String类型对象.

String a = 1;  //调用形参为int的构造函数

String b = 23.2;  //double 

function(String str);

function(1);  //也会转换为String对象

但是这样会产生一部分问题,当并不想隐式的执行转换函数时,需要使用explicit关键字来关闭这种自动特性。

explicit String(int i);  //不能隐式的作为转换。 

String a = 1  //错误,不能使用隐式转换

String a = (String)1;  //正确

String a = String(1);  //正确

类构造器也支持自动转换,允许可以转型的对象进行自动的转换.

例如,只持有一个double型参的构造函数:

 String(double db);

String a = 1;  //将int类型转换为double类型然后创建对象。

但是自动转换不能有二义性,如果String构造函数中还存在其他可以由int转型的类型如long,则会出现错误,编译器将提示错误。

转换函数

 既然可以将其他类型转换为类对象,也可以将类对象转换为特定的一种类型,需要使用到转换函数。

需要注意的是:

1.转换函数为类方法

2.不允许有返回类型

3.不能有型参

语法:

operator double();

例子:

explicit operator int(){  //使用explicit关键字,防止隐式转化

       int length = this->size;   

        int sumNum = 0;

        int dig = 1;

        for(int i = 0; i < length; i++){

                sumNum += (this->stp[i] - '0') * dig;

                dig *= 10;           

        }     

        return sumNum;

}

在上述例子中,将字符数组中的数字进行计算,得出了一个int值,实现了将String对象转换为int类型。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/161072.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年【广东省安全员B证第四批(项目负责人)】报名考试及广东省安全员B证第四批(项目负责人)复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 广东省安全员B证第四批&#xff08;项目负责人&#xff09;报名考试是安全生产模拟考试一点通总题库中生成的一套广东省安全员B证第四批&#xff08;项目负责人&#xff09;复审考试&#xff0c;安全生产模拟考试一点…

json_to_mask

修改后的json_to_dataset文件&#xff0c;直接复制替换你自己原始的json_to_dataset&#xff0c;建议保存一下原版import argparse import base64 import json import os import os.path as ospimport imgviz import PIL.Imagefrom labelme.logger import logger from labelme …

java:springboot单元测试spring-boot-starter-test

背景 Java的单元测试可以使用多个框架&#xff0c;其中比较流行的包括&#xff1a; JUnit&#xff1a;JUnit是Java单元测试最常用的框架&#xff0c;它提供了一套丰富的API&#xff0c;可以方便地编写测试用例和测试套件。JUnit 5是JUnit的最新版本&#xff0c;引入了许多新功…

ElMessageBox中的子组件回调关闭函数

父组件中&#xff1a; const closeMessageBox () > {ElMessageBox.close();getList(); };const open () > {ElMessageBox({title: 添加商品,message: h(AddTaxExemption, { onClose: closeMessageBox }),customClass: custom-message-box, showConfirmButton: false,d…

各大电商平台双十一“狂飙”,如何选择商城系统?

今年是“双十一”的第十五年。作为各大平台和品牌的全年最重要的营销节点&#xff0c;品牌们可谓是来势汹汹&#xff0c;各种促销活动和优惠力度让人眼花缭乱。 淘天数据显示&#xff0c;天猫促销活动开售当晚&#xff0c;155个品牌开卖成交额突破1亿元&#xff1b;首小时内7.1…

str转wstr的三种方法和从网站获取json数据到数据随机提取,返回拼接字符串和动态数组

库的设置 hv库 外部包含目录&#xff1a;…\include\libhv_new\hv; 库目录&#xff1a;…\include\libhv_new\lib\x86\Release; 附加依赖项&#xff1a;hv.lib; //Get请求 获取json数据&#xff0c;然后提取符合 条件的&#xff0c;time值大于自定义变量的值&#xff0c;然后取…

【UE】用样条线实现测距功能(上)

目录 效果 步骤 一、创建样条网格体组件3D模型 二、实现点击连线功能 三、实现显示两点间距离功能 效果 步骤 一、创建样条网格体组件3D模型 创建一个圆柱模型&#xff0c;这里底面半径设置为10mm&#xff0c;高度设置为1000mm 注意该模型的坐标轴在如下位置&#xff1…

基于pytest的服务端http请求的自动化测试框架?

1、引言 我有一个朋友是做 Python 自动化测试的。前几天他告诉我去参加一个大厂面试被刷了。 我问他是有没有总结被刷下来的原因。他说面试官问了一些 pytest 单元测试框架相关的知识&#xff0c;包括什么插件系统和用力筛选。但是他所在的公司用的技术是基于 unittest 的&am…

Sentinel与SpringBoot整合

好的&#xff0c;以下是一个简单的Spring Cloud整合Sentinel的代码示例&#xff1a; 首先&#xff0c;在pom.xml中添加以下依赖&#xff1a; <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel&l…

swift-基础

print区别 print(1,2,3, separator: "-", terminator: "\n")//表示用-来分割//1-2-3 //terminator表示用\n作为终止符 var a "a",b "b" print(a b) //ab print("\(a)前面是a变量\(b)后面是b变量")变量 var name "…

Win10系统无法登录Xbox live的四种解决方法

在Win10系统中&#xff0c;用户可以登录Xbox live平台&#xff0c;畅玩自己喜欢的游戏。但是&#xff0c;有用户却遇到了无法登录Xbox live的问题。接下来小编给大家详细介绍四种简单的解决方法&#xff0c;解决后用户在Win10电脑上就能成功登录上Xbox live平台。 Win10系统无法…

Linux编程 文件操作 creat open

文件描述符 文件描述符在形式上是一个非负整数。实际上&#xff0c;它是一个索引值&#xff0c;指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时&#xff0c;内核向进程返回一个文件描述符。 启动一个进程之后&#xff0c;…

SquareCTF-2023 Web Writeups

官方wp&#xff1a;CTFtime.org / Square CTF 2023 tasks and writeups sandbox Description&#xff1a; I “made” “a” “python” “sandbox” “”“” nc 184.72.87.9 8008 先nc连上看看&#xff0c;只允许一个单词&#xff0c;空格之后的直接无效了。 flag就在当…

(C)一些题2

1.在 C 语言中&#xff08;以 16位 PC 机为例&#xff09;,5种基本数据类型的存储空间长度的顺序为&#xff08;&#xff09; A . char < int < long int <float < double B . char int < long int<float <double C . char < int < long int …

inux应用开发基础知识——串口应用编程(十一)

前言&#xff1a; 在Linux系统中&#xff0c;串口设备以文件的形式存在&#xff0c;通常位于/dev目录下&#xff0c;如ttyS0、ttyUSB0等。这些设备文件可以用于读取和写入数据。要使用串口设备&#xff0c;需要打开相应的设备文件。在打开串口时&#xff0c;可以使用O_RDWR选项…

哈夫曼树你需要了解一下

哈夫曼树介绍哈夫曼数特点哈夫曼应用场景哈夫曼构建过程哈夫曼树示例拓展 哈夫曼树介绍 哈夫曼树&#xff08;Huffman Tree&#xff09;是一种特殊的二叉树&#xff0c;也被称为最优二叉树。在计算机科学中&#xff0c;它是由权值作为叶子节点构造出来的一种二叉树。哈夫曼树的…

05 取样器(BeanShell和JSR223 Sampler)

一、取样器作用 1、取样器可以理解为Jmeter的桥梁&#xff0c;或者是Jmeter的加工厂&#xff1b; 2、Jmeter使用过程中&#xff0c;经常有些数据不能直接使用&#xff0c;需要加工后才能使用&#xff1b;这样就用到了取样器&#xff1b;但是这里存在问题&#xff0c;Jmeter中的…

Differences between package.json and pnpm-lock.yaml

1.pnpm-lock.yaml 是pnpm包管理工具生成的确保依赖包的版本在所有的环境里面都相同对依赖包的任何操作都会更新在该文件中&#xff0c;因此&#xff0c;需要确保提交到代码仓库中。包含了解析的依赖项和版本号。如下图&#xff1a; 2.package.json 列出应用所需的依赖和元数…

批量修改文件名

原理&#xff1a; 利用 bat 的 REN 旧名字 新名字 命令 第一步&#xff1a; 【CtrlA】选中所有文件&#xff0c;按下【Shift】键右键任一文件夹弹出窗口选择【复制为路径】 第二步&#xff1a; 使用Excel技巧构造出 REN 旧名字 新名字 第三步&#xff1a; 用拼接好的命令…

【黑马甄选离线数仓day01_项目介绍与环境准备】

1. 行业背景 1.1 电商发展历史 电商1.0: 初创阶段20世纪90年代&#xff0c;电商行业刚刚兴起&#xff0c;主要以B2C模式为主&#xff0c;如亚马逊、eBay等 ​ 电商2.0: 发展阶段21世纪初&#xff0c;电商行业进入了快速发展阶段&#xff0c;出现了淘宝、京东等大型电商平台&a…