IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++构造器、析构器、拷贝构造器和赋值运算符重载 -> 正文阅读

[C++知识库]C++构造器、析构器、拷贝构造器和赋值运算符重载

  序言:本篇文章用于记录C++学习的构造器、拷贝构造器、析构器、赋值运算符重载的记录,该文章以自己实现stringl类型为实例进行练习。
 1.mystring.h文件(函数声明)
class mystring{
	public:
		mystring(const char*p = NULL);        //构造器
		mystring(const mystring & another);   //拷贝构造器
		mystring& operator=(const mystring & another); //赋值运算符重载
		~mystring();   //析构器
		char * c_str();
	private:
		char * _str;
		
};
  2.mystring.cpp文件(函数实现)
#include <iostream>
#include "mystring.h"
#include <string.h>

using namespace std;

//构造器
//1.在对象创建时自动调用,完成初始化相关工作
//2.无返回值,与类名相同
//3.可以重载,可默认参数(默认参数在声明阶段)
//4.系统提供默认无参空体,自己实现的话系统不提供默认
mystring::mystring(const char* p){
	if(p == NULL){
		_str = new char[1];
		*_str = '\0';
	}else{
		int len = strlen(p);
		_str = new char[len+1];
		strcpy(_str,p);
	}
}

//拷贝构造器(由已存在的对象来创建新的对象,由拷贝构造器来完成)
//1.格式 A(const A & another);
//2.若不提供,系统会提供默认,自己实现的话系统不提供默认
//3.系统提供的默认,是一种等位拷贝。也就是“浅浅的拷贝”
//4.浅拷贝会导致内存重析构。double free
//5.拷贝构造器发生的时期:(1)制作对象的副本、(2)以对象作为参数和返回值
mystring::mystring(const mystring & another)
{
	//在同类之间是没有隐私的,这就是浅拷贝,_str和another._str指向同一个地址,
	//析构的时候会将这一个地址析构两遍
	//_str = another._str; 
	
	//_str重新执行一个新地址,将原地址的内容拷贝到新地址里,深拷贝
	int len = strlen(another._str);
	_str = new char[len+1];
	strcpy(_str,another._str);
}

//赋值运算符重载
//1.系统提供默认,系统提供的默认也是一种等位赋值,自己实现的话系统不提供默认
//2.浅赋值,有可能会导致自身内存泄露和重析构
//3.自赋值

mystring& mystring::operator=(const mystring & another)
{
	if(this == &another)
		return *this;
	delete []this->_str; //先把自己内存释放掉
	int len = strlen(another._str);
	this->_str = new char[len+1];
	strcpy(this->_str,another._str);
	return *this;
}

char* mystring::c_str()
{
	return _str;
}

//析构器
//1.对象销毁时自动调用,完成对象的销毁等善后工作。
//2.无返回值,与类名相同,前面有一个“~”号,无参,不可以重载和有默认参数
//3.系统提供默认空析构器,自己实现的话系统不提供默认
mystring::~mystring()
{
	delete []_str;
}

3.mystringmain.cpp文件(函数调用)

#include <iostream>
#include "mystring.h"
using namespace std;
int main()
{
	string s1;
	string s2("usa");
	
	cout<<s1.c_str()<<endl;
	cout<<s2.c_str()<<endl;
	
	cout<<"--------------------"<<endl;
	
	mystring ms("china");  //创建对象ms,默认调用构造函数
	mystring ms2(ms);     //由已存在的对象ms来创建新的对象ms2,默认调用拷贝构造函数
	
	//用一个已有的对象,给另外一个对象赋值。两个对象均已创建结束后,
	//发生的赋值行为会调用赋值运算符重载
	mystring ms3;
	ms3=ms2;     
	mystring ms4; //等价于上面的一个操作
	ms4.operator=(ms3);
	
	cout<<ms.c_str()<<endl;
	cout<<ms2.c_str()<<endl;
	cout<<ms3.c_str()<<endl;
	cout<<ms4.c_str()<<endl;
	
	return 0;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-11 18:37:21  更:2021-09-11 18:39:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:46:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码