`
weihe6666
  • 浏览: 441701 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Operator=

    博客分类:
  • C++
C++ 
阅读更多
Operator=


赋值构造函数,问题1:为何返回类型是类,即return *this;
                     问题2:为何要对自身判断,怎么判断以防止赋值给自己?
                     问题3:自己定义赋值构造函数,要对那些数据赋值?

带着这些问题,看看下面的例子:

问题1:为何返回类型是类,即return *this;

#include <iostream>
using namespace std;

class String {
public:
	String();
	String(const char *value);    // 函数定义参见条款11
	~String();                    // 函数定义参见条款11
    
	void operator=(const String& rhs);
	void Print() const;

private:
	char *data;
};

String::String( const char *value )
{
	if (value) {
		data = new char[strlen(value) + 1];
		strcpy(data, value);
	}
	else {
		data = new char[1];
		*data = '\0';
	}

}

String::String()
{
	data = new char[1];
   *data = '\0';
}


String::~String()
{
 //delete [] data;
}



void String::operator=( const String& rhs )
{
	delete [] data;
	//allocate new memory 
	data = new char[sizeof(rhs.data)+1];
	strcpy(data,rhs.data);

	//return *this;
}

void String::Print() const
{
	cout << "The content is :" << data << endl;
}


int main()
{
	String a = "hello";
	String b = "world";
	String c = "hewei";
	a.Print();
	c = b = a;
	b.Print();
	return 0;
}


这个例子可以通过编译,但是不能运行,原因何在?

此赋值构造函数为:
void operator=(const String& rhs);
注意返回类型为void,那么c = b = a;就会出错。

因为c = b = a;等价于c.operator=(b.operator=(a.operator=("hello"))); operator=结合性由右向左,a.operator=("hello")结果是:a.data = "hello";但是a.operator=("hello")经过赋值构造函数后并没有返回值,就无法在继续赋值给b。

因此赋值构造函数必需有返回值,且返回值为类本身的引用。

其正确的赋值构造函数写法如下:
String& operator=(const String& rhs);
String& String::operator=( const String& rhs )
{
	if(this == &rhs)
		return *this;
  delete [] data;
  //allocate new memory 
  data = new char[sizeof(rhs.data)+1];
  strcpy(data,rhs.data);

  return *this;
}


问题2:为何要对自身判断,怎么判断以防止赋值给自己?

上面的例子:若赋值构造函数为:
String& operator=(const String& rhs);
String& String::operator=( const String& rhs )
{
	//if(this == &rhs)
	//	return *this;
  delete [] data;
  //allocate new memory 
  data = new char[sizeof(rhs.data)+1];
  strcpy(data,rhs.data);

  return *this;
}


当执行到语句:a = a;就会出现问题:
*this  data ------------> "hello\0"
                  /
                 /
rhs    data -----

赋值运算符做的第一件事是用delete删除data,其结果将如下所示:

*this  data ------------> ???
                   /
                  /
rhs    data -----

现在,当赋值运算符对rhs.data调用strlen时,结果将无法确定。这是因为data被

删除的时候rhs.data也被删除了,data,this->data 和rhs.data 其实都是同一个

指针!从这一点看,情况只会越变越糟糕。

现在可以知道,解决问题的方案是对可能发生的自己给自己赋值的情况先进行检查

,如果有这种情况就立即返回.

问题是如何判断两个对象“相同”??

确定对象身份是否相同的方法是用内存地址。采用这个定义,两个对象当且

仅当它们具有相同的地址时才是相同的。这个定义在c++程序中运用更广泛,可能

是因为它很容易实现而且计算很快。

其判断形势为:
if(this == &rhs)
return *this;

问题3:自己定义赋值构造函数,要对那些数据赋值?


分享到:
评论

相关推荐

    为什么operator=操作符返回引用.docx

    在C++编程语言中,`operator=`操作符用于对象之间的赋值。这个操作符的返回类型通常是类类型的引用,这是为了支持链式赋值(chaining assignment)和保持与原始对象的连接。以下是对`operator=`操作符返回引用的详细...

    operator=赋值检测学习

    在C++编程语言中,`operator=`是用于对象赋值操作的关键字,它定义了对象间的赋值行为。这个操作符通常被称为赋值运算符,是C++中的一个重载运算符,允许我们自定义对象如何被赋值。在本学习资源中,你将深入理解`...

    解析c++中的默认operator=操作的详解

    在c++中,如果没有定义operator=操作,编译器会提供一个默认的operator=操作。由于operator=操作和拷贝构造函数的功能类似,都执行拷贝操作。因此,编译器也分提供无用的默认operator=操作和非无用的默认operator=...

    如何继承“ operator =”

    在C++编程语言中,`operator=` 是一个特殊操作符,用于对象的赋值。它在类的设计中扮演着重要角色,特别是在实现深复制或浅复制策略时。当我们谈论“继承`operator=`”时,实际上是指在派生类中如何处理基类的赋值...

    浅谈C++虚重载操作符 virtual operator= 的使用方法

    通常,赋值操作符`operator=`用于对象间的赋值,但当涉及到基类和派生类的关系时,非虚的`operator=`只能做到静态绑定,即根据指针或引用的静态类型调用相应的函数。而虚赋值操作符则能够实现动态绑定,使得即使通过...

    boilerplate.dart:轻松实现示例方法的Dart助手(hashCode,operator ==,toString)

    // .toString, .hashCode, .operator== final List&lt;int&gt; js; // and copy({ i, js }) Foo ( this . i , this . js ); // with no extra effort.}var foo = new Foo ( 1 , [ 2 , 3 ]);assert(foo == new Foo ( 1 , ...

    分数计算器

    bool operator==(int n,Fraction &c); bool operator==(Fraction &c,Fraction &f); bool operator!=(Fraction &c,Fraction &f); bool operator!=(int n,Fraction &c); bool operator&lt;=(Fraction &c,Fraction &f); ...

    C++ 模板写的短小字符串类,用于替换字符数组和std::string

    friend std::ostream & operator(std::ostream& os, const TinyString&lt;K&gt;& str); template, size_t L&gt; friend bool operator == (const TinyString&lt;K&gt;& s1, const TinyString&lt;L&gt;& s2); //...... uint8...

    Python程序基础:列表和元组典型案例.pptx

    if operator not in operator_list: #输入的运算符不是四则运算符 print("输入的运算符有误,请输入四则运算符!") #输出提示语 else: #输入的运算符属于四则运算符 if operator == '+': #运算符为“+” result = ...

    [大学经典课堂课件]C++课件-面向对象高级编程第二部分.pptx

    在本节课中,我们将探讨C++面向对象高级编程的相关知识点,着重于operator=的实现和自我赋值检测。 _operator=的实现 在C++中,operator=是赋值操作符,它用于将一个对象的值赋给另一个对象。在上面的代码中,我们...

    MFC中使用自定义CObject派生类重载“=”“==”操作符 errorC2248 errorC2678

    近期编程想用CList维护一个对象,来方便的实现增,删,改,查,里面要放多个元素,想实现这种,就要自己写结构体,或是类。类的话就让他派生自CObject吧,然后接下来会遇到两个问题,我在这里整理一下我在网上寻求的...

    高精度类(无压位),C++,基本可以像基本类型一样使用

    operator=:赋值,支持的类型和构造函数一样(除去void) operator+、-、*、/、%:五则运算 operator+=、-=、*=、/=:五则运算加上赋值 operator&gt;&gt;:输入,用于cin &gt;&gt; xxx operator输出,cout operator==,!=,&gt;,...

    c++语言实现一个简单的计算器程序

    } else if (operator == '√' || operator == 's' || operator == 'sqrt') { // 开平方根,需要保证非负数 if (num1 &gt;= 0) { result = std::sqrt(num1); } else { std::cout ; } } else { std::cout ...

    Java计算器,实现简单的数学计算

    char operator = input.next().charAt(0); // 获取运算符 double num2 = input.nextDouble(); ``` 然后,我们根据运算符进行相应的计算。这里可以使用条件判断语句(`if-else`结构)来实现: ```java double ...

    python-编程实例.docx

    operator = input('Enter the operator (+, -, *, /): ') result = calculator(num1, num2, operator) print('Result: ', result) ``` 这段代码首先接收用户输入的两个数字和运算符,然后将这些输入转换为浮点数以...

    ORM-Dapper+DapperExtensions 示例全代码

    var pgMain = new PredicateGroup { Operator = GroupOperator.Or, Predicates = new List() }; var pga = new PredicateGroup() { Operator = GroupOperator.And, Predicates = new List() }; pga.Predicates....

    等号操作符使用陷阱实例

    上述代码中,`operator==`重载了等号操作符,使得我们可以像比较基本类型一样比较自定义类的对象。 4. **浅拷贝与深拷贝**:在C++中,当一个对象被赋值给另一个对象(使用`= `操作符),默认情况下是浅拷贝,这...

    用java写的凯撒加密器源码

    int operator = input.nextInt(); if(operator == 1){ System.out.print("请输入待加密的字符串:"); String source = input.next(); Encryption encryption = new Encryption(); String encrytStr ...

Global site tag (gtag.js) - Google Analytics