C++学习基础六——复制构造函数和赋值操作符
2016-09-06 23:27
267 查看
1.什么是复制构造函数
复制构造函数:是构造函数,其只有一个参数,参数类型是所属类的类型,且参数是一个const引用。
作用:将本类的成员变量赋值为引用形参的成员变量。
2.什么是赋值操作符
赋值操作符:返回值是本类的引用类型,参数类型是所属类的类型,且参数是一个const引用。
作用与复制构造函数相同。
其声明如下:
Sales_item& operator=(const Sales_item& rig);
3.什么情况下需要我们自己实现复制构造函数和赋值操作符?
一般情况下,C++会帮助我们实现复制构造函数和赋值操作符,但是当我们定义的类的成员变量中包含指针时,必须自己实现复制构造函数和赋值操作符,同时也要实现析构函数。
4.代码如下:
(1)自定义Sales_item类,实现了构造函数,析构函数,复制构造函数和赋值操作符。
(2)主方法:
5.带有指针成员变量的自定义类:
6.总结复制构造函数和赋值操作符
复制构造函数:是指将构造函数的参数一一给本类的对象的赋值,对于指针而言,不是指针的赋值,而是指针所指向的数据的赋值。
具体代码如下:
7.析构函数三原则:
如果写了析构函数,则同时必须写复制构造函数和赋值操作符。
复制构造函数:是构造函数,其只有一个参数,参数类型是所属类的类型,且参数是一个const引用。
作用:将本类的成员变量赋值为引用形参的成员变量。
2.什么是赋值操作符
赋值操作符:返回值是本类的引用类型,参数类型是所属类的类型,且参数是一个const引用。
作用与复制构造函数相同。
其声明如下:
Sales_item& operator=(const Sales_item& rig);
3.什么情况下需要我们自己实现复制构造函数和赋值操作符?
一般情况下,C++会帮助我们实现复制构造函数和赋值操作符,但是当我们定义的类的成员变量中包含指针时,必须自己实现复制构造函数和赋值操作符,同时也要实现析构函数。
4.代码如下:
(1)自定义Sales_item类,实现了构造函数,析构函数,复制构造函数和赋值操作符。
#include <iostream> #include <string> using namespace std; class Sales_item { public: Sales_item() { this->number = 0; this->acount = 0.0; } Sales_item(const string &isbnstr) { this->isbn = isbnstr; this->number = 0; this->acount = 0.0; } //复制构造函数:如果自己不写,C++会默认提供一个 //复制构造函数:只接收一个参数 ,参数的类型是当前类,并且是一个const的引用 //作用:是将形参的数据成员一一赋给当前的数据成员 Sales_item(const Sales_item& other) { isbn = other.isbn; number = other.number; acount = other.acount; cout<<"复制构造函数被调用...."<<endl; } //赋值操作符:如果自己不写,C++会默认提供一个 //返回值是本类的引用,接收一个参数,参数的类型是当前类,并且是一个const的引用 Sales_item& operator= (const Sales_item &other) { isbn = other.isbn; number = other.number; acount = other.acount; cout<<"赋值操作符 被调用...."<<endl; return *this; } //一般情况下,C++会帮我们实现 复制构造函数和赋值操作符 //但是当一个类的数据成员有指针的时候,我们必须自己实现复制构造函数和赋值操作符 private: string isbn; int number; double acount; };
(2)主方法:
int main() { Sales_item a; Sales_item b("0-12-djf-X"); Sales_item c(b); //调用复制构造函数 a = b; //调用赋值操作符 return 0; }
5.带有指针成员变量的自定义类:
class NoName { public : NoName() { sPtr = new string; number = 0; } ~NoName() { delete sPtr; } //复制构造函数 NoName(const NoName& str) { sPtr = new string; *sPtr = *(str.sPtr);//注意:进行的是指针所指向值的赋值,而不是指针的重新赋值 number = str.number; } //赋值操作符 NoName& operator=(const NoName &rig) { sPtr = new string; *sPtr = *(rig.sPtr);//注意:进行的是指针所指向值的赋值,而不是指针的重新赋值 number = rig.number; return *this; } private: string *sPtr; int number; };
6.总结复制构造函数和赋值操作符
复制构造函数:是指将构造函数的参数一一给本类的对象的赋值,对于指针而言,不是指针的赋值,而是指针所指向的数据的赋值。
具体代码如下:
class NoName{ private: string *str; int i; double b; }; NoName(const NoName &other) { str = new string; 10 *str = *(other.str); i = other.i; b = other.b; }
赋值操作符: 函数声明
NoName& operator=(const NoName &rig); NoName& operator=(const NoName &rig) {//内容跟复制构造函数的一样 str = new string; *str = *(rig.str); i = rig.i; b = rig.b; return *this; }
7.析构函数三原则:
如果写了析构函数,则同时必须写复制构造函数和赋值操作符。
相关文章推荐
- 【C\C++学习】之十八、C++11六大函数(构造函数,移动构造函数,移动赋值操作符,复制构造函数,赋值操作符,析构函数)
- C++学习笔记49——继承中的复制构造函数与赋值操作符
- C++中自定义类禁止使用复制构造函数和赋值操作符
- c++ primer 学习笔记:复制控制之赋值操作符
- C++语法基础--复制控制--复制构造函数 ,赋值操作符 ,析构函数
- C++技术感想 -- 禁止类的复制构造函数和赋值操作符的使用
- C++学习基础八——重载输入和输出操作符
- C++学习(3)--基础知识(3)--关于操作符的重载
- C++学习笔记-类5-浅拷贝和深拷贝以及赋值操作符的重载
- [C++]复制构造函数、赋值操作符与隐式类类型转换
- Effective C++ 学习笔记:为含指针变量的类声明一个拷贝构造函数和一个赋值操作符
- 我的学习笔记——c++拷贝构造函数,重载赋值操作符
- C++基础学习笔记(1):C++中的操作符
- C++基础系列:深拷贝浅拷贝函数与拷贝赋值操作符
- [More Effective C++ 学习笔记]基础议题和操作符
- C++语法基础--派生类的构造函数,赋值操作符,析构函数,虚析构函数
- 一个实例介绍C++复制控制(有一个C++11新特性要注意)——复制构造函数、赋值操作符、析构函数
- C++ 复制构造函数和赋值操作符
- C++最基础的都忘记了,重新学习!!!
- java基础学习笔记原始类型变量赋值与非原始变量赋值