C++等号操作符重载

在新学操作符重载时最令人头疼的可能就是一些堆溢出的问题了,不过呢,只要一步步的写好new 与 delete。绝对不会有类似的问题。

当时我们编译可以通过,但是运行会出错,因为对象s1与s2进行赋值时,采用浅拷贝,导致对象析构时会对同一块内存空间析构两次。也就是说等号操作符“=”,默认是进行浅拷贝,我们需要对等号操作符进行重载,使其能够进行深拷贝。

同时要重载等号操作符支持链式编程,类如 s3 = s4 = s5;  //操作符使对象连载叠加,与上一篇的return *this 与 return this已经介绍过如何返回对象本身。而不是克隆。

这里写了 重载等号操作符实现深拷贝 与 操作符使对象连载叠加 的代码。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<string.h>
#include<windows.h>
using namespace std;

class student
{
public:
 student()
 {
  //默认构造函数
  cout << "This is studnt();" << endl;
  this->id = 0;
  this->name = NULL;
 }
 student(int id, const char *name)
 {
  this->id = id;
  //深拷贝构造
  int len = strlen(name);
  this->name = new char[len + 1];
  strcpy(this->name, name);
 }
 student(const student &another)
 {
  //拷贝构造
  this->id = another.id;
  int len = strlen(another.name);
  this->name = new char[len + 1];
  strcpy(this->name, another.name);
 }
 student & operator=(const student &another)
 {
  // 1.防止自身赋值
  if (this == &another)
  {
   return *this;
  }
  // 2. 给自己额外开辟的内存空间释放掉
  if (this->name != NULL)
  {
   delete[] this->name;
   this->name = NULL;
   this->id = 0;
  }
  //3. 执行深拷贝
  this->id = another.id;
  int len = strlen(another.name);
  this->name = new char[len + 1];
  strcpy(this->name, another.name);

return *this;
 }
 void printf_id_name()
 {
  cout << "id= " << id << " name= " << name << endl;
 }
 ~student()
 {
  if (this->name != NULL)
  {
   delete[] this->name;
   this->name = NULL;
   this->id = 0;
  }
 }
private:
 int id;
 char *name;
};

int main(void)
{

student s1(1, "C++");
 student s2;
 student s3(3, "ZJD666");
 
 s2=s3; //深拷贝 等号操作符重载
 s1.printf_id_name();
 s2.printf_id_name();
 s3.printf_id_name();
 cout <<" --------------------------" << endl;

student s4(4, "Hello World!");
 student s5(5, "Hello C++!");

s3 = s4 = s5;  //操作符连载
 s3.printf_id_name();

system("pause");
 return 0;
}

供学习等号操作符重载参考!!

原文地址:https://www.cnblogs.com/ZhuJD/p/11747330.html

时间: 2024-07-31 03:12:27

C++等号操作符重载的相关文章

等号操作符重载为什么不能用友元函数大揭秘,以及函数没有等到重载的时候赋值会出现什么现象(盲点)

先看下面程序结果输出什么? 1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 private: 7 int x; 8 public: 9 A(){ 10 x=99; 11 cout<<"看看这里是否会被调用"<<endl; 12 } 13 }; 14 15 int main() 16 { 17 A a; 18 a = 7; 19 } 这里面,会报错,显示没有等号匹配现象.只有

C++(三十六) — 等号操作符重载

1.等号操作符重载,实现深拷贝 //等号运算符重载 // obj3=obj1;//原始的是浅拷贝,现在要重载为深拷贝 Name& operator=(Name &obj1) { //1.先释放旧的内存 if (this->m_p != nullptr) { delete[] m_p; m_len = 0; } //2.根据 obj1 分配内存大小 this->m_len = obj1.m_len; this->m_p = new char[m_len + 1]; //3.

再议Swift操作符重载

