C++学习31 重载=(赋值运算符)
和普通变量一样,对象之间也可以相互赋值。赋值运算符“=”可以用来将一个对象拷贝给另一个已经存在的对象。对象之间的赋值是将成员变量依次拷贝,而不是将整个对象的内存按位拷贝。
对象之间的赋值:
#include <iostream>
using namespace std;
class Demo{
private:
int a;
int b;
public:
Demo(): a(), b(){ }
Demo(int a, int b): a(a), b(b){ }
void display(){ cout<<a<<", "<<b<<endl; }
};
int main(){
Demo obj1, obj2(, );
obj1 = obj2; //对象之间的赋值
obj1.display();
return ;
}
一般情况下,默认的“=”就能满足我们的需求,但是当一个类中包含指针类型的成员变量时,可能会带来问题。请看下面的代码:
#include <iostream>
using namespace std;
class Book{
private:
double price; //书的价格
int *bookmark; //书签
int num; //书签的数量
public:
Book(): price(0.0), bookmark(NULL), num(){}
Book(double, int*, int);
void setBookmark(int, int); //修改书签
void display();
};
Book::Book(double price, int *bm, int num): price(price), num(num){
int *bmTemp = new int[num];
for(int i=; i<num; i++){
bmTemp[i] = bm[i];
}
this->bookmark = bmTemp;
}
void Book::setBookmark(int page, int index){
if(index>=num-){
cout<<"Out of bound!"<<endl;
}else{
bookmark[index] = page;
}
}
void Book::display(){
cout<<"price: "<<price<<endl;
cout<<"bookmarks: ";
for(int i=; i<num; i++){
if(i==num-){
cout<<bookmark[i]<<endl;
}else{
cout<<bookmark[i]<<", ";
}
}
}
int main(){
int bookmark[] = { , , , };
Book java, cpp(68.5, bookmark, );
cpp.display();
java = cpp; //对象之间赋值
java.setBookmark(, );
cpp.display();
return ;
}
这段代码定义了一个 Book 类,表示一本书,书有价格,也有书签。书签是我们所标记的页码,这些页码中往往包含重要的知识点,记录下这些页码能够方便以后查阅。书签可以有多个,所以需要将它放在 int 型的数组中。setBookmark() 函数用来修改某个书签,display() 函数用来展示书签和价格。
Book 类的构造函数中不是直接接收参数的值,而是根据参数所指向的数组,再创建一个新的数组。这样做的好处是对象有属于自己的数组,在其他地方修改实参所指向的数组不会影响该数组,能够很好的隔离。
在 main() 函数中,我们创建了两个对象 java 和 cpp,并用 cpp 给 java 赋值。两次调用 display() 的结果不同表明,调用 java 对象的 setBookmark( ) 函数影响到了 cpp 对象。这是因为,执行java = cpp;
语句时会将 cpp.bookmark 的值复制给 java.bookmark,不同对象的成员变量指向同一个数组,当然会相互影响。
要解决这个问题,就需要重载赋值运算符,如下所示:
Book & Book::operator=(const Book &b){
if( this != &b){
this->price = b.price;
this->num = b.num;
//为bookmark赋值
int *bmTemp = new int[b.num];
for(int i=; i<b.num; i++){
bmTemp[i] = b.bookmark[i];
}
this->bookmark = bmTemp;
}
return *this;
}
将这个函数放入 Book 类中,再执行java = cpp;
语句时,会转换为:
java.operator=(cpp);
在函数体中,this 就指向 java 对象。这样 java 对象也会拥有属于自己的数组,两个对象之间不会再相会影响。
可以发现,重载赋值运算符时,函数的参数和返回值类型都必须是对象的引用。以 Book 类为例来说,赋值运算符重载函数一般有两种原型:
Book & operator=( Book &b );
Book & operator=( const Book &b );
返回值和参数都是 Book 类对象的引用。下面一种原型则规定在赋值时不能修改原来的对象。
赋值运算符重载函数除了能有对象引用这样的参数之外,也能有其它参数。但是其它参数必须给出默认值。如下所示:
Book & operator=(const Book &b, a = );
C++学习31 重载=(赋值运算符)的更多相关文章
- 重载赋值运算符 && 对象
class CMessage { private: char * m_pMessage; public: void showIt()const { cout << m_pMessage & ...
- mfc 重载赋值运算符
重载赋值运算符= 一.重载运算符格式 返回类型 operator 运算符 (参数); 如: bool operator=(char*s); int operator>(char*s); bool ...
- 《剑指offer》第一题(重载赋值运算符)
//重载赋值运算符 #include <iostream> #include <cstring> using namespace std; class CMystring { ...
- 《挑战30天C++入门极限》C++运算符重载赋值运算符
C++运算符重载赋值运算符 自定义类的赋值运算符重载函数的作用与内置赋值运算符的作用类似,但是要要注意的是,它与拷贝构造函数与析构函数一样,要注意深拷贝浅拷贝的问题,在没有深拷贝浅拷贝的情况下 ...
- JDBC的学习 3-1
JDBC的学习 3-1 JDBC基本概念 快速入门 对JDBC中各个接口和类详解 JDBC : 概念 :Java DateBase Connectivity java数据库连接,Java语言操作数据库 ...
- 07-java学习-方法重载-idea集成开发工具学习-项目-模块-包
方法重载的概念? 方法重载的好处? 集成开发工具idea的学习 下载 安装 设置 建项目 导入项目 建模块 导入模块 建包 复制粘贴包 建类 复制粘贴类 运行 调试
- C++学习之重载、覆盖与隐藏
MaiziTest12.cpp : 定义控制台应用程序的入口点. 1.重载特征 1)相同的范围(在同一个类中): 2)函数名相同: 3)参数不同: 4)virtual关键字可有可无. 2.覆盖 指的是 ...
- c++学习-运算符重载
重载=号运算符,由于成员属性中有指针会出现错误 #include <iostream> using namespace std; class num{ public: num(){n=;c ...
- C++学习32 重载new和delete运算符
内存管理运算符 new.new[].delete 和 delete[] 也可以进行重载,其重载形式既可以是类的成员函数,也可以是全局函数.一般情况下,内建的内存管理运算符就够用了,只有在需要自己管理内 ...
随机推荐
- SpringMVC常用注解,返回方式,路径匹配形式,验证
常用注解元素 @Controller 标注在Bean的类定义处 @RequestMapping 真正让Bean具备 Spring MVC Controller 功能的是 @RequestMapping ...
- 未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项
Win7 64位 IIS未能加载文件或程序集"System.Data.SQLite"或它的某一个依赖项 未能加载文件或程序集"System.Data.SQLite&quo ...
- unity, animtion倒放
AnimationState.speed Description The playback speed of the animation. 1 is normal playback speed. A ...
- Android视录视频示例
这几天需要搞一个Android视频通话功能,从最简单的视频录制开始,网上例子大多不完整.下面的示例参考过别人的代码,还是拿出来给需要的朋友分享下. Activity类:VideoActivity pa ...
- maven时候Embedded error: error in opening zip file
maven时候Embedded error: error in opening zip file 用 mvn clean install -Dmaven.test.skip=true -Denv=re ...
- 深入理解ThreadLocal
ThreadLocal是什么 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地 ...
- 详解@Autowired、@Qualifier和@Required
A.@Autowired org.springframework.beans.factory.annotation.Autowired public @interface Autowired Mark ...
- javascript util.js
//根据Id获得页面元素 function $(para) { return document.getElementById(para);} //创建一个新的元素function createE ...
- ubuntu 创建快捷方式
sudo ln -s /opt/eclipse/eclipse /usr/bin/eclipse 这样就可以在命令行中敲:eclipse,来打开eclipse了. 应该还有一种方式,就像快捷方式一样. ...
- JSP--监听HTTP会话
来源: <http://www.cnblogs.com/eflylab/archive/2007/01/16/621953.html> ServletListener 之 监听HTTP会话 ...