c/c++开发,C++类的常用基本函数实现案例

news2024/11/17 1:35:07

一、C++类的常用基本函数

        C++类的常用基本函数主要包括:默认构造函数,普通构造函数,拷贝构造函数,析构函数,赋值(=,运算符重载)函数:

        1.默认构造函数,在没有显式初始值时,用来创建对象的构造函数,例如A(){...}

        2.普通构造函数,无法使用对象来调用构造函数,因为在构造函数构造出对象之前,对象是不存在的。通过编译器来调用。例如A(int x){...}

        3.拷贝构造函数,用于将一个对象复制到新创建的对象中。它用于初始化过程中(包括按值传递参数),而不是常规的赋值过程中,即当函数按值传递对象或者函数返回对象时,都将使用拷贝构造函数。例如A(A&){...}

        4.=赋值运算符重载,用于给类对象赋值,参数要使用引用,可以避免调用拷贝构造函数创建副本,返回值为对象引用,也可以避免使用拷贝构造函数。例如A& operator = (A&) {...},在进行重载时,要检测自我赋值这种情况,避免出错。

        5.析构函数,析构函数是与构造函数匹配的函数,用于对象注销。主要用于释放在构造函数中动态申请内存空间。

二、类基本成员函数实例设计

        例如,编写一个类似String 类的命名为MyString类为例,包含上述基本成员函数,采用一个字符指针成员变量存储数据。

        mystring.h

#ifndef _MYSTRING_H_
#define _MYSTRING_H_

#include<stddef.h>	//NULL引用

class MyString
{
public:
	MyString(void);							//默认构造函数
	MyString( const char *str = NULL );		//普通构造函数
	MyString( const MyString &other );		//拷贝构造函数
	~MyString( void );						//析构函数
	MyString& operator=(const MyString &other);	//赋值函数
	char* c_str(void) const;				//取值(取值)
private:
	char *m_data;
};

#endif

        mystring.cpp

#include "mystring.h"

#include <string.h>	//strlen strcpy
#include <assert.h>	//assert
//默认构造函数
MyString::MyString(void)
{
	MyString(NULL);	//内部调用普通构造函数
}
//普通构造函数
MyString::MyString(const char *str)
{
	if(str==NULL)
	{
		m_data = new char[1];	//对空字符串自动申请存放结束标志'\0'的空
		*m_data = '\0';
	}else{
		int length = strlen(str);
		m_data = new char[length+1]; // 分配内存
		assert(NULL!=m_data);		 // m_data的NULL判断
		strcpy(m_data, str);
	}
}
// MyString 的析构函数
MyString::~MyString(void)
{
	delete [] m_data; // 或 delete m_data;
}

//拷贝构造函数
MyString::MyString( const MyString &other ) //输入参数为const型
{
	int length = strlen(other.m_data);
	m_data = new char[length+1];	//对 m_data 加 NULL 判断
	assert(NULL!=m_data);
	strcpy(m_data, other.m_data);
}

//赋值函数
MyString &MyString::operator =( const MyString &other )//输入参数为const型
{
	if(this == &other)				//检查自赋值
		return *this;				
	delete [] m_data;				//释放原有的内存资源
	int length = strlen( other.m_data );
	m_data = new char[length+1];	//重新分配内存
    assert(NULL!=m_data);			//对 m_data 加 NULL 判断
	strcpy( m_data,other.m_data );
	return *this;					//返回本对象的引用
}

char* MyString::c_str(void) const
{
	return (char*)m_data;
}

      注意: 

        1、在构造函数中使用new,需要在析构函数中调用delete释放。new和delete,new [] 和delete [] 匹配使用。如果存在多个构造函数,使用new的方式要一致,因为析构函数只有一个。

        2.赋值运算符(=),注意防止自赋值,并确保深层次赋值,例如覆盖到各个变量,尤其是各变量中涉及到结构体、或类对象的情况。返回值一般都为对象。

三、 类基本成员函数调用测试

        main.cpp

#include "mystring.h"
#include <stdio.h>

int main(int argc, char* argv[])
{
	MyString test("hello world!");	//普通构造函数调用
	printf("%s\n",test.c_str());	//
	MyString test1 = "test world!";	//默认构造函数及赋值函数调用
	printf("%s\n",test1.c_str());
	MyString *test2 = new MyString(test);//拷贝构造函数调用
	printf("%s\n",test2->c_str());
	delete test2;					//析构函数调用
	test2 = NULL;
	return 0;
}

       命令窗口运行:g++ main.cpp mystring.h -o test.exe及运行输出结果test.exe

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

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

相关文章

苹果电脑怎么用移动硬盘ntfs?教你三招方法

苹果电脑怎么用移动硬盘ntfs&#xff1f;Mac可以正常读取NTFS外置设备上的文件&#xff0c;但是不能够正常往里面写入文件&#xff0c;同样不能对上面的文件进行编辑、删除、移动等&#xff0c;如果想要进行这些操作。 一、什么是NTFS NTFS是一个日志文件系统&#xff0c;这意…

稍纵即逝,读博期间要注意的事情 / 读博期间一定不要做的事

稍纵即逝&#xff0c;读博期间要注意的事情 读博期间一定不要做的10件事 tip&#xff1a;配图除了缓解文章疲劳&#xff0c;就没有其它意图了。 时间稍纵即逝&#xff0c;博士期间的科研时间其实非常紧张和短缺。对于刚入学的博士新生&#xff0c;尤其是直博生和长学制&#…

DMA驱动开发---认识DMA

DMA定义&#xff1a; DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预&#xff0c;通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。 DMA传输方式&#xff1a; DMA的作用就是实现数据的直接传输&#xff0c;而去掉了传统数…

Go 恶意软件增多,分析两个新发现的零检出样本

由于 Go 良好的跨平台特性&#xff0c;在多个操作系统与架构上都能运行&#xff0c;所以最近使用 Go 语言编写的恶意软件越来越多&#xff0c;每周都会发现大量的新样本。 在四月末&#xff0c;研究人员通过蜜罐发现了两个新的变种&#xff08;Backdoorit和 Caligula&#xff…

AOSP 8.0 系统启动概要

目录 一、Android 系统启动流程图 二、系统启动阶段 三、 系统重要进程 3.1 父进程 3.2 重量级进程 一、Android 系统启动流程图 备注&#xff1a;&#xff08;图片引用gityuan&#xff09; 二、系统启动阶段 step1. 启动电源及系统&#xff1a;电源按下后&#xff0c;引…

家庭网络WIFI相关知识

文章目录参考资料路由器的最大下载速率WFI协议WIFI工作频段和信道2.4GHZ频段5GHz频段双频路由器兼容性覆盖WIFI信号为什么总这么差&#xff1f;参考资料 WiFi穿墙完全指南&#xff1a;你的网速是由什么决定的&#xff1f; 路由器的最大下载速率 所谓的450M路由器中的“450M”…

【Catalyst 9000 内嵌抓包方法】

新的一年 新的征程 新的课程开班 等你来学&#xff01; 1.在特权模式下进入如下配置 switch#monitor capture XXX interface Gix/x/x both 或 control-plan both <<<<< control-plan为CPU抓包 switch#monitor capture XXX match any 或 access-list XX swi…

4.6--贪心--最小生成树(MST)

一共有两种方法Prim算法和Kruskal算法都可以看作是应用贪心算法设计策略的例子。 Prim算法--选集合S中所有顶点的邻接点 距离最短的那个点&#xff08;不属于S&#xff09;加入集合S Kruskal算法--每次选取最短的且不构成回路的边 它们都利用了下面的最小生成树性质&#xf…

VRP系统下增加网络设备安全性之console接口

VRP即华为设备的操作系统 增加网络设备安全性的其中一种措施是增加console的安全 增强console安全性 1、使用密码登陆 首先先进入设备的console接口&#xff1a; 在进入系统视图时&#xff0c;可以使用system-view或sys 在进入console接口时&#xff0c;可以使用user-inte…

RPC的序列化方案详解

1 为什么需要序列化&#xff1f; 网络传输的数据须是二进制数据&#xff0c;但调用方请求的出入参数都是对象&#xff1a; 对象不能直接在网络传输&#xff0c;需提前转成可传输的二进制&#xff0c;且要求可逆&#xff0c;即“序列化” 将对象转换成二进制数据 这时&#xf…

拉伯证券|磷酸铁锂电池低温性能怎么解?

磷酸铁锂系电池本钱相对三元系电池低&#xff0c;且安全性好&#xff0c;寿命长。随着技能的前进&#xff0c;实践能量密度也在无限挨近理论能量密度。所以其市场占有率也在稳步上升&#xff0c;且现已超越三元系锂电池的装机量。 但磷酸铁锂&#xff08;LiFePO4&#xff0c;L…

Java网络编程 - UDP通信

文章目录UDP通信快速入门一发一收多发多收广播组播UDP通信 快速入门 UDP协议的特点: UDP是一种无连接、不可靠传输的协议。 将数据源IP、目的地IP和端口以及数据封装成数据包&#xff0c;大小限制在64KB内&#xff0c;直接发送出去即可。 UDP协议通信首先要有DatagramPacket数…

flume kafka channel 应用详解

1 官方文档 Documentation -> Flume User Guide2 kafka source (消费者) Kafka Source is an Apache Kafka consumer that reads messages from Kafka topics. If you have multiple Kafka sources running, you can configure them with the same Consumer Group so each …

2.DjangoRestFramework【基于DRF的RESTAPI的序列化使用】

进入Django rest framwork官网就能看到rest_framwork相关的教程; 1.安装rest_framwork pip install djangorestframework pip install markdown # Markdown support for the browsable API. pip install django-filter # Filtering support2.在setting中注册 setting…

QT-线性拟合(自动找直线区域)

最近有个需求&#xff0c;需要对一个S曲线的散点图做线性拟合&#xff0c;百度上线性拟合和曲线拟合公式很多&#xff0c;没什么问题&#xff0c;但需求里面有一个预期就是自动找出直线部分&#xff0c;前面因为其它事情耽搁&#xff0c;一直没有实现&#xff0c;心里多少有点梗…

SpringBoot微服务项目,转发并响应下载请求

在微服务项目中&#xff0c;我经常会碰到从一个微服务项目转发下载请求并实现下载文件的需求&#xff0c;因此在此做一个转发下载的示例。总的下载转发流程如下&#xff0c;我会按照这个流程一一介绍下载流程。 1、客户端的下载请求 这里主要介绍controller层是如何接收客户端…

apple pencil一代平替笔有哪些?平替电容笔推荐

当今社会&#xff0c;高科技推动了数字产品的发展。无论是在工作中&#xff0c;还是在学习中&#xff0c;大的屏幕都能让画面变得更清楚。不管是现在还是未来&#xff0c;Ipad设备都会变成我们每天的一个重要组成部分。如果ipad与一款易于使用的电容笔相结合&#xff0c;将会大…

git-secret:在 Git 存储库中加密和存储密钥(下)

在本篇文章中&#xff0c;将带你了解如何在 Docker 容器中设置git-secret和gpg&#xff0c;通过 Makefile recipe 为不同的场景创建工作流。 Makefile Adjustment 将git-secret和gpg指令添加到 Makefile 中.make/01-00-application-setup.mk&#xff1a; # File: .make/01-0…

C语言基础复习

目录 数组 一维数组 完全初始化int a[5]{1,2,3,4,5}; 不完全初始化int a[5]{1,2} 完全不初始化”&#xff0c;int a[5] 二维数组 完全初始化 不完全初始化 指针 变量的访问方式&#xff1a; 指针变量的定义&#xff1a; 指针变量的赋值&#xff1a; 指针变量的运算…

Spring-Security入门

简介 Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro&#xff0c;它提供了更丰富的功能&#xff0c;社区资源也比Shiro丰富。 ​ 一般来说中大型的项目都是使用SpringSecurity 来做安全框架。小项目有Shiro的比较多&#xff0c;因为相比与Spring…