今天我们来谈一谈Swift中的操作 符重载,这一功能非常实用,但是也相当有风险.正所谓“能力越大责任越大”,这句话用来形容操作符重载最合适不过了.它可以令你的代码更加简洁,也可以让 一个函数调用变得又臭又长.而对于那些没怎么读过你的代码的人来说,操作符的使用同时也会让代码的可读性大打折扣. 谨 慎引入,按需使用.比如在连接两个字串的时候你就可以通过重载加法来实现.甚至于你仅在屏幕上输入一个加号,就能响应一个网络链接.播放一段音乐或者完成 你能实现的其他任何功能.然而过于复杂的功能对编码来说简直就

Kotlin操作符重载:把标准操作加入到任何类中(KAD 17)

作者:Antonio Leiva 时间:Mar 21, 2017 原文链接:https://antonioleiva.com/operator-overload-kotlin/ 就像其他每种语言一样,在Kotlin中,已经预定义了一些操作符执行一定的操作. 最典型的是加(+),减(-),乘(*),除(/),而且还有很多. 类似Java这样的一些语言,这些操作符被限制在一些特定的数量类型上,且没有方法让其他类型数据使用这些操作符. 还有在像Scala这样的其他语言中,由于函数名称可接受任何符号,我

c++ --&gt; 操作符重载

一.什么是操作符重载 操作符重载可以分为两部分:“操作符”和“重载”.说到重载想必都不陌生了吧,这是一种编译时多态,重载实际上可以分为函数重载和操作符重载.运算符重载和函数重载的不同之处在于操作符重载重载的一定是操作符.我们不妨先直观的看一下所谓的操作符重载: #include <iostream> using namespace std; int main() { int a = 2 , b = 3; float c = 2.1f , d = 1.2f; cout<<"

Python中的操作符重载

类可以重载python的操作符 操作符重载使我们的对象与内置的一样.__X__的名字的方法是特殊的挂钩(hook),python通过这 种特殊的命名来拦截操作符,以实现重载. python在计算操作符时会自动调用这样的方法,例如: 如果对象继承了__add__方法,当它出现在+表达式中时会调用这个方法.通过重载,用户定义的对 象就像内置的一样. 在类中重载操作符 1.操作符重载使得类能拦截标准的python操作. 2.类可以重载所有的python的表达式操作符. 3.类可以重载对象操作:prin

操作符重载

class Program { int count; public Program() { } public Program(int count) { this.count = count; } static void Main(string[] args) { Program p1 = new Program(16); Program p2 = new Program(16); /** 操作符调用 */ Console.WriteLine(p1 + p2); Console.WriteLine

第二十篇:类操作符重载的相关规定与具体实现示例

前言 有书这么说过,C++设计的最大目的在于允许程序员定义自己的类型,并使它们用起来跟内置类型一样容易和直观.就目前看来,要实现这一点,最核心的莫过于操作符的重载.科学的重载可以让类的使用最大程度地接近内置类型.本文将讨论类操作符重载涉及到的一些原则和具体做法. 实现类操作符重载的两种思路 1. 友元函数法: 将待重载操作符视作非成员函数( 它声明为操作数类型的友元函数 ) 应当采用这种机制重载的运算符有:IO操作符,算数操作符,关系操作符. 2. 成员函数法: 将待重载操作符视作特殊的成员函数

拷贝构造函数 和 赋值操作符重载

什么时候需要定义自己的拷贝构造函数: 当类中包含有,动态分配成员 或者 指针 的时候. 如果使用默认构造函数,则新构造出来的 新类 和 旧类 里面的指针成员 指向同一个空间, 而当其中一个类 清空掉那个空间 .另一个类的指针就会变成野指针(因为空间已经被清空) , 也就是说默认构造函数是复制值(地址也是值) ps.基本数据类型的数组可以直接使用默认复制构造函数.也就是说有涉及到 自行开辟额外空间 的数据类型 和 指针 的类就需要 什么时候调用拷贝构造函数: 1.一个对象以 值传递 的方式 传